Linux上使用FFmpeg进行录音功能
使用的发行版123456➜ ~ lsb_release -aNo LSB modules are available.Distributor ID: LinuxmintDescription: Linux Mint 22Release: 22Codename: wilma创建一个Qt项目创建名称为audio的Qt项目下载FFmpeg我们下载共享库版本的FFmpeg下载链接解压缩FFmepg下载解压缩后放在和前面创建的Qt项目在一个同级别路径下修改Qt项目文件修改Qt项目文件CmakeLists.txt引入头文件和库,添加内容如下12345678910# 设置变量set(ffmpeg444 ../ffmpeg444)# 引入头文件目录include_directories(${ffmpeg444}/include/)# 引入库文件目录,注意link_directories要放在add_executable之前link_directories(${ffmpeg444}/lib/)# 链接库中添加avdevice avutil avformattarget_link_libraries(audio PRIVATE Qt${QT_VERSION_MAJOR}::Widgets avdevice avutil avformat)添加一个开始录音的按钮注册设备设备只需要注册一次因为我们在main.cpp文件中添加1234567891011121314151617#include mainwindow.h#include QApplicationexternC{// 设备相关#include libavdevice/avdevice.h}intmain(intargc,char*argv[]){// 注册设备,程序整个运行过程只需要注册一次avdevice_register_all();QApplication a(argc, argv);MainWindow w;w.show();returna.exec();}开始录音查看系统上的音频输入设备查看下所有设备12345678910111213➜ ~ ffmpeg -hide_banner -devicesDevices:D. Demuxing supported.E Muxing supported--DE fbdev Linux framebufferD kmsgrab KMSscreencaptureD lavfi Libavfilter virtual input deviceDE oss OSS (Open Sound System) playbackDE pulse Pulse audio outputE sdl,sdl2 SDL2 output deviceDE video4linux2,v4l2 Video4Linux2 output deviceD x11grab X11screencapture, using XCB我们可以使用arecord -l查看下系统上的音频硬件设备1234567891011121314151617➜ arecord -l**** List of CAPTURE Hardware Devices ****card 0: K66 [K66], device 0: USB Audio [USB Audio]Subdevices: 1/1Subdevice#0: subdevice #0card 1: Device [USB Audio Device], device 0: USB Audio [USB Audio]Subdevices: 1/1Subdevice#0: subdevice #0card 2: PCH [HDA Intel PCH], device 0: ALC897 Analog [ALC897 Analog]Subdevices: 1/1Subdevice#0: subdevice #0card 2: PCH [HDA Intel PCH], device 2: ALC897 Alt Analog [ALC897 Alt Analog]Subdevices: 1/1Subdevice#0: subdevice #0card 4: Camera [USB 2.0 Camera], device 0: USB Audio [USB Audio]Subdevices: 1/1Subdevice#0: subdevice #0录音按钮点击相关代码, 修改mainwindow.cpp文件内容如下12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182#include mainwindow.h#include ./ui_mainwindow.h#include QDebug#include QFileexternC{#include libavdevice/avdevice.h#include libavformat/avformat.h#include libavutil/avutil.h}#define BUF_SIZE 1024MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(newUi::MainWindow){ui-setupUi(this);}MainWindow::~MainWindow(){deleteui;}voidMainWindow::on_audioButton_clicked(){constchar* fmtName pulse;//设置输入设备格式名称// 获取输入格式对象AVInputFormat *fmt av_find_input_format(fmtName);if(!fmt) {qDebug() 获取输入格式对象失败 fmtName;return;}AVFormatContext *ctx nullptr;// 打开的设备上下文对象可以利用这个上下文对象来操作设备// 设备名称可以使用 arecord -l查看设备constchar* deviceName hw:0;// 使用card 0, arecord -l命令列出的第一个设备AVDictionary* options nullptr;// 选项// 利用输入格式对象打开设备intret avformat_open_input(ctx, deviceName, fmt, options);if(ret 0) {charerrbuf[BUF_SIZE] {0};// av_strerror获取错误原因av_strerror(ret, errbuf, BUF_SIZE);qDebug() 打开设备失败 errbuf;return;}// 录音保存的文件constchar* fileName out.pcm;// 采集的数据是原始pcm数据QFile file(fileName);// 打开文件// WriteOnly: 只写模式如果文件不存在则创建文件。如果文件存在则清空文件内容if(!file.open(QIODevice::WriteOnly)) {qDebug() 文件打开失败 fileName;avformat_close_input(ctx);// 关闭设备return;}// 开始采集数据intcount 50;// 采集数据的次数AVPacket pkt;// 数据包while(count-- 0 av_read_frame(ctx, pkt) 0) {// 一直采集数据当为0时说明数据采集成功了// 将数据写入文件file.write((constchar*)pkt.data, pkt.size);}// 释放资源file.close();// 关闭文件avformat_close_input(ctx);// 关闭设备}关于设备部分我们可以使用条件编译1234567891011121314#ifdef Q_OS_LINUXconstchar* fmtName pulse;//设置输入设备格式名称#elif Q_OS_WINconstchar* fmtName dshow;//设置输入设备格式名称#endif#ifdef Q_OS_LINUX// 设备名称可以使用 arecord -l查看设备constchar* deviceName hw:0;#elif Q_OS_WINconstchar* deviceName audio麦克风 (K66);#endif开始录音点击开始录音稍等一会儿发现二进制程序目录下多了一个out.pcm我们录制的音频文件播放我们可以使用ffplay播放我们刚才录制的pcm音频数据查看PCM的格式使用ffmpeg -hide_banner -formats我们可以输出所有的格式12345678910111213141516171819202122➜ ~ ffmpeg -hide_banner -formats |grepPCMDE alaw PCM A-lawDE f32be PCM 32-bit floating-point big-endianDE f32le PCM 32-bit floating-point little-endianDE f64be PCM 64-bit floating-point big-endianDE f64le PCM 64-bit floating-point little-endianDE mulaw PCM mu-lawDE s16be PCM signed 16-bit big-endianDE s16le PCM signed 16-bit little-endianDE s24be PCM signed 24-bit big-endianDE s24le PCM signed 24-bit little-endianDE s32be PCM signed 32-bit big-endianDE s32le PCM signed 32-bit little-endianDE s8 PCM signed 8-bitDE u16be PCM unsigned 16-bit big-endianDE u16le PCM unsigned 16-bit little-endianDE u24be PCM unsigned 24-bit big-endianDE u24le PCM unsigned 24-bit little-endianDE u32be PCM unsigned 32-bit big-endianDE u32le PCM unsigned 32-bit little-endianDE u8 PCM unsigned 8-bitDE vidc PCM Archimedes VIDC播放-ar 指定采样率-ac 指定声道数-f 指定音频格式 s16le表示有符号的16位小端模式1ffplay -ar 44100 -ac 2 -f s16le out.pcm以上就是Linux上使用FFmpeg进行录音功能的详细内容