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

解决ffmpeg使用screen-capture-recorder录屏,有屏幕缩放的情况下录不全的问题 原因:screen-capture-recorder.dll处理了屏幕缩放的问题,而ffmpeg同样处理了,这导致,如果屏幕有125%的缩放,ffmpeg裁剪一次录屏区域,screen-capture-recorder.dll裁剪一次录屏区域,导致了录不全屏幕的现象出现。 解决方式:去除两次缩放中的一次即可,考虑性价比,我们选择在ffmpeg.exe上禁用高DPI缩放,个人用户可右键→属性→兼容性→更改高DPI设置→替代高DPI缩放行为,而如果想自动给用户设置,可通过bat脚本,集成在自动安装中。 阅读详情

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和Screen Capturer Recorder实现屏幕和声音的录制 当我们看到一些精彩的视频画面,但无法下载时,可以通过录屏的方式将视频和音频录制下来。 这个时候我们需要安装采集视频和音频的工具screen-capture-recorder。 以下是在windows10环境下,基于FFmpeg和Screen Capturer Recorder实现屏幕和声音的同步录制。 阅读详情

相关推荐

ffmpeg中使用screen capture recorder录音的问题

看完本篇文章,可以解决使用ffmpeg录屏时需要的screen capture recorder软件过大问题 在windows下使用ffmpeg 的-gdigrab方法录屏是没有声音的! ffmpeg -f gdigrab -i desktop test.mp4 解决办法就是注册dshow软件 Screen Capturer Recorder的虚拟音频捕捉设备(virtual-audio-cap...

Fandes_F的博客 7927

ffmpeg快速抓屏DXGI技术,基于screen-capture-recorder抓屏的升级screen-capture-dxgi:directshow滤镜,升级为支持dxgi120帧

一、开发目的: screen-capture-recorder.dll是一款很不错的录屏dshow filter。也可以叫虚拟摄像头,他可以把桌面虚拟为一个dshow 源filter,打开这个虚拟摄像头,就相当于捕获了桌面数据,但是因为其是XP下的产物,抓屏技术为GDI,已经不能满足win10下高帧率(DXGI)的需求。于是,我们找到源码(文章后面有链接),经过修改升级,screen-capture-dxgi-qq35744025.dll可以支持120帧,有无鼠标,捕获方式(GDI或DXGI),支持输出多

xjb2006的专栏 1万+

FFmpeg 踩坑记录

本菜鸟使用的FFmpeg封装工具为 FFmpegCommand 感谢大佬,非常好用。 FFmpegCommand 链接:https://github.com/AnJoiner/FFmpegCommand FFmpeg FAQ:https://ffmpeg.org/faq.html#How-can-I-concatenate-video-files_003f 使用FFmpeg 处理视频后,得到0kb文件: 原因:由于项目使用的为 MediaRecorder录制视频。视频的编码为H264.而FFmp..

qq_657172627的博客 2844

【FFmpeg】音视频录制 ② ( 使用 Screen Capturer Recorder 软件生成 ffmpeg 可录制的音视频设备 )

一、使用 Screen Capturer Recorder 软件生成音视频设备 1、设备查找问题 - 引入 Screen Capturer Recorder 软件 2、下载安装 Screen Capturer Recorder 软件 3、验证 Screen Capturer Recorder 生成的设备

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 3279

基于AI大模型的视频实时翻译字幕生成:从原理到实践

语音识别(ASR)与机器翻译(NMT)是人工智能在自然语言处理领域的核心应用。其原理在于通过深度神经网络模型,将音频信号转化为文本,再在不同语言间进行语义转换。这项技术的价值在于极大地提升了跨语言信息处理的效率,打破了语言障碍,使全球化的知识获取与内容消费成为可能。其应用场景广泛,涵盖了在线教育、国际会议、多媒体内容本地化以及实时直播等多个领域。本文聚焦于如何利用当前先进的**开源模型**(如Whisper)与工具链,构建一套自动化视频**实时翻译字幕**生成系统,将上述技术原理转化为具体的工程实践,为开发

weixin_34221775的博客 356

easyPlayerPro播放h265/h264编码hls.m3u8直播/点播视频

easyPlayerPro.js播放h265/h264编码hls.m3u8直播/点播视频

菜鸟学ffmpeg音视频技术之二实现命令录制(暂停,组合)

前一节已经实现了录制,只能录制一段视频,实际运用中我们可能会暂停,然后接着录制最终生成一条完整的视频。 我们在使用命令行操作ffmpeg时组合各段视频的命令如下: ffmpeg -f conccat -safe 0 -iconccatfile -c copy dirfile 所以我的方法是暂停录制后生成一条临时视频,并把临时视频的文件名保存在conccatfile里面。重新开始录制又重新录制一条临时视频,这样如果一直反复暂停录制开始录制,会生成多个临时文件。停止录制时将这些视频组合成一条视频,从而完.

xpg4321的博客 1691

过程挖掘(Process Mining)1——始于颜值

下周开始每周1-2篇的过程挖掘分享 过程挖掘是什么? 过程挖掘与过程管理的关系? 过程挖掘与数据挖掘的关系? 管理学还是计算机科学?

hyhy12580的博客 6236

菜鸟学ffmpeg音视频技术之三实现命令录制(细节相关)

前面我使用video=screen-capture-recorder实现了录制的相关功能,这一节来讨论下我踩的坑。 1.screen-capture-recorder只能录制主屏幕,如果电脑连接了扩展屏,想要录制扩展屏只能让扩展屏设置成主屏才能 2.screen-capture-recorder无法设置录制的起始位置和大小,只能录制整个屏幕,想要录制某个区域只能先录制整个屏幕在使用ffmpeg命令来裁剪,这个跟组合录制一样。 启动一个进程来完成即可。 3.注意设备的类型,如果是dshow一定要设置d

xpg4321的博客 957

Unity游戏开发实战:用柏林噪声打造3D随机地形(附完整C#代码)

本文详细介绍了如何在Unity游戏开发中使用柏林噪声算法生成3D随机地形,包含完整的C#代码实现。从基础柏林噪声原理到高级参数控制,再到性能优化和常见问题解决,帮助开发者掌握程序化地形生成技术,打造丰富多变的游戏世界。

weixin_29281941的博客 99

ArduPilot飞控系统代码解读及架构分析

ArduPilot飞控系统是一个复杂而强大的系统,通过模块化设计和分层架构,实现了灵活的飞行控制功能。模块化设计: 各个功能模块相对独立,便于维护和扩展多种飞行模式: 满足不同的飞行需求强大的控制算法: 实现稳定的姿态和位置控制完善的安全机制: 保障飞行安全丰富的配置选项: 通过参数系统实现高度可定制性这种架构使ArduPilot能够适应从简单的多旋翼到复杂的自主飞行器等各种应用场景。类结构分析:Mode基类 (mode.h/mode.cpp)

fengforky的专栏 3019

菜鸟学ffmpeg音视频技术之5 使用GDI抓取图像

本文介绍如何使用windows GDI抓取图像并将图像转化为RGB,这样可以传递给FFMPEG进行编解码。步骤如下: 1.获取屏幕或者窗口句柄 首先通过FindWindow找到对应窗口的HWND,桌面HWND 为NULL。 录制分为屏幕录制和窗口录制,对于使用GDI抓图来讲就是获取对应对象的句柄 使用GetWindowDC来获取对应的设备描述符; hdc_screen = GetWindowDC(hwnd) 2.创建内存hdc hdc_mem = CreateCompatibleDC(hdc

xpg4321的博客 962

零基础入门篇③ PyCharm使用指南(个性化设置、开发必备插件、常用快捷键)

Python从入门到精通👉零基础入门篇③

hacker707的博客 4374

菜鸟学ffmpeg音视频技术之4 使用d3d 抓屏幕图像

本篇介绍如何使用d3d 9抓取屏幕图像,并将图像转化为RGB数据,转化后的数据可直接传递给FFmpeg进行编解码。 获取桌面数据容易,转为RGB网上的例子就少了,大多只会使用D3D api保存为一个图片,本文解决了这个难题,如果你想使用D3D抓图然后使用FFMPEG进行录制会对你有所帮助。 1.创建D3D对象 _d3d = Direct3DCreate9(D3D_SDK_VERSION); 2.获取display配置 memset(&_d3d_displaymode...

xpg4321的博客 654

Open3D——平面点云凸多边形轮廓提取【2025最新版】

平面点云凸多边形轮廓提起,博客长期更新,本文最近更新时间为:2025年1月6日。

点云侠的博客 6753

ubuntu20.04搭建QGC4.2编译环境

QGC 4.2ubuntu18.04也可以编译QGC4.2,但是由于GLBC版本较低,无法使用最新版的QTCreator,Ubuntu20.04可以使用最新版QTCreator。

超维空间科技的博客 1万+

ffmpeg用法及如何使用fluent-ffmpeg

http://ffmpeg.org/ 官网 ffmpeg(命令行工具) 是一个快速的音视频转换工具。 1.分离视频音频流 ffmpeg -i input_file -vcodec copy -an output_file_video  //分离视频流 ffmpeg -i input_file -acodec copy -vn output_file_audio  //分离音频流 ...

weixin_34378767的博客 1310

深入解析 Multi-Agent 协同决策机制与架构设计

让我们从一些基础定义开始,为后续的讨论建立共同的语言。在计算机科学和人工智能领域,智能体(Agent)是指一个能够感知环境、做出决策并执行动作的实体。智能体是任何可以通过传感器感知环境,并通过执行器作用于该环境的事物。atπstat​πst​sts_tst​是时刻ttt的环境状态(或智能体的观测)π\piπ是智能体的策略(Policy),即从状态到动作的映射ata_tat​是智能体在时刻ttt选择执行的动作多智能体系统(MAS)

AI天才研究院 541

菜鸟学ffmpeg音视频技术之7 mac枚举窗口

https://blog.youkuaiyun.com/xpg4321/article/details/112357480介绍了如何截屏 因为录制可能需要录制窗口,这里介绍如何枚举mac屏幕的窗口。 1.定义保存窗口信息的结构 struct WindowPoint { int x; int y; }; struct MousePoint { WindowPoint Position; WindowPoint HotSpot; }; stru.

xpg4321的博客 494

从零开始讲DDR(8)——AXI 接口MIG 使用(1)

我们简单拆解了MIG AXI接口中测试文件的整体框架,首先在sim_tb_top.sv文件中例化了DDR模型和example_top。在example_top中,又例化了MIG IP和一个流量产生器ddr4_v2_2_8_axi_tg_top。在ddr4_v2_2_8_axi_tg_top中的主要功能是分别例化了boot_mode_gen,prbs_mode_gen,custom_mode_gen和axi_opcode_gen。

apple_53311083的博客 1587

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

[特殊字符] FFmpeg 学习笔记

FFmpeg是一个开源跨平台的视频和音频处理工具,支持录制、转换、流处理等功能。

wangjinjin180的博客 762

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

FFmpeg AVFormatContext实战指南:核心字段与调试技巧

在音视频开发中,FFmpeg是绕不开的核心工具集,而AVFormatContext则是理解其工作原理的关键钥匙。它作为媒体文件的“总管家”,统一管理封装格式、流信息、I/O层与元数据,让开发者能以一致的方式处理MP4、FLV、TS等不同容器。无论是打开文件、读取数据包,还是进行转封装或自定义内存输入,AVFormatContext都扮演着承上启下的角色。从基本概念出发,剖析其核心字段与生命周期,并结合实际工程中的调试经验,能够有效避免常见陷阱,提升音视频处理效率。掌握AVFormatContext,不仅能解

weixin_42593701的博客 110

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

不错的技术网站

传智播客视频:http://yun.itheima.com/

StoneNotes的专栏 1091

【FFmpeg】音视频录制 ③ ( 使用 ffmpeg 录制 Screen Capturer Recorder 软件生成的虚拟音视频设备 | 录制桌面 | 录制音频 | 同时录制 音频和视频数据 )

一、Screen Capturer Recorder 生成的虚拟音视频设备 1、Screen Capturer Recorder 生成的虚拟音视频设备 2、查看上述虚拟音视频设备 二、使用 ffmpeg 录制 Screen Capturer Recorder 软件生成的虚拟音视频设备 1、录制桌面 2、录制音频 3、录制多路音频 - 配置 filter_complex 混音参数 4、同时录制 系统音频 + 桌面视频 5、同时录制 系统音频 + 麦克风音频 + 桌面视频

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 9197

easyplayerpro 使用说明_GitHub - tsingsee/EasyPlayerPro-Win: EasyPlayerPro是一款全功能的流媒体播放器,支持RTSP、RTMP、HTTP、...

EasyPlayerPro简介EasyPlayer是由TSINGSEE | 开放平台开发和维护的一个流媒体播放器系列项目,EasyPlayerPro是一款全功能的流媒体播放器,支持RTSP、RTMP、HTTP、HLS、UDP、RTP、File等多种流媒体协议播放、支持本地文件播放,支持本地抓拍、本地录像、播放旋转、多屏播放等多种功能特性,核心基于ffmpeg,稳定、高效、可靠,支持Windows、...

weixin_39735247的博客 1119

【亲测免费】 EasyPlayerPro-Android:一款高效、灵活的安卓多媒体播放器

EasyPlayerPro-Android:一款高效、灵活的安卓多媒体播放器 是一个专为安卓平台设计的强大而易用的多媒体播放解决方案。该项目由EasyDSS团队开发,旨在提供稳定且高性能的音视频播放功能,支持多种编码格式和流媒体协议。 技术特性与分析 全面的媒体格式支持:EasyPlayerPro-Android 支持包括 H264, H265, AV1 在内的多种视频编码格式,以及 AAC,...

gitblog_00043的博客 1271
上一篇: Qt 集成miniblink浏览器库之3 C++ js相互调用
下一篇: 菜鸟学ffmpeg音视频技术之二实现命令录制(暂停,组合)
很菜但努力
博客等级 码龄17年 113粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值