Qt + FFmpeg 屏幕录制器
一、环境搭建
可以看我的另一篇文章 《Qt + FFmpeg 视频播放器》 , 在这里就不再重复了。
PS:一定要确认好FFmpeg库的版本,我在使用的时候因为函数接口对不上,头发掉了不少…所以,一定要慎重啊!!!
二、实战演练
1 . 功能介绍
源码链接 : https://github.com/AutoCatFuuuu/QT/tree/master/gdigrab
- 可以录制屏幕 录制系统摄像头 并显示出来
- 保存录制文件
实际效果图
这里展示的是录制桌面后保存下来的小视频【很小很小】
2 . 编码流程图
关键代码 【都是关键 这里对封装的类进行简单说明 程序内也有详细注释】
aencode.h
【AEncode】对编码进行封装
功能说明:
- 本demo工程里是实现录取屏幕 视频数据是从gdigrab里抓过来的
- 想实现 本地文件视频转码 可以先把视频解码出来再传到encodecOneFrame()
注意:
- 成员函数声明顺序就是编码流程的顺序,请一定要按顺序执行,否则程序会崩溃
- 本程序目前只支持 单视频流编码
- 编码格式会根据输出文件名猜测判断
- 对于编码器的参数设置接口并没有写很多 主要是因为对编码器的参数没啥研究…
- setPixFormat() 别乱设置 编码器不支持的话,会没法编码的
默认是 AV_PIX_FMT_YUV420P- setSize() 默认是 w:1920 h:1080
- setFPS() 默认 25
#ifndef AENCODE_H
#define AENCODE_H#ifdef __cplusplus
extern "C"{#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
#include <libavutil/imgutils.h>
}
#endifclass AEncode
{public:AEncode(); //初始化私有成员~AEncode(); //调用free();void setPath(char* path); //设置文件路径void setSize(int width,int height); //设置视频宽高void setFPS(int value) { fps = value; } //设置帧率void setPixFormat(AVPixelFormat p) { VPixFormat = p; }//设置输出图像的颜色空间void setSwsCtx(AVPixelFormat src, int src_w, int src_h);//设置转换格式bool initOutFile(); //为输出文件初始化bool initVideo(); //初始化视频编码器bool startEncodec(); //写文件头bool encodecOneFrame(AVFrame *frame, int index);//编码一帧bool endEncodec(); //写文件尾void free(); //销毁资源private:AVFormatContext *pFormatCtx; //多媒体上下文AVCodecContext *pVCodecCtx; //视频编码器上下文AVCodec *pVCodec; //视频编码器AVOutputFormat *fmt; //输出参数AVStream *pVStream; //视频输出流AVFrame *pVFrame; //视频编码帧AVPacket *pVPacket; //视频编码帧AVPixelFormat VPixFormat; //图像的颜色空间struct SwsContext *pSwsCtx; //转换格式unsigned char *out_buffer; //图像缓存区char path[256]; //文件路径int width; //宽int height; //高int fps; //帧率int videoindex; //视频流
};#endif // AENCODE_H
gdigrab.h
【Gdigrab】对抓取桌面进行封装
#ifndef GDIGRAB_H
#define GDIGRAB_H#ifdef __cplusplus
extern "C"{#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
#include <libavutil/imgutils.h>
#include <libavdevice/avdevice.h>
#include <libavutil/opt.h>
}
#endif#include "aencode.h"class Gdigrab {public:Gdigrab();~Gdigrab();bool open(); //打开bool read(); //读取void setOptions(int x,int y,int width,int height);int getFPS() { return fps.num; } //获取帧率AVFrame* getFrame() { return pFrameRGB; } //获取图像void stop(); //停止编码并关闭文件private:AVDictionary *options; //参数AVFormatContext *pFormatCtx; //文件内容信息 这里指屏幕AVCodecContext *pCodecCtx; //解码器上下文AVCodec *pCodec; //解码器AVFrame *pFrame; //解码出来的图像AVFrame *pFrameRGB; //转换成RGB的图像AVPacket *packet; //图像解码前的包AVRational fps;unsigned char *out_buffer; //图像缓存区struct SwsContext *pSwsContext; //转换格式int videoindex; //视频流索引AEncode E; //编码器};#endif
3 . 写在最后
本作品依然是兴趣使然的产物,适合初学者入门使用,本人对于编码这种东西真的是零概念的,以至于查找
资料的时候真的是痛不欲生。【官网的例子用的是很早的版本,雷博士的例子是从本地文件里读取的】 自己选的
坑,哭着也要把它填完。总之,在花费两个星期的时间 , Demo 也写烂几个 把这玩意做出来了。关于代码里有
啥疑惑的可以留言【佛系回复】或者 联系本人QQ :673315140 (ˉ▽ˉ;)...
Qt + FFmpeg 屏幕录制器相关推荐
- Ubuntu系统腾讯会议使用ffmpeg屏幕录制+声音录制
1.腾讯会议for Linux简介 经过一段时间的开发,腾讯终于搞定了Linux系统下的腾讯会议,腾讯会议目前可以进行远程视频对话,桌面远程展示等等功能,与Windows差异并无两样.但是也存在着一些 ...
- FFmpeg屏幕录制
一.FFmpeg简介 FFmpeg 是领先的多媒体框架,能够解码.编码.转码.混合.解密.流媒体.过滤和播放人类和机器创造的几乎所有东西.它支持最晦涩的古老格式,直到最尖端的格式.无论它们是由某个标准 ...
- FFmpeg — 屏幕录制器材
Toy Posted in Apps 在我看来,FFmpeg 相对是一个很酷的使用.那么,它幻想有什么用呢?庞大地讲,FFmpeg 相当于一个屏幕录像机.你可以运用它将屏幕上的把持历程录制上去,然后再 ...
- Qt FFmpeg 音视频播放器
使用FFmpeg库实现 本地和rtp 音视频播放器,使用qt绘制视频. 本demo环境为 qt5.12 vs2019-32位 .pro的qt工程 FFmpeg版本位3.4.8 vs2092-32位 本 ...
- Qt实现屏幕取色器 (放大镜,RGB显示,智能调节)原理
运行效果: 原理: 首先给整个屏幕覆盖上一层高透明度的无边框窗口(这里我用的颜色为(255,255,255),且透明度为1 ([0,255])) 通过定时器或线程实时更新鼠标位置,注意不要使用鼠标移动 ...
- Camtasia Studio 2020mac免费注册激活下载安装教程(屏幕录制及视频编辑软件)
Camtasia Studio2020是TechSmith旗下一款专门录制屏幕动作的工具,它能在任何颜色模式下轻松地记录屏幕动作,包括影像.音效.鼠标移动轨迹.解说声音等等: 另外,它还具有即时播放和 ...
- 最简单的基于FFmpeg的AVDevice例子(屏幕录制)
===================================================== 最简单的基于FFmpeg的AVDevice例子文章列表: 最简单的基于FFmpeg的AVDe ...
- c#屏幕录制(经典)(含源码和AForge.Video.FFMPEG.DLL)及填坑办法
一直觉得.net在多媒体处理方面渣得不行.最近需要做一个摄像头的程序,为了方便,用了AForge这个开源项目.AForge项目中有AForge.Video和AForge.Video. DirectSh ...
- python实现屏幕录制_使用python调用ffmpeg的录制项目总结
录制项目终于做完,不用总是提醒自己抓紧时间这样来想问题了. 在完成之后带着一些满足感,回头看看哪些地方是需要改进的,哪些地方又是有更好的替代方案,自己又有哪些不足. 下面按照软件的各部分分别做作总结: ...
- QT + FFmpeg 5.x + x264 + x265 + SDL2 音视频播放器
QT + FFmpeg 5.x + x264 + x265 + SDL2 音视频播放器 使用了QT的QML设计界面,人机交互; 使用了FFmpeg 5.x + x264 + x265 + SDL2 完 ...
最新文章
- 设计模式之代理模式(Proxy Pattern)
- 搭建python selenium 自动化测试框架_Python3+Selenium2完整的自动化测试框架实现(二):IE和Chrome浏览器驱动配置...
- Baidu_Location_SDK
- Zabbix部署(一)
- 计算机电子设计论文,计算机毕业设计电子信息毕业设计电子信息毕业论文
- 自反ACL实验(GNS3)
- 台式计算机如何安装摄像头,台式机如何使用摄像头
- 解决”error: info is different in .repo/manifests/.git vs .repo/manifests.git报错
- 求最小公倍数与最大公因数的三种算法
- Hadoop-HFDS知识点总结
- 2022-01-17 opencv-3.4.1 zlib.h: No such file or direc
- 水星路由器登录界面找不到服务器,水星路由器管理页面怎么登陆不进去? | 192路由网...
- 格雷希尔G72L系列法兰式密封快速连接器的应用
- vc++ 调用winapi调节屏幕亮度
- mysql一次count多个字段_SQL一次查出多个字段的COUNT值
- 【Android面试(1),阿里巴巴安卓面试题答案
- 【辣子鸡的家常做法】
- 西门子PLC学习笔记四-(控制三项异步电动机的启动停止)
- 成也IP败也IP,中日美盲盒经济背后不变的商业逻辑
- 计算机试题汇编2007,AUTOCAD2007试题汇编电子教材及答案