日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

init?output?stream初始化輸出流源碼分析_Android

作者:Loken1 ? 更新時間: 2022-12-03 編程語言

正文

init_output_stream()?是一個公共的函數,無論是音頻,還是視頻的輸出流的初始化,都是通過它來完成的。

init_output_stream()?上面還會套一個?wrapper?,主要是做一些簡單的封裝,例如已經初始化了,就直接返回,代碼如下:

音頻?OutputStream初始化

音頻?OutputStream?的初始化主要有兩個地方。

1, 如果是 stream copy,不進行編解碼,就是在?transcode_init()?里面如下:

從上圖可以看到,如果不進行編解碼,音頻,視頻的輸出流,都是在?transcode_init()?里面初始化的。

2, 濾鏡模式,進行了編解碼,就是在?reap_filter()?里 初始化音頻的輸出流的,如下:

音頻的輸出流可以在未從濾鏡讀取到?AVFrame?的時候就開始初始化,而視頻的輸出流的初始化,需要從濾鏡拿到?AVFrame?之后才能初始化,視頻的初始化是在 封裝在do_video_out()?函數里面的。

至于為什么音頻輸出流需要提前初始化,可以看一下他的注釋,我沒細看。

init_output_stream()?函數其實沒有太多的重點,主要就是設置編碼器參數,然后打開編碼器,再設置一下?OutputStream?的一些字段,就初始化完成了。

不過?OutputStream?有一個字段特別重要,就是?initialized?,如下:

這個?initialized?特別重要,只有輸出文件里面的所有輸出流,包括音頻跟視頻流,他們的 initialized 都是 1,才能調?avformat_write_header()?函數寫入頭部信息,

因為?init_output_stream()?會對?AVStream?設置一些信息,例如編碼信息等等。

必須設置完這些信息,initialized?全部都是 1,才能調?avformat_write_header()。

因此,如果音頻輸出流沒初始化完成,那視頻流的?AVPacket?就不能寫入文件,必須先寫到隊列緩存下來,如下:

init_output_stream()?函數流程圖

原文鏈接:https://juejin.cn/post/7160400432274571277

欄目分類
最近更新