??摘要:本文主要描述了FFmpeg中用于打開編解碼器接口av_read_frame
的具體調(diào)用流程,詳細(xì)描述了該接口被調(diào)用時(shí)所作的具體工作。
??關(guān)鍵字:ffmpeg
、av_read_frame
??讀者須知:讀者需要了解FFmpeg的基本使用流程,以及一些FFmpeg的基本常識(shí),了解FFmpegIO相關(guān)的內(nèi)容,以及大致的解碼流程。
??使用FFmpeg解碼視頻時(shí)需要主動(dòng)打開解碼器獲得解碼器相關(guān)的Context,然后直接調(diào)用av_read_frame
讀取AVPacket
碼流數(shù)據(jù)送到FFmpeg中進(jìn)行解碼即可。本文主要通過源碼了解FFmpeg搜索和打開解碼器的基本實(shí)現(xiàn)原理和FFmpeg具體的解碼流程。
2 av_read_frame
??av_read_frame
用于從已經(jīng)打開的文件中讀取未經(jīng)過解碼的碼流AVPacket
,對(duì)于視頻幀就是一幀的壓縮幀,對(duì)于音頻幀如果音頻是固定大小的話則可以是多幀,否則也是一幀。av_read_frame
內(nèi)部讀取碼流時(shí)調(diào)用avpriv_packet_list_get
和av_read_frame_internal
。
??avpriv_packet_list_get
比較簡(jiǎn)單就是從當(dāng)前媒體的PackList中取出一幀。av_read_frame
的函數(shù)實(shí)現(xiàn)比較長(zhǎng),其大致流程為:
- 調(diào)用
ff_read_packet
讀取一幀碼流; - 如果1步驟失敗則調(diào)用
parse_packet
刷新解析器,否則繼續(xù)到步驟3; - 如果當(dāng)前context需要更新解碼器context,則將internal的解碼器context更新到stream的解碼器context;
- 如果成功拿到預(yù)期的幀則下一步,否則跳轉(zhuǎn)到步驟1;
- 后續(xù)的工作就是解析元數(shù)據(jù),計(jì)算需要丟棄的數(shù)據(jù)大小等。
??ff_read_packet
會(huì)先檢查緩沖區(qū)是否有幀沒有的話就會(huì)調(diào)用s->iformat->read_packet
即對(duì)應(yīng)個(gè)是的解析碼流的函數(shù)進(jìn)行解碼。每個(gè)FFmpeg支持的格式都有一個(gè)FormatContext描述對(duì)應(yīng)格式的信息以及解析對(duì)應(yīng)格式的函數(shù)指針,比如下面是mov的格式描述:文章來源:http://www.zghlxwxcb.cn/news/detail-559925.html
static const AVClass mov_class = {
.class_name = "mov,mp4,m4a,3gp,3g2,mj2",
.item_name = av_default_item_name,
.option = mov_options,
.version = LIBAVUTIL_VERSION_INT,
};
const AVInputFormat ff_mov_demuxer = {
.name = "mov,mp4,m4a,3gp,3g2,mj2",
.long_name = NULL_IF_CONFIG_SMALL("QuickTime / MOV"),
.priv_class = &mov_class,
.priv_data_size = sizeof(MOVContext),
.extensions = "mov,mp4,m4a,3gp,3g2,mj2,psp,m4b,ism,ismv,isma,f4v",
.flags_internal = FF_FMT_INIT_CLEANUP,
.read_probe = mov_probe,
.read_header = mov_read_header,
.read_packet = mov_read_packet,
.read_close = mov_read_close,
.read_seek = mov_read_seek,
.flags = AVFMT_NO_BYTE_SEEK | AVFMT_SEEK_TO_PTS,
};
??從上面的過程能夠看出av_read_frame
完全是同步的操作,可能是比較耗時(shí)的,因?yàn)槿绻恢蹦貌坏綆蜁?huì)一直遍歷當(dāng)前媒體文件的buffer,因此一般建議開一個(gè)線程讀取Packet。文章來源地址http://www.zghlxwxcb.cn/news/detail-559925.html
到了這里,關(guān)于FFmpeg5.0源碼閱讀—— av_read_frame的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!