项目需要一个录屏的功能,之前看到了一个使用Qt计时器+截图+avilib生成AVI+ffmpeg合并视频音频的方式:
Qt C++ 录屏录音功能实现(avilib+ffmpeg)以及动态库生成
https://blog.csdn.net/qq_35769071/article/details/125323624
使用后,出现不少问题;首先32位的avilib里的pos是有符号的long型,如果要保存的图片大小大于long型的有效范围,则会崩溃;如果是1920*1080的分辨率,视频只能保存2分钟左右;其次是视频和音频是分别录制的,需要使用ffmpeg.exe合并,如果连续录制2个小时,avi和mav的大文件使用ffmpeg合并,可能会出现问题;
同事找到了一个开源的C#例子,Captura-9.0.0-beta4,可以支持选择区域录制;底层是用process调用的ffmpeg的命令实现的;
还是觉得应该使用C++的ffmpeg库来实现该功能;
同学推荐了基本ffmpeg的书和以及编译可用的Windows库,有需要的可以从下面链接下载;
链接:https://pan.baidu.com/s/1xnHlS0KLUelzSqT5nUleLg
提取码:hl1q
这里贴一个ffmpeg实现录屏的地址;
FFMPEG录屏(1)----录制桌面
https://blog.csdn.net/peilinok/article/details/102981560
里面将了ffmpeg的常用使用方式,还有一个录屏的一个开源代码:
https://gitcode.net/mirrors/peilinok/screen-recorder?utm_source=csdn_github_accelerator
使用的ffmpeg
遇到的问题:
需要关闭ffmpeg的日志打印
av_log_set_level(AV_LOG_ERROR);
如果需要录制扩展屏幕,需要使用Recorder中的record_desktop_duplication类,根据get_adapters获取所有的适配器信息,主屏幕的坐标是从(0,0)开始的,扩展屏幕是相对主屏幕的坐标计算的;
auto adapters = d3d_helper::get_adapters(&error, true);
在函数get_dst_adapter内修改,for内逻辑,需要将adapters内的每个适配器的信息记录下来,然后决定录制那个屏幕;还有一个问题,如果获取屏幕的缩放比例?
int record_desktop_duplication::get_dst_adapter(IDXGIAdapter ** adapter)
如果主屏幕有缩放,就需要计算出相对于1920*1080的位置,拿我的屏幕举例: