菜鸟学ffmpeg音视频技术之一实现命令录制

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

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拷贝到程序的运行目录。源码如需要在最后奉上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值