FFmpeg Principle學習open_output_file打開輸出文件
open_output_file()打開輸出文件流程
open_output_file()
打開輸出文件的流程,跟open_input_file()
打開輸入文件的流程是非常類似的。
都是創建一個文件管理器,輸出的文件管理器是struct OutputFile
,然後添加輸出流OutputStream
,創建編碼器上下文ost->enc_ctx
。
不過跟打開輸入文件一樣,都隻是創建瞭編碼器實例,但是都還沒真正打開編碼器。
打開編碼器是在init_output_stream()
函數裡面的,如下:
if ((ret = avcodec_open2(ost->enc_ctx, codec, &ost->encoder_opts)) < 0) {...}
打開解碼器是在init_input_stream()
函數裡面的,如下:
if ((ret = avcodec_open2(ist->dec_ctx, codec, &ist->decoder_opts)) < 0) {...}
在講解open_output_file()
函數的邏輯之前,需要先學習struct OutputFile
結構,推薦閱讀《OutputFile數據結構分析》
open_output_file()函數流程圖
由於open_output_file()
的流程比較長,所以拆成瞭兩列來畫,中間的兩列其實是一列。
open_output_file()
函數的邏輯其實比上面的流程圖更加復雜的,有比較多的細枝末節的邏輯,例如一些賦值操作,nb_stream_maps
的邏輯,處理 metadata,chapters,programs 的數據等等,這些邏輯其實在簡單場景下不會跑進去,所以可以先不管。
我說的簡單場景,是指下面這樣一條命令。juren-5s.mp4
的下載地地址:GitHub
ffmpeg -i juren-5s.mp4 juren-5s-copy.mp4
本章節,大部分的代碼分析都是基於簡單場景的。
簡單場景下,沒有使用復雜濾鏡的選項-filter_complex
,所以隻會調init_simple_filtergraph()
函數來初始化濾鏡。
ffmpeg.exe
的轉換器就是這麼實現的,即便你命令行沒有使用濾鏡,他也會創建一個空白的濾鏡,這是為瞭讓邏輯更加通用。
open_output_file()
函數裡面有比較多的復雜濾鏡的邏輯,通常都是判斷nb_filtergraphs
是否大於 0,這些邏輯你可以暫時不看。
簡單場景下,nb_filtergraphs
會是 0 。
open_output_file()函數重點
open_output_file()
函數裡面有 4 個重點的地方。
第一個重點: 選出最高分辨率的視頻流,選出最多聲道數的音頻流。
如果 mp4 文件有多個視頻流,多個音頻,ffmpeg.exe
轉換器會選出最好的那個來進行處理,如下:
第二個重點: new_video_stream()
函數的 最後一個參數,如下:
最後一個參數source_index
代表輸出流對應的輸入流,在簡單場景下,輸出流都是對應一個輸入流。
但是在復雜濾鏡下,有可能是多個輸入流合並輸出一個輸出流,所以在復雜濾鏡下,source_index
會設置成 -1,代表沒有對應的輸入流。
第三個重點:初始化簡單濾鏡,如下:
註意ist->decoding_needed
會因此變成 非 0,所以對應的輸入流會進行解碼操作。
第四個重點: 設置出口濾鏡的寬高等等信息,由於出口濾鏡出來的AVFrame
會進行編碼,然後保存進去容器,所以出口濾鏡的寬高,采樣等等,必須更容器的保持一致。
後面的都是一些簡單場景不會跑進去的邏輯,如下:
至此,open_output_file()
函數分析完畢。
以上就是FFmpeg Principle學習open_output_file打開輸出文件的詳細內容,更多關於FFmpeg Principle打開輸出文件的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- FFmpeg Principle分析Out put File 數據結構
- FFmpeg Principle學習new_video_stream添加視頻輸出流
- Qt+FFMPEG實現循環解碼詳解
- C語言結合ffmpeg打印音視頻信息
- Python合並ts文件至mp4格式及解密教程詳解