91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-07-18 19:33:03 來源:網絡 閱讀:6989 作者:夏曹俊 欄目:編程語言

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

代碼分析和新參數優勢

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中,這樣的好處是代碼簡潔,不需要額外給封裝傳遞參數,但壞處是把編碼和封裝的代碼融合在一塊耦合性較大,有很多需求,我們只需要編碼并不需要做封裝,比如我們做自己的推流協議,直接吧編碼后h364數據通過自定義的協議發送。

再比如直播推流中我們編碼和封裝推流會在不同的線程中處理,如果共用一個上下文肯定還需要處理互斥問題,分開就不會存在這個問題。

既然必須要替換我們如何處理;

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

//打開多媒體文件,我們假定視頻流索引為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提供給我們一個函數做參數復制

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

那我們codec參數替換為codecpar 代碼就可以這樣寫了(錯誤處理省略)

//打開多媒體文件,我們假定視頻流索引為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);


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

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


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

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

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

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

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

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




向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

南阳市| 郸城县| 娄底市| 肥东县| 阳西县| 高碑店市| 安顺市| 五河县| 霍林郭勒市| 英德市| 廉江市| 巫山县| 龙岩市| 淮南市| 绥中县| 临城县| 石屏县| 沂水县| 共和县| 洪湖市| 定日县| 马鞍山市| 于田县| 合肥市| 龙海市| 大英县| 崇明县| 中山市| 元谋县| 广州市| 荥阳市| 井冈山市| 敖汉旗| 辽阳市| 清流县| 松江区| 宝清县| 新源县| 绥德县| 凤阳县| 东丽区|