日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Qt + FFmpeg 屏幕录制器

發(fā)布時(shí)間:2023/12/18 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt + FFmpeg 屏幕录制器 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、環(huán)境搭建

可以看我的另一篇文章 《Qt + FFmpeg 視頻播放器》 , 在這里就不再重復(fù)了。
PS:一定要確認(rèn)好FFmpeg庫(kù)的版本,我在使用的時(shí)候因?yàn)楹瘮?shù)接口對(duì)不上,頭發(fā)掉了不少…所以,一定要慎重啊!!!

二、實(shí)戰(zhàn)演練

1 . 功能介紹

源碼鏈接 : https://github.com/AutoCatFuuuu/QT/tree/master/gdigrab

  • 可以錄制屏幕 錄制系統(tǒng)攝像頭 并顯示出來(lái)
  • 保存錄制文件
  • 實(shí)際效果圖

    這里展示的是錄制桌面后保存下來(lái)的小視頻【很小很小】

    2 . 編碼流程圖

    關(guān)鍵代碼 【都是關(guān)鍵 這里對(duì)封裝的類進(jìn)行簡(jiǎn)單說(shuō)明 程序內(nèi)也有詳細(xì)注釋】

    aencode.h

    【AEncode】對(duì)編碼進(jìn)行封裝
    功能說(shuō)明:

  • 本demo工程里是實(shí)現(xiàn)錄取屏幕 視頻數(shù)據(jù)是從gdigrab里抓過(guò)來(lái)的
  • 想實(shí)現(xiàn) 本地文件視頻轉(zhuǎn)碼 可以先把視頻解碼出來(lái)再傳到encodecOneFrame()
  • 注意:

  • 成員函數(shù)聲明順序就是編碼流程的順序,請(qǐng)一定要按順序執(zhí)行,否則程序會(huì)崩潰
  • 本程序目前只支持 單視頻流編碼
  • 編碼格式會(huì)根據(jù)輸出文件名猜測(cè)判斷
  • 對(duì)于編碼器的參數(shù)設(shè)置接口并沒(méi)有寫很多 主要是因?yàn)閷?duì)編碼器的參數(shù)沒(méi)啥研究…
  • setPixFormat() 別亂設(shè)置 編碼器不支持的話,會(huì)沒(méi)法編碼的
    默認(rèn)是 AV_PIX_FMT_YUV420P
  • setSize() 默認(rèn)是 w:1920 h:1080
  • setFPS() 默認(rèn) 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(); //調(diào)用free();void setPath(char* path); //設(shè)置文件路徑void setSize(int width,int height); //設(shè)置視頻寬高void setFPS(int value) { fps = value; } //設(shè)置幀率void setPixFormat(AVPixelFormat p) { VPixFormat = p; }//設(shè)置輸出圖像的顏色空間void setSwsCtx(AVPixelFormat src, int src_w, int src_h);//設(shè)置轉(zhuǎn)換格式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; //輸出參數(shù)AVStream *pVStream; //視頻輸出流AVFrame *pVFrame; //視頻編碼幀AVPacket *pVPacket; //視頻編碼幀AVPixelFormat VPixFormat; //圖像的顏色空間struct SwsContext *pSwsCtx; //轉(zhuǎn)換格式unsigned char *out_buffer; //圖像緩存區(qū)char path[256]; //文件路徑int width; //寬int height; //高int fps; //幀率int videoindex; //視頻流 };#endif // AENCODE_H

    gdigrab.h

    【Gdigrab】對(duì)抓取桌面進(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(); //打開(kāi)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; //解碼出來(lái)的圖像AVFrame *pFrameRGB; //轉(zhuǎn)換成RGB的圖像AVPacket *packet; //圖像解碼前的包AVRational fps;unsigned char *out_buffer; //圖像緩存區(qū)struct SwsContext *pSwsContext; //轉(zhuǎn)換格式int videoindex; //視頻流索引AEncode E; //編碼器};#endif

    3 . 寫在最后

    本作品依然是興趣使然的產(chǎn)物,適合初學(xué)者入門使用,本人對(duì)于編碼這種東西真的是零概念的,以至于查找 資料的時(shí)候真的是痛不欲生?!竟倬W(wǎng)的例子用的是很早的版本,雷博士的例子是從本地文件里讀取的】 自己選的 坑,哭著也要把它填完??傊?#xff0c;在花費(fèi)兩個(gè)星期的時(shí)間 , Demo 也寫爛幾個(gè) 把這玩意做出來(lái)了。關(guān)于代碼里有 啥疑惑的可以留言【佛系回復(fù)】或者 聯(lián)系本人QQ :673315140 (ˉ▽ˉ;)...

    總結(jié)

    以上是生活随笔為你收集整理的Qt + FFmpeg 屏幕录制器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。