FFmpeg解碼USB攝像頭MJPEG輸出

一、FFmpeg解碼流程:
1、註冊所有容器格式和CODEC:avcodec_register_all();
2、查找對應的解碼器:avcodec_find_decoder(AV_CODEC_ID_MJPEG);
3、分配編解碼器參數數據結構avcodec_alloc_context3(AVCodec *codec);
4、對於部分編解碼需要對上一步分配的數據結構進行初始化,因爲某些參數在視頻流中無效;
5、打開編解碼器:avcodec_open2(AVCodecContext *ctx, AVCodec *codec, NULL);
6、爲解碼幀分配內存:AVFrame *frame = av_frame_alloc();
7、初始化編解碼輸入數據結構AVPacket:av_init_packet(AVPacket *packet);
8、將待解碼的壓縮視頻數據放入數據結構AVPacket中:
(AVPacket)packet.data = inbuf(待解碼視頻數據緩存);
(AVPacket)packet.size = inbufsize(待解碼視頻數據長度);
9、調用解碼函數開始解碼:avcodec_decode_video2(AVCodecContext *ctx,AVFrame *frame,int *got,AVPacket *packet);
10、拷貝解碼後的一幀數據,解碼後的數據格式根據解碼前的數據格式決定,例如,USB攝像頭的MJPEG數據解碼後是YUV422P格式,H264格式數據解碼後是YUV420P格式;解碼後的數據存放在AVFrame數據結構指向的緩存中,存放方式爲:(AVFrame )frame->data[0]指向Y分量,(AVFrame )frame->data[1]指向U分量,(AVFrame )frame->data[2]指向V分量;(AVFrame )frame->linesize[0]、(AVFrame )frame->linesize[1]、(AVFrame )frame->linesize[2]分別爲Y、U、V分量每行的長度。

二、移植FFmpeg出現的問題
1、安裝目錄下FFmpeg/include/libutil/common.h該頭文件報錯:
(1)error: #error missing -D__STDC_CONSTANT_MACROS / #define __STDC_CONSTANT_MACROS
(2) error: ‘UINT64_C’ was not declared in this scope
報錯原因:common.h頭文件中存在如下條件編譯:

#if defined(__cplusplus) && !defined(__STDC_CONSTANT_MACROS) && !defined(UINT64_C)
error missing -D__STDC_CONSTANT_MACROS / #define __STDC_CONSTANT_MACROS
#endif

該條件編譯是告訴開發人員在c++環境下要定義__STDC_CONSTANT_MACROS,同時還需要定義UINT64_C。
2、解決方法:在common.h頭文件中添加如下內容

#define __STDC_CONSTANT_MACROS
#define   UINT64_C(value) __CONCAT(value,ULL)
發佈了33 篇原創文章 · 獲贊 30 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章