網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
FFmpeg?Principle學(xué)習(xí)open_output_file打開(kāi)輸出文件_Android
作者:Loken1 ? 更新時(shí)間: 2022-12-03 編程語(yǔ)言open_output_file()打開(kāi)輸出文件流程
open_output_file()
打開(kāi)輸出文件的流程,跟open_input_file()
打開(kāi)輸入文件的流程是非常類(lèi)似的。
都是創(chuàng)建一個(gè)文件管理器,輸出的文件管理器是struct OutputFile
,然后添加輸出流OutputStream
,創(chuàng)建編碼器上下文ost->enc_ctx
。
不過(guò)跟打開(kāi)輸入文件一樣,都只是創(chuàng)建了編碼器實(shí)例,但是都還沒(méi)真正打開(kāi)編碼器。
打開(kāi)編碼器是在init_output_stream()
函數(shù)里面的,如下:
if ((ret = avcodec_open2(ost->enc_ctx, codec, &ost->encoder_opts)) < 0) {...}
打開(kāi)解碼器是在init_input_stream()
函數(shù)里面的,如下:
if ((ret = avcodec_open2(ist->dec_ctx, codec, &ist->decoder_opts)) < 0) {...}
在講解open_output_file()
函數(shù)的邏輯之前,需要先學(xué)習(xí)struct OutputFile
結(jié)構(gòu),推薦閱讀《OutputFile數(shù)據(jù)結(jié)構(gòu)分析》
open_output_file()函數(shù)流程圖
由于open_output_file()
的流程比較長(zhǎng),所以拆成了兩列來(lái)畫(huà),中間的兩列其實(shí)是一列。
open_output_file()
函數(shù)的邏輯其實(shí)比上面的流程圖更加復(fù)雜的,有比較多的細(xì)枝末節(jié)的邏輯,例如一些賦值操作,nb_stream_maps
的邏輯,處理 metadata,chapters,programs 的數(shù)據(jù)等等,這些邏輯其實(shí)在簡(jiǎn)單場(chǎng)景下不會(huì)跑進(jìn)去,所以可以先不管。
我說(shuō)的簡(jiǎn)單場(chǎng)景,是指下面這樣一條命令。juren-5s.mp4
的下載地地址:GitHub
ffmpeg -i juren-5s.mp4 juren-5s-copy.mp4
本章節(jié),大部分的代碼分析都是基于簡(jiǎn)單場(chǎng)景的。
簡(jiǎn)單場(chǎng)景下,沒(méi)有使用復(fù)雜濾鏡的選項(xiàng)-filter_complex
,所以只會(huì)調(diào)init_simple_filtergraph()
函數(shù)來(lái)初始化濾鏡。
ffmpeg.exe
的轉(zhuǎn)換器就是這么實(shí)現(xiàn)的,即便你命令行沒(méi)有使用濾鏡,他也會(huì)創(chuàng)建一個(gè)空白的濾鏡,這是為了讓邏輯更加通用。
open_output_file()
函數(shù)里面有比較多的復(fù)雜濾鏡的邏輯,通常都是判斷nb_filtergraphs
是否大于 0,這些邏輯你可以暫時(shí)不看。
簡(jiǎn)單場(chǎng)景下,nb_filtergraphs
會(huì)是 0 。
open_output_file()函數(shù)重點(diǎn)
open_output_file()
函數(shù)里面有 4 個(gè)重點(diǎn)的地方。
第一個(gè)重點(diǎn): 選出最高分辨率的視頻流,選出最多聲道數(shù)的音頻流。
如果 mp4 文件有多個(gè)視頻流,多個(gè)音頻,ffmpeg.exe
轉(zhuǎn)換器會(huì)選出最好的那個(gè)來(lái)進(jìn)行處理,如下:
第二個(gè)重點(diǎn): new_video_stream()
函數(shù)的 最后一個(gè)參數(shù),如下:
最后一個(gè)參數(shù)source_index
代表輸出流對(duì)應(yīng)的輸入流,在簡(jiǎn)單場(chǎng)景下,輸出流都是對(duì)應(yīng)一個(gè)輸入流。
但是在復(fù)雜濾鏡下,有可能是多個(gè)輸入流合并輸出一個(gè)輸出流,所以在復(fù)雜濾鏡下,source_index
會(huì)設(shè)置成 -1,代表沒(méi)有對(duì)應(yīng)的輸入流。
第三個(gè)重點(diǎn):初始化簡(jiǎn)單濾鏡,如下:
注意ist->decoding_needed
會(huì)因此變成 非 0,所以對(duì)應(yīng)的輸入流會(huì)進(jìn)行解碼操作。
第四個(gè)重點(diǎn): 設(shè)置出口濾鏡的寬高等等信息,由于出口濾鏡出來(lái)的AVFrame
會(huì)進(jìn)行編碼,然后保存進(jìn)去容器,所以出口濾鏡的寬高,采樣等等,必須更容器的保持一致。
后面的都是一些簡(jiǎn)單場(chǎng)景不會(huì)跑進(jìn)去的邏輯,如下:
至此,open_output_file()
函數(shù)分析完畢。
原文鏈接:https://juejin.cn/post/7159423339063148575
相關(guān)推薦
- 2022-10-23 python如何在一個(gè)py文件中獲取另一個(gè)py文件中的值(一個(gè)或多個(gè))_python
- 2022-07-22 如何處理SQL Server中附加數(shù)據(jù)庫(kù)時(shí)出現(xiàn)的錯(cuò)誤
- 2023-12-19 Mybatis緩存機(jī)制
- 2024-04-06 MyBatis的一級(jí)(同SqlSession會(huì)話(huà)),二級(jí)(不同SqlSession會(huì)話(huà))緩存使用
- 2023-07-16 uniapp 調(diào)用拍照組件
- 2022-08-03 C++編程語(yǔ)言中賦值運(yùn)算符重載函數(shù)(operator=)的使用_C 語(yǔ)言
- 2022-06-01 AndriodStudio使用listview實(shí)現(xiàn)簡(jiǎn)單圖書(shū)管理_Android
- 2023-06-04 Flask框架中的session設(shè)置詳解_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支