ffmpeg就不解释了,太多资料了,著名的开源做音视频的库
学些录制的动力是目前所在公司使用OBS录屏存在一些问题,录制窗口有些显卡会黑屏,录制屏幕会把电脑的其他软件也会录制进去,理想的录制方式是组合录制方式,把想录制的录制进去,不像录制的去掉。比如一个软件中有多个窗口,只想录制其中一些。希望后续能成功立一个flag。
ffmpeg使用的方式有两种,一种是命令模式,一种是api模式,要实现我想要录制应该是api模式能实现,这里我先使用命令实现录制,了解一下录制原理。为了方便依旧使用qt来实现。使用QProcess来实现,不直接使用命令行。
录制桌面有两种方式,第一种是screen-capture-recorder插件使用dshow,需要安装此插件。第二种使用gdigrab来抓取desktop。这里先安装screen-capture-recorder插件来抓取。screen-capture-recorder经过我的实践只能抓取主屏,扩展屏抓取不了。gdigrab则可以抓取任意部分。
本次实现使用screen-capture-recorder插件来录制。
screen-capture-recorder直接百度搜索下载然后安装。
然后执行一下命令:
ffmpeg -list_devices true -f dshow -i dummy
如果成功输出信息会包含:

1.主框架搭建
使用Qt新建立一个ScreenRecorder工程,创建一个抽象类Record,抽象录制的几个基本接口如下(因为后面还要实现api的方式):
virtual void startRecord() = 0;//开始录制
virtual void pauseRecord() = 0;//暂停录制
virtual void stopRecord() = 0;//停止录制
virtual void restoreRecord() = 0;//恢复录制
创建一个FFmpegCommandRecord 继承自Record,并实现相关抽象函数。
MainWindow界面实现如下:
实现相关信号和槽函数的链接。我们这里使用ffmpeg.exe 来录制并不需要把库引入,只需要把ffmpeg的库以及exe拷贝到qt工程的运行目录。
1.startRecord实现
首先我们创建一个录制进程m_pRecordProcess = new QProcess(this);
然后配置相关参数如下(实际应用中这些参数应该通过接口传递,这里只是demo就写死了):
m_videoDirverName = "dshow";
args << "-f" << m_videoDirverName;
args << "-f" << m_audioDirverName;
args << "-i" << m_audioName;
args << "-pix_fmt" << "yuv420p";
args << "-vcodec" << "libx264";
args << "-acodec" << "aac";
args << "-draw_mouse" << "1";
args << "-s" << QString::number(m_videoSize.width()) + "x" + QString::number(m_videoSize.height());
args << "-r" << QString::number(m_nFps);
args << "-q" << "10";
args << "-ar" << "44100";
args << "-ac" << "2";
args << "-tune" << "zerolatency";
args << "-preset" << "ultrafast";
args << "-f" << "mp4";
参数主要是对视频格式,音频格式,帧率,分辨率,编码, 使用的设备, 录制文件的格式,路径等进行设置。
然后使用参数启动录制进程:
QString tmpFilePath = QString("v%1_tmp").arg(QDateTime::currentDateTime().toMSecsSinceEpoch());
QTextStream out(m_pConcatFile);
out << "file" << " '" << tmpFilePath << "'\n";
QString tmpFileAbsolutePath = m_cacheDir + "/"+ tmpFilePath;
args << tmpFileAbsolutePath;
m_currentRecordTempFiles<<tmpFileAbsolutePath;
m_currentRecordTempFiles<<tmpFileAbsolutePath.replace("_tmp", ".mp4");
m_pRecordProcess->start("ffmpeg", args);
2.stopRecord实现
m_pRecordProcess->write("q");停止录制实际就是停止该进程.
3. 录制
m_pRecord->setFps(15);
//m_pRecord->setVideoDeviceName("video=screen-capture-recorder");
// m_pRecord->setVideoDeviceName("video=Integrated Webcam");
m_pRecord->setVideoDeviceName("title=Qt Creator");
//m_pRecord->setVideoDeviceName("desktop");
m_pRecord->setAudioDeviceName("audio="+ui->comboBox_audio->currentText());
m_pRecord->setRecordRect(QRect(1366, 0, 1080, 768));
m_pRecord->setVideoSize(QSize(1080, 768));
这样我们就可以录制桌面了,在这里我只实现了开始和停止,还未实现暂停,暂停录制恢复录制。因为恢复录制设计多个视频拼接,下一节将实现多个视频录制。
注意一定要安装screen-capture-recorder和将ffmpeg库和exe拷贝到程序的运行目录。源码如需要在最后奉上。

本文介绍了如何利用FFmpeg在Qt环境中实现桌面录制。作者首先提及了当前公司使用OBS录屏存在的问题,然后详细阐述了FFmpeg的两种使用方式:命令模式和API模式,并决定先通过命令模式进行实现。通过QProcess类调用FFmpeg命令行工具,结合screen-capture-recorder插件捕获桌面。具体步骤包括配置录制参数、启动和停止录制进程。源码示例中展示了如何设置帧率、分辨率、编码等参数,并强调了需要安装screen-capture-recorder插件和将FFmpeg库及exe复制到运行目录。
2221

被折叠的 条评论
为什么被折叠?



