Qt+FFmpeg录屏

欢迎加QQ学习交流群309798848

源码: https://github.com/onlyet/ScreenCapture

NanaRecorder

之前的录屏项目ScreenCapture存在音视频同步问题,所以重写了第二个版本:NanaRecorder。
录制桌面和系统声音(扬声器)。

录制流程


主线程:UI线程,调用Recorder接口
采集线程:采集到帧后->格式转换/重采样->写进FIFO
编码线程:循环从FIFO读取帧->编码->写进文件

环境依赖

  • VS2019
  • Qt5.12.9 
  • FFmpeg4.1

UI


### 使用 QtFFmpeg 实现制功能 要在Qt中调用FFmpeg库进行制,可以利用`QProcess`类来执行FFmpeg命令。这允许应用程序启动外部程序并与其通信。 #### 创建 `ScreenRecorder` 类 为了更好地管理制过程,建议创建一个名为`ScreenRecorder`的类,该类负责处理幕捕捉和编码逻辑[^2]。 ```cpp class ScreenRecorder : public QObject { Q_OBJECT public: explicit ScreenRecorder(QObject *parent = nullptr); void startRecording(const QString &outputFile); private slots: void onReadyReadStandardOutput(); void onFinished(int exitCode, QProcess::ExitStatus exitStatus); private: QProcess m_ffmpegProcess; }; ``` 此代码片段定义了`ScreenRecorder`类及其成员函数和槽。其中包含了用于运行FFmpeg进程的对象`m_ffmpegProcess`。 #### 初始化与配置 FFMPEG 进程 在构造函数内部初始化FFmpeg进程,并设置其工作环境: ```cpp ScreenRecorder::ScreenRecorder(QObject *parent) : QObject(parent), m_ffmpegProcess(this) { connect(&m_ffmpegProcess, SIGNAL(readyReadStandardOutput()), this, SLOT(onReadyReadStandardOutput())); connect(&m_ffmpegProcess, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(onFinished(int,QProcess::ExitStatus))); } ``` 这里设置了两个信号-槽连接,分别用来监听标准输出以及进程结束事件。 #### 开始制操作 当准备好开始制时,可以通过如下方式启动FFmpeg命令: ```cpp void ScreenRecorder::startRecording(const QString &outputFile) { QStringList arguments; #ifdef Q_OS_WIN // Windows平台下的参数设定 arguments << "-f" << "gdigrab" << "-i" << "desktop"; #else // Linux/MacOSX平台下可能使用的参数 arguments << "-f" << "x11grab" << "-s" << "hd720" << "-r" << "25" << "-i" << ":0.0+10,20"; // 幕坐标偏移量可根据实际情况调整 #endif arguments << outputFile; m_ffmpegProcess.start("ffmpeg", arguments); } ``` 上述方法构建了一组适用于不同操作系统平台的具体参数列表,并最终通过`start()`方法启动FFmpeg进程来进行实际的制活动[^1]。 #### 处理输出数据及完成状态 对于来自FFmpeg的标准输出信息以及其他任何错误消息,可以在对应的槽内读取并做适当处理;而一旦整个制流程完毕,则会触发另一个槽,在那里可实施进一步的动作比如通知用户或清理资源等。 ```cpp void ScreenRecorder::onReadyReadStandardOutput() { qDebug() << "FFMpeg output:" << m_ffmpegProcess.readAllStandardOutput(); } void ScreenRecorder::onFinished(int /*exitCode*/, QProcess::ExitStatus /*exitStatus*/) { qDebug() << "Recording finished."; } ``` 这些辅助性的回调机制有助于监控正在进行的任务进展状况,并确保即使出现问题也能及时得到反馈。 最后,为了让一切正常运作起来,还需要有一个入口点去实例化`ScreenRecorder`对象并且指定目标文件路径给它以便于开启制动作。这部分通常放在项目的主函数里实现[^4]。
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值