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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt + FFmpeg 屏幕录制器

發布時間:2023/12/18 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 屏幕录制器的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。