ffmpeg新版本中(封裝流)AVStream的codec參數(shù)要被codecpar參數(shù)所替代,這樣替代我們要注意什么,為什么要替代,我們先來(lái)看下ffmpeg的代碼。
成都創(chuàng)新互聯(lián)公司專注于企業(yè)成都全網(wǎng)營(yíng)銷、網(wǎng)站重做改版、涇川網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5頁(yè)面制作、商城系統(tǒng)網(wǎng)站開發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為涇川等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
代碼分析和新參數(shù)優(yōu)勢(shì)
typedef struct AVStream { #if FF_API_LAVF_AVCTX /** * @deprecated use the codecpar struct instead */ attribute_deprecated AVCodecContext *codec; #endif 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 /* * Codec parameters associated with this stream. Allocated and freed by * libavformat in avformat_new_stream() and avformat_free_context() * respectively. * * - demuxing: filled by libavformat on stream creation or in * avformat_find_stream_info() * - muxing: filled by the caller before avformat_write_header() */ AVCodecParameters *codecpar; }
從代碼中我們可以看出codec參數(shù)在58版本及之后就不會(huì)支持了,需要由codecpar參數(shù)所替代。這樣做的目的我想主要是將編碼和封裝徹底分離,之前封裝和編碼使用的參數(shù)都是存放在codec中,這樣的好處是代碼簡(jiǎn)潔,不需要額外給封裝傳遞參數(shù),但壞處是把編碼和封裝的代碼融合在一塊耦合性較大,有很多需求,我們只需要編碼并不需要做封裝,比如我們做自己的推流協(xié)議,直接吧編碼后h364數(shù)據(jù)通過自定義的協(xié)議發(fā)送。
再比如直播推流中我們編碼和封裝推流會(huì)在不同的線程中處理,如果共用一個(gè)上下文肯定還需要處理互斥問題,分開就不會(huì)存在這個(gè)問題。
既然必須要替換我們?nèi)绾翁幚恚?/p>
比如原來(lái)的視頻播放處理方式是這樣(錯(cuò)誤處理省略):
//打開多媒體文件,我們假定視頻流索引為0 AVFormatContext *ic = NULL; avformat_open_input(&ic, "test.mp4", 0, 0); //找到視頻×××,比如H264 AVCodec *codec = avcodec_find_decoder(ic->streams[0]->codec->codecid); //打開視頻×××,打開音頻×××用的也是同一個(gè)函數(shù) avcodec_open2(enc, ic->streams[0]->codec, NULL);
看代碼我們知道avformat_open_input之后音視頻的配置信息已經(jīng)被寫在了codec中,解封裝和解碼用同一套參數(shù)。但是如果替換為codecpar ,那×××是獨(dú)立創(chuàng)建的,那是否還要手動(dòng)填寫一遍解碼參數(shù),理論上是需要的,不過還好ffmpeg提供給我們一個(gè)函數(shù)做參數(shù)復(fù)制
int avcodec_parameters_to_context(AVCodecContext *codec, const AVCodecParameters *par);
那我們codec參數(shù)替換為codecpar 代碼就可以這樣寫了(錯(cuò)誤處理省略)
//打開多媒體文件,我們假定視頻流索引為0 AVFormatContext *ic = NULL; avformat_open_input(&ic, "test.mp4", 0, 0); //找到視頻×××,比如H264 AVCodec *codec = avcodec_find_decoder(ic->streams[0]->codecpar->codec_id); //獨(dú)立的解碼上下文 AVCodecContext * vc = avcodec_alloc_context3(codec); avcodec_parameters_to_context(vc, ic->streams[0]->codecpar); avcodec_open2(vc, codec, NULL);
代碼改變后解碼上下文就是獨(dú)立的,后面解碼也不需要與解封裝上下文關(guān)聯(lián),包括清理。
×××的ID號(hào)也變?yōu)閺腸odecpar->codec_id成員獲取。
更多的資料也可以關(guān)注我51cto上的視頻課程
夏老師的課堂 http://edu.51cto.com/lecturer/12016059.html
http://edu.51cto.com/course/10840.html