一、环境搭建

可以看我的另一篇文章 《Qt + FFmpeg 视频播放器》 , 在这里就不再重复了。
PS:一定要确认好FFmpeg库的版本,我在使用的时候因为函数接口对不上,头发掉了不少…所以,一定要慎重啊!!!

二、实战演练

1 . 功能介绍

源码链接 : https://github.com/AutoCatFuuuu/QT/tree/master/gdigrab

  1. 可以录制屏幕 录制系统摄像头 并显示出来
  2. 保存录制文件

实际效果图

这里展示的是录制桌面后保存下来的小视频【很小很小】

2 . 编码流程图

关键代码 【都是关键 这里对封装的类进行简单说明 程序内也有详细注释】

aencode.h

【AEncode】对编码进行封装
功能说明:

  1. 本demo工程里是实现录取屏幕 视频数据是从gdigrab里抓过来的
  2. 想实现 本地文件视频转码 可以先把视频解码出来再传到encodecOneFrame()

注意:

  1. 成员函数声明顺序就是编码流程的顺序,请一定要按顺序执行,否则程序会崩溃
  2. 本程序目前只支持 单视频流编码
  3. 编码格式会根据输出文件名猜测判断
  4. 对于编码器的参数设置接口并没有写很多 主要是因为对编码器的参数没啥研究…
  5. setPixFormat() 别乱设置 编码器不支持的话,会没法编码的
    默认是 AV_PIX_FMT_YUV420P
  6. setSize() 默认是 w:1920 h:1080
  7. 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 屏幕录制器相关推荐

  1. Ubuntu系统腾讯会议使用ffmpeg屏幕录制+声音录制

    1.腾讯会议for Linux简介 经过一段时间的开发,腾讯终于搞定了Linux系统下的腾讯会议,腾讯会议目前可以进行远程视频对话,桌面远程展示等等功能,与Windows差异并无两样.但是也存在着一些 ...

  2. FFmpeg屏幕录制

    一.FFmpeg简介 FFmpeg 是领先的多媒体框架,能够解码.编码.转码.混合.解密.流媒体.过滤和播放人类和机器创造的几乎所有东西.它支持最晦涩的古老格式,直到最尖端的格式.无论它们是由某个标准 ...

  3. FFmpeg — 屏幕录制器材

    Toy Posted in Apps 在我看来,FFmpeg 相对是一个很酷的使用.那么,它幻想有什么用呢?庞大地讲,FFmpeg 相当于一个屏幕录像机.你可以运用它将屏幕上的把持历程录制上去,然后再 ...

  4. Qt FFmpeg 音视频播放器

    使用FFmpeg库实现 本地和rtp 音视频播放器,使用qt绘制视频. 本demo环境为 qt5.12 vs2019-32位 .pro的qt工程 FFmpeg版本位3.4.8 vs2092-32位 本 ...

  5. Qt实现屏幕取色器 (放大镜,RGB显示,智能调节)原理

    运行效果: 原理: 首先给整个屏幕覆盖上一层高透明度的无边框窗口(这里我用的颜色为(255,255,255),且透明度为1 ([0,255])) 通过定时器或线程实时更新鼠标位置,注意不要使用鼠标移动 ...

  6. Camtasia Studio 2020mac免费注册激活下载安装教程(屏幕录制及视频编辑软件)

    Camtasia Studio2020是TechSmith旗下一款专门录制屏幕动作的工具,它能在任何颜色模式下轻松地记录屏幕动作,包括影像.音效.鼠标移动轨迹.解说声音等等: 另外,它还具有即时播放和 ...

  7. 最简单的基于FFmpeg的AVDevice例子(屏幕录制)

    ===================================================== 最简单的基于FFmpeg的AVDevice例子文章列表: 最简单的基于FFmpeg的AVDe ...

  8. c#屏幕录制(经典)(含源码和AForge.Video.FFMPEG.DLL)及填坑办法

    一直觉得.net在多媒体处理方面渣得不行.最近需要做一个摄像头的程序,为了方便,用了AForge这个开源项目.AForge项目中有AForge.Video和AForge.Video. DirectSh ...

  9. python实现屏幕录制_使用python调用ffmpeg的录制项目总结

    录制项目终于做完,不用总是提醒自己抓紧时间这样来想问题了. 在完成之后带着一些满足感,回头看看哪些地方是需要改进的,哪些地方又是有更好的替代方案,自己又有哪些不足. 下面按照软件的各部分分别做作总结: ...

  10. QT + FFmpeg 5.x + x264 + x265 + SDL2 音视频播放器

    QT + FFmpeg 5.x + x264 + x265 + SDL2 音视频播放器 使用了QT的QML设计界面,人机交互; 使用了FFmpeg 5.x + x264 + x265 + SDL2 完 ...

最新文章

  1. 设计模式之代理模式(Proxy Pattern)
  2. 搭建python selenium 自动化测试框架_Python3+Selenium2完整的自动化测试框架实现(二):IE和Chrome浏览器驱动配置...
  3. Baidu_Location_SDK
  4. Zabbix部署(一)
  5. 计算机电子设计论文,计算机毕业设计电子信息毕业设计电子信息毕业论文
  6. 自反ACL实验(GNS3)
  7. 台式计算机如何安装摄像头,台式机如何使用摄像头
  8. 解决”error: info is different in .repo/manifests/.git vs .repo/manifests.git报错
  9. 求最小公倍数与最大公因数的三种算法
  10. Hadoop-HFDS知识点总结
  11. 2022-01-17 opencv-3.4.1 zlib.h: No such file or direc
  12. 水星路由器登录界面找不到服务器,水星路由器管理页面怎么登陆不进去? | 192路由网...
  13. 格雷希尔G72L系列法兰式密封快速连接器的应用
  14. vc++ 调用winapi调节屏幕亮度
  15. mysql一次count多个字段_SQL一次查出多个字段的COUNT值
  16. 【Android面试(1),阿里巴巴安卓面试题答案
  17. 【辣子鸡的家常做法】
  18. 西门子PLC学习笔记四-(控制三项异步电动机的启动停止)
  19. 成也IP败也IP,中日美盲盒经济背后不变的商业逻辑
  20. 计算机试题汇编2007,AUTOCAD2007试题汇编电子教材及答案

热门文章

  1. java获取本机的外网IP地址(亲测有效)
  2. 讯飞翻译机抢镜背后,跨语种沟通迈入全新时代
  3. udp洪水攻击java_Linux网络编程--洪水攻击详解
  4. 元气骑士 自建服务器,元气骑士远程联机步骤教程一览
  5. 元气骑士android替换存档教程,元气骑士游戏怎么将存档转移到另一个手机中
  6. 利用Python制作王者战力查询以及皮肤查看软件
  7. 向上滚动的文字的淡入淡出效果
  8. UDP打洞原理与N2N内网穿透
  9. 删除单向链表的最后一个节点
  10. 不忘初心,持之以恒,笔耕不辍,利人利己