init output stream初始化輸出流源碼分析
正文
init_output_stream() 是一個(gè)公共的函數(shù),無(wú)論是音頻,還是視頻的輸出流的初始化,都是通過(guò)它來(lái)完成的。
init_output_stream() 上面還會(huì)套一個(gè) wrapper ,主要是做一些簡(jiǎn)單的封裝,例如已經(jīng)初始化了,就直接返回,代碼如下:

音頻 OutputStream初始化
音頻 OutputStream 的初始化主要有兩個(gè)地方。
1, 如果是 stream copy,不進(jìn)行編解碼,就是在 transcode_init() 里面如下:

從上圖可以看到,如果不進(jìn)行編解碼,音頻,視頻的輸出流,都是在 transcode_init() 里面初始化的。
2, 濾鏡模式,進(jìn)行了編解碼,就是在 reap_filter() 里 初始化音頻的輸出流的,如下:

音頻的輸出流可以在未從濾鏡讀取到 AVFrame 的時(shí)候就開(kāi)始初始化,而視頻的輸出流的初始化,需要從濾鏡拿到 AVFrame 之后才能初始化,視頻的初始化是在 封裝在do_video_out() 函數(shù)里面的。
至于為什么音頻輸出流需要提前初始化,可以看一下他的注釋?zhuān)覜](méi)細(xì)看。
init_output_stream() 函數(shù)其實(shí)沒(méi)有太多的重點(diǎn),主要就是設(shè)置編碼器參數(shù),然后打開(kāi)編碼器,再設(shè)置一下 OutputStream 的一些字段,就初始化完成了。
不過(guò) OutputStream 有一個(gè)字段特別重要,就是 initialized ,如下:

這個(gè) initialized 特別重要,只有輸出文件里面的所有輸出流,包括音頻跟視頻流,他們的 initialized 都是 1,才能調(diào) avformat_write_header() 函數(shù)寫(xiě)入頭部信息,
因?yàn)?nbsp;init_output_stream() 會(huì)對(duì) AVStream 設(shè)置一些信息,例如編碼信息等等。
必須設(shè)置完這些信息,initialized 全部都是 1,才能調(diào) avformat_write_header()。
因此,如果音頻輸出流沒(méi)初始化完成,那視頻流的 AVPacket 就不能寫(xiě)入文件,必須先寫(xiě)到隊(duì)列緩存下來(lái),如下:

init_output_stream() 函數(shù)流程圖

以上就是init output stream初始化輸出流源碼分析的詳細(xì)內(nèi)容,更多關(guān)于init output stream初始化輸出流的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
flutter升級(jí)3.7.3報(bào)錯(cuò)Unable?to?find?bundled?Java?version解決
這篇文章主要介紹了flutter升級(jí)3.7.3報(bào)錯(cuò)Unable?to?find?bundled?Java?version解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加2023-02-02
Android實(shí)現(xiàn)自定義帶文字和圖片Button的方法
這篇文章主要介紹了Android實(shí)現(xiàn)自定義帶文字和圖片Button的方法,涉及Android針對(duì)Button按鈕的布局與設(shè)計(jì)技巧,需要的朋友可以參考下2015-05-05
詳解Android ScrollView嵌套EditText出現(xiàn)的滑動(dòng)問(wèn)題
本篇文章主要介紹了詳解ScrollView嵌套EditText出現(xiàn)的滑動(dòng)問(wèn)題,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-01-01
Android實(shí)現(xiàn)伸縮彈力分布菜單效果的示例
本文介紹下在Android中實(shí)現(xiàn)伸縮彈力分布菜單效果。這種效果比較炫酷,有需要的朋友可以參考一下。2016-10-10
Android編程之ActionBar Tabs用法實(shí)例分析
這篇文章主要介紹了Android編程之ActionBar Tabs用法,結(jié)合實(shí)例形式分析了ActionBar Tabs的功能及Tab切換不同的Fragment的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-03-03
Android Root設(shè)備中的su權(quán)限獲取和使用詳解
本篇文章主要介紹了Android Root設(shè)備中的su權(quán)限獲取和使用詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-01-01
Flutter List數(shù)組避免插入重復(fù)數(shù)據(jù)的實(shí)現(xiàn)
這篇文章主要介紹了Flutter List數(shù)組避免插入重復(fù)數(shù)據(jù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
Windows實(shí)現(xiàn)Flutter環(huán)境搭建及配置這一篇就夠了
這篇文章主要介紹了Windows實(shí)現(xiàn)Flutter環(huán)境搭建及配置這一篇就夠了,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
Android ApiDemo示例工程的創(chuàng)建
本文主要介紹Android ApiDemo示例工程的創(chuàng)建,這里SDK中的示例工程做了大致介紹,并說(shuō)明如何創(chuàng)建ApiDemo 示例工程,有需要看自帶代碼的朋友可以參考下2016-09-09

