一、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)