Qt + FFmpeg 屏幕录制器
生活随笔
收集整理的這篇文章主要介紹了
Qt + FFmpeg 屏幕录制器
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一、環(huán)境搭建
可以看我的另一篇文章 《Qt + FFmpeg 視頻播放器》 , 在這里就不再重復(fù)了。
PS:一定要確認(rèn)好FFmpeg庫的版本,我在使用的時(shí)候因?yàn)楹瘮?shù)接口對不上,頭發(fā)掉了不少…所以,一定要慎重啊!!!
二、實(shí)戰(zhàn)演練
1 . 功能介紹
源碼鏈接 : https://github.com/AutoCatFuuuu/QT/tree/master/gdigrab
實(shí)際效果圖
這里展示的是錄制桌面后保存下來的小視頻【很小很小】
2 . 編碼流程圖
關(guān)鍵代碼 【都是關(guān)鍵 這里對封裝的類進(jìn)行簡單說明 程序內(nèi)也有詳細(xì)注釋】
aencode.h
【AEncode】對編碼進(jìn)行封裝
功能說明:
注意:
默認(rèn)是 AV_PIX_FMT_YUV420P
gdigrab.h
【Gdigrab】對抓取桌面進(jìn)行封裝
#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(); //停止編碼并關(guān)閉文件private:AVDictionary *options; //參數(shù)AVFormatContext *pFormatCtx; //文件內(nèi)容信息 這里指屏幕AVCodecContext *pCodecCtx; //解碼器上下文AVCodec *pCodec; //解碼器AVFrame *pFrame; //解碼出來的圖像AVFrame *pFrameRGB; //轉(zhuǎn)換成RGB的圖像AVPacket *packet; //圖像解碼前的包AVRational fps;unsigned char *out_buffer; //圖像緩存區(qū)struct SwsContext *pSwsContext; //轉(zhuǎn)換格式int videoindex; //視頻流索引AEncode E; //編碼器};#endif3 . 寫在最后
本作品依然是興趣使然的產(chǎn)物,適合初學(xué)者入門使用,本人對于編碼這種東西真的是零概念的,以至于查找 資料的時(shí)候真的是痛不欲生。【官網(wǎng)的例子用的是很早的版本,雷博士的例子是從本地文件里讀取的】 自己選的 坑,哭著也要把它填完。總之,在花費(fèi)兩個(gè)星期的時(shí)間 , Demo 也寫爛幾個(gè) 把這玩意做出來了。關(guān)于代碼里有 啥疑惑的可以留言【佛系回復(fù)】或者 聯(lián)系本人QQ :673315140 (ˉ▽ˉ;)...總結(jié)
以上是生活随笔為你收集整理的Qt + FFmpeg 屏幕录制器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 南邮 OJ 1408 火星探险
- 下一篇: WawaKM:关于批量抓图的需求分析及设