ffmpeg3.3新版本AVStream的封裝流參數由codec替換codecpar(解碼)

ffmpeg新版本中(封裝流)AVStream的codec參數要被codecpar參數所替代,這樣替代咱們要注意什麼,爲何要替代,咱們先來看下ffmpeg的代碼。html

代碼分析和新參數優點編程

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參數在58版本及以後就不會支持了,須要由codecpar參數所替代。這樣作的目的我想主要是將編碼和封裝完全分離,以前封裝和編碼使用的參數都是存放在codec中,這樣的好處是代碼簡潔,不須要額外給封裝傳遞參數,但壞處是把編碼和封裝的代碼融合在一塊耦合性較大,有不少需求,咱們只須要編碼並不須要作封裝,好比咱們作本身的推流協議,直接吧編碼後h264數據經過自定義的協議發送。ide

再好比直播推流中咱們編碼和封裝推流會在不一樣的線程中處理,若是共用一個上下文確定還須要處理互斥問題,分開就不會存在這個問題。函數

既然必需要替換咱們如何處理;this

好比原來的視頻播放處理方式是這樣(錯誤處理省略):編碼

//打開多媒體文件,咱們假定視頻流索引爲0
AVFormatContext *ic = NULL;
avformat_open_input(&ic, "test.mp4", 0, 0);
//找到視頻×××,好比H264
  AVCodec *codec = avcodec_find_decoder(ic->streams[0]->codec->codecid);
  //打開視頻×××,打開音頻×××用的也是同一個函數
avcodec_open2(enc, ic->streams[0]->codec, NULL);


看代碼咱們知道avformat_open_input以後音視頻的配置信息已經被寫在了codec中,解封裝和解碼用同一套參數。可是若是替換爲codecpar ,那×××是獨立建立的,那是否還要手動填寫一遍解碼參數,理論上是須要的,不過還好ffmpeg提供給咱們一個函數作參數複製spa

int avcodec_parameters_to_context(AVCodecContext *codec, const AVCodecParameters *par);線程

那咱們codec參數替換爲codecpar 代碼就能夠這樣寫了(錯誤處理省略)3d

//打開多媒體文件,咱們假定視頻流索引爲0
AVFormatContext *ic = NULL;
avformat_open_input(&ic, "test.mp4", 0, 0);
//找到視頻×××,好比H264
  AVCodec *codec = avcodec_find_decoder(ic->streams[0]->codecpar->codec_id);
//獨立的解碼上下文
AVCodecContext * vc = avcodec_alloc_context3(codec);
avcodec_parameters_to_context(vc, ic->streams[0]->codecpar);
avcodec_open2(vc, codec, NULL);


代碼改變後解碼上下文就是獨立的,後面解碼也不須要與解封裝上下文關聯,包括清理。code

×××的ID號也變爲從codecpar->codec_id成員獲取。


更多的資料也能夠關注我51cto上的視頻課程

夏老師的課堂 http://edu.51cto.com/lecturer/12016059.html

C++編程FFMpegSDK美顏直播推流實戰-基於qt5,opencv視頻課程

http://edu.51cto.com/course/10840.html

wKiom1mc-AbjkX_PAAgvk24sr5Y458.png-wh_50

wKiom1mc-BuAYOV2AAfvlgpFbks765.png-wh_50

相關文章
相關標籤/搜索