本文為作者原創,轉載請注明出處:https://www.cnblogs.com/leisure_chn/p/10297002.html
本文介紹 FFmpeg 最基礎的概念,了解 FFmpeg 的使用方法。本文內容主要節選和翻譯自書籍《FFmpeg Basics》及官網文檔 “Documentation-ffmpeg” 和 “Documentation-ffmpeg-all”。
1. 概述
FFmpeg 是一款用於多媒體處理的自由軟件工程,基於 GPL 許可證發布。FFmpeg 提供的最核心的命令行工具是 “ffmpeg”,“ffmpeg” 命令行工具的主要特征是輸出過程快、輸出品質高、輸出文件小。“FFmpeg” 中 “FF” 表示 “Fast Forward”,“mpeg” 表示 “Moving Pictures Experts Group”。
FFmpeg 提供如下四個命令行工具:
-- ffmpeg 音視頻編碼器/解碼器
-- ffplay 媒體播放器
-- ffprobe 顯示媒體文件信息
-- ffserver 多媒體流廣播服務器,使用 HTTP 和 RTSP 協議。FFmpeg 4.1 版本已經刪除 ffserver,新的替代者還未添加進來。
FFmpeg提供如下軟件開發庫:
-- libavcodec 多媒體編解碼器庫
-- libavdevice 設備庫
-- libavfilter 濾鏡庫
-- libavformat 媒體格式庫
-- libavutil 實用工具庫
-- libpostproc 后處理庫
-- libswresample 音頻重采樣庫
-- libswscale 媒體縮放庫
2. 命令行格式
命令行基本格式為:
ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...
格式分解如下:
ffmpeg
global_options
input1_options -i input1
input2_options -i input2
...
output1_options output1
output2_options output2
...
“ffmpeg” 讀取任意數量的輸入 “文件”(可以是常規文件、管道、網絡流、錄制設備等,由 “-i” 選項指定),寫入任意數量的輸出 “文件”。命令行中無法被解釋為選項(option)的任何元素都會被當作輸出文件。
每個輸入或輸出文件,原則上都可以包含任意數量的流。FFmpeg 中流的類型有五種:視頻(video)、音頻(audio)、字幕(subtitle)、附加數據(attachment)、普通數據(data)。文件中流的數量和(或)流類型種數的極限值由文件封裝格式決定。選擇哪一路輸入文件的哪一路流輸出到哪一路輸出,這個選擇過程既可以由 FFmpeg 自動完成,也可以通過 “-map” 選項手動指定(后續 “Stream selection” 章節會深入描述)。
注:關於附加數據(attachment)和普通數據(data)的說明如下:
Attachments could be liner notes, related images, metadata files, fonts, etc.
Data tracks would be for things like timecode, navigation items, cmml, streaming tracks.
參考資料[3] “What are the the data and attachment stream type?”
命令行中的輸入文件及輸入文件中的流都可以通過對應的索引引用,文件、流的索引都是從 0 開始。例如,2:4 表示第 3 個輸入文件中的第 5 個流。(后面 6.3 節 “stream specifier” 章節會詳細介紹)。
一個通用規則是:輸入/輸出選項(options)作用於跟隨此選項后的第一個文件。因此,順序很重要,並且可以在命令行中多次指定同一選項。每個選項僅作用於離此選項最近的下一輸入或輸出文件。全局選項不受此規則限制。
不要把輸入文件和輸出文件混在一起———應該先將輸入文件寫完,再寫輸出文件。也不要把不同文件的選項混在一起,各選項僅對其下一輸入或輸出文件有效,一個選項不能跨越一個文件傳遞到后續文件。
舉幾個命令行例子:
■ 設置輸出文件碼率為 64 kbit/s:
ffmpeg -i input.avi -b:v 64k -bufsize 64k output.avi
其中 “-b:v 64k” 和 “-bufsize 64k” 是輸出選項。
■ 強制輸入文件幀率(僅對 raw 格式有效)是 1 fps,輸出文件幀率為 24 fps:
ffmpeg -r 1 -i input.m2v -r 24 output.avi
其中 “-r 1” 是輸入選項,“-r 24” 是輸出選項。
■ 轉封裝:將 avi 格式轉為 mp4 格式,並將視頻縮放為 vga 分辨率:
ffmpeg -y -i video.avi -s vga video.mp4
其中 “-y” 是全局選項,“-s vga” 是輸出選項。
3. 轉碼過程
_______ ______________
| | | |
| input | demuxer | encoded data | decoder
| file | ---------> | packets | -----+
|_______| |______________| |
v
_________
| |
| decoded |
| frames |
|_________|
________ ______________ |
| | | | |
| output | <-------- | encoded data | <----+
| file | muxer | packets | encoder
|________| |______________|
“ffmpeg” 調用 libavformat 庫(包含解復用器 demuxer),從輸入文件中讀取到包含編碼數據的包(packet)。如果有多個輸入文件,“ffmpeg” 嘗試追蹤多個有效輸入流的最小時間戳(timestamp),用這種方式實現多個輸入文件的同步。
然后編碼包(packet)被傳遞到解碼器(decoder),解碼器解碼后生成原始幀(frame),原始幀可以被濾鏡(filter)處理(圖中未畫濾鏡),經濾鏡處理后的幀送給編碼器,編碼器將之編碼后輸出編碼包。最終,由復用器(muxex)將編碼包寫入特定封裝格式的輸出文件。
4. 濾鏡
在多媒體處理中,術語 濾鏡(filter) 指的是修改未編碼的原始音視頻數據幀的一種軟件工具。濾鏡分為音頻濾鏡和視頻濾鏡。FFmpeg 提供了很多內置濾鏡,可以用很多方式將這些濾鏡組合使用。通過一些復雜指令,可以將解碼后的幀從一個濾鏡引向另一個濾鏡。這簡化了媒體處理,因為有損編解碼器對媒體流進行多次解碼和編碼操作會降低總體質量,而引入濾鏡后,不需要多次解碼編碼操作,相關處理可以使用多個濾鏡完成,而濾鏡處理的是原始數據,不會造成數據損傷。
4.1 濾鏡的使用
FFmpeg 的 libavfilter 庫提供了濾鏡 API,支持多路輸入和多路輸出。
濾鏡(filter)的語法為:
[input_link_lable1][input_link_lable2]... filter_name=parameters [output_link_lable1][output_link_lable12]...
上述語法中,輸入輸出都有連接標號(link lable),連接符號是可選項,輸入連接標號表示濾鏡的輸入,輸出連接標號表示濾鏡的輸出。連接標號通常用在濾鏡圖中,通常前一個濾鏡的輸出標號會作為后一個濾鏡的輸入標號,通過同名的標號將濾鏡及濾鏡鏈連接起來。連接標號的用法參考 4.3.2 節示例。
示例1:
ffplay -f lavfi -i testsrc -vf transpose=1
“-vf”(同“-filter:v”)選項表示使用視頻濾鏡,“transpose=1” 是濾鏡名稱及參數,此行命令表示使用 transpose 視頻濾鏡產生一個順時針旋轉 90 度的測試圖案
示例2:
ffmpeg -i input.mp3 -af atempo=0.8 output.mp3
“-af”(同“-filter:a”)選項表示使用音頻濾鏡,“atempo=0.8” 是濾鏡名稱及參數,此行命令表示使用 atempo 音頻濾鏡將輸入音頻速率降低到 80% 后寫入輸出文件
注意:有些濾鏡只會修改幀屬性而不會修改幀內容。例如,fps 濾鏡,setpts 濾鏡等。
4.2 濾鏡鏈的使用
濾鏡鏈(filterchain) 是以逗號分隔的濾鏡(filter)序列,語法如下:
filter1,fiter2,filter3,...,filterN-2,filterN-1,filterN
濾鏡鏈中如果有空格,需要將濾鏡鏈用雙引號括起來,因為命令行中空格用於分隔參數。
示例1:
ffmpeg -i input.mpg -vf hqdn3d,pad=2*iw output.mp4
“hqdn3d,pad=2*iw” 是 filterchain,此 filterchain 中第一個 filter 是 “hqdn3d”(降噪);第二個 filter 是 “pad=2*iw”(將圖像寬度填充到輸入寬度的 2 倍)。此行命令表示,將輸入視頻經降噪處理后,再填充視頻寬度為輸入寬度的 2 倍。
4.3 濾鏡圖的使用
濾鏡圖(filtergraph) 通常是以分號分隔的濾鏡鏈(filterchain)序列。濾鏡圖分為簡單濾鏡圖和復雜濾鏡圖。
濾鏡圖(filtergraph)的語法如下:
filter1;fiter2;filter3;...;filterN-2;filterN-1;filterN
4.3.1 簡單濾鏡圖
簡單濾鏡圖只能處理單路輸入流和單路輸出流,而且要求輸入和輸出具有相同的流類型。
簡單濾鏡圖由 “-filter” 選項指定。簡單濾鏡圖示意圖如下:
_______ _____________________ ________
| | | | | |
| input | ---> | simple filter graph | ---> | output |
|_______| |_____________________| |________|
4.3.2 復雜濾鏡圖
復雜濾鏡圖用於簡單濾鏡圖處理不了的場合。比如,多路輸入流和(或)多路輸出流,或者輸出流與輸入流類型不同。
有些特殊的濾鏡(filter)本身就屬於復雜濾鏡圖,用 “-filter_complex” 選項或 “-lavfi” 選項指定,如 overlay 濾鏡和 amix 濾鏡就是復雜濾鏡圖。overlay 濾鏡有兩個視頻輸入和一個視頻輸出,將兩個輸入視頻混合在一起。而 amix 濾鏡則是將兩個輸入音頻混合在一起。
復雜濾鏡圖示意圖如下:
_________
| |
| input 0 |\ __________
|_________| \ | |
\ _________ /| output 0 |
\ | | / |__________|
_________ \| complex | /
| | | |/
| input 1 |---->| filter |\
|_________| | | \ __________
/| graph | \ | |
/ | | \| output 1 |
_________ / |_________| |__________|
| | /
| input 2 |/
|_________|
■ 示例1:
ffmpeg -i INPUT -vf "split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2" OUTPUT
上例中 “split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2” 是復雜濾鏡圖,由三個濾鏡鏈構成(分號分隔),第二個濾鏡鏈 “[tmp] crop=iw:ih/2:0:0, vflip [flip]” 由兩個濾鏡構成(逗號分隔)。第一個濾鏡鏈中:濾鏡 split 產生兩個輸出 [main] 和 [tmp];第二個濾鏡鏈中:[tmp] 作為 crop 濾鏡的輸入,[flip] 作為 vflip 濾鏡的輸出,crop 濾鏡輸出連接到 vflip 濾鏡的輸入;第三個濾鏡鏈中:[main] 和 [flip] 作為 overlay 濾鏡的輸入。整行命令實現的功能是:將輸入分隔為兩路,其中一路經過裁剪和垂直翻轉后,再與另一路混合,生成輸出文件。示意圖如下所示:
[main]
input --> split ---------------------> overlay --> output
| ^
|[tmp] [flip]|
+-----> crop --> vflip -------+
4.3.3 濾鏡圖中的連接標號
在濾鏡圖中可以使用連接標號(link lable),連接標號表示特定濾鏡/濾鏡鏈的輸入或輸出,參 4.1 節。
例如,我們想要把一個經過降噪處理后的輸出文件與輸入原文件進行比較,如果不使用帶連接標號的濾鏡圖,我們需要至少兩條命令:
ffmpeg -i input.mpg -vf hqdn3d,pad=2*iw output.mp4`
ffmpeg -i output.mp4 -i input.mpg -filter_complex overlay=w compare.mp4
如果使用帶有連接標號的濾鏡圖,則一條命令就可以了:
ffplay -i i.mpg -vf split[a][b];[a]pad=2*iw[A];[b]hqdn3d[B];[A][B]overlay=w
4.4 濾鏡使用總結
濾鏡(廣義)通常以濾鏡鏈(filterchain, 以逗號分隔的濾鏡序列)和濾鏡圖(filtergraph, 以分號分隔的濾鏡序列)的形式使用。濾鏡鏈由濾鏡構成,濾鏡圖由濾鏡鏈構成,這樣可以提供復雜多樣的組合方式以應對不同的應用場景。
濾鏡(狹義)是濾鏡鏈的簡單特例,濾鏡鏈是濾鏡圖的簡單特例。比如,一個濾鏡圖可以只包含一個濾鏡鏈,而一個濾鏡鏈也可以只包含一個濾鏡,這種特例情況下,一個濾鏡圖僅由單個濾鏡構成。
FFmpeg 的命令行中,濾鏡(廣義)的出現形式有濾鏡(狹義)、濾鏡鏈、濾鏡圖三種形式,但濾鏡(狹義)和濾鏡鏈可以看作是特殊的濾鏡圖,因此,為了簡便,FFmpeg 的命令行中濾鏡相關選項,只針對濾鏡圖(filtergraph)概念,分為如下兩類:
- 針對簡單濾鏡圖的選項:“-vf” 等同 “-filter:v”,“-af” 等同 “-filter:a”
- 針對復雜濾鏡圖的選項:“-lavfi” 等價於 “-filter_complex”
5. 流拷貝
“-codec copy” 選項可以使能流拷貝(stream copy)模式。流拷貝直接將輸入流拷貝到輸出,僅涉及解復用和復用,不涉及解碼和編碼,因此也不支持濾鏡操作。流拷貝對於修改容器格式或容器級別元數據非常有用。因為不涉及編解碼操作,整個過程會非常快。
流拷貝示意圖如下所示:
_______ ______________ ________
| | | | | |
| input | demuxer | encoded data | muxer | output |
| file | ---------> | packets | -------> | file |
|_______| |______________| |________|
6. 流選擇
有些容器,如 AVI、MP4 等,可以包含多種不同類型的流。FFmpeg 可以識別 5 種流類型:音頻(audio, a),視頻(video, v),字幕(subtitle, s),附加數據(attachment, t)和普通數據(data, d)。
流選擇(stream selection) 是從輸入文件中選定某些流進行處理。流選擇有兩種模式,1) 使用 “-map” 選項手動指定要選擇的流;2) 無 “-map” 選項時由 FFmpeg 根據相應規則自動選擇流。
6.1 流選擇自動模式
自動選擇模式下,每種類型的流只選擇一路,規則如下:
- 音頻流:選擇具有最多通道的流,若多個音頻流通道數相同且通道數最多,則選第一個
- 視頻流:選擇具有最高分辨率的流,若多個視頻流分辨率相同且是最高分辨率,則選第一個
- 字幕流:選擇第一個字幕流。注意:字幕流有文本字幕流和圖形字幕流,輸出格式默認的字幕編碼器僅處理其支持的字幕類型
6.2 流選擇手動模式
手動選擇模式下,要選定的流由 “-map” 選項后的流指定符 stream_specifer 指定。stream_specifier 語法如下:
[-]file_index:stream_type[:stream_index]
帶 “-” 表示排除此流,不帶 “-” 表示選中此流。文件序號 file_index 和流序號 stream_index 都是從 0 開始計數。
幾個特殊的 stream_specifier 如下:
- -map 0 選擇所有類型的所有流。
- -map i:v 選擇文件i中所有的視頻流,i:a、i:s 等同理。
- -map -vn 排除所有視頻流,-an、-sn 等同理。
示例:假設ffmpeg命令行如下:
ffmpeg -i file1 -i file2 select_streams output
其中有兩個輸入文件 file1 和 file2,選擇的流位於 select_streams
file1 的流組成與對應的 stream_specifier 如下:
file streams stream_specifier
1st video 0:v:0
2nd video 0:v:1
1st audio 0:a:0
2nd audio 0:a:1
1st subtitle 0:s:0
2nd subtitle 0:s:1
3rd subtitle 0:s:2
file2 的流組成與對應的 stream_specifier 如下:
file streams stream_specifier
1st video 1:v:0
1st audio 1:a:0
1st subtitle 1:s:0
select_streams各種示例說明如下:
-map 0 -map 1
選擇兩個文件的所有流
-map 0:s:2 -map 1:v:0 -map 1:a:0
選擇 file1 的 3rd 字幕流,file2 的 1st 視頻流和 file2 的 1st 音頻流
-map 0 -map 1:s:0 -an
選擇 file1 除音頻外的所有流和 file2 的 1st 字幕流
-map 0 -map 1 -map -0:v:0 -map -0:a:1
選擇除 file1 的 1st 視頻流和 2nd 音頻流外的所有流,選擇 file2 中的所有流
6.3 stream_specifier
有些選項(比如設置碼率、設置編解碼器)是針對流的。一個選項具體作用於哪些流,由選項后跟隨的 stream_specifier 指定。
stream_specifier 附在選項后面,由 “:” 分隔。例如:“-codec:
stream_specifier 可以匹配一路流或多路流,對應的選項可作用於 stream_specifier 匹配的這些流。一個空的 stream_specifier 將匹配所有的流。例如:“-b:a 128k” 匹配所有音頻流,而 “-codec copy” 或 “-codec: copy” 則匹配所有流。
除上一節所述 “-map” 選項外,stream_specifier 還可用在很多其他選項中,形式有如下幾種:
specifer 形式 描述
stream_index 選擇索引為 stream_index 的流
stream_type[:stream_index] 選擇類型為 stream_type 索引為 stream_index 的流
p:program_id[:stream_index] 選擇節目 program_id 中索引為 stream_index 的流
stream_id 選擇指定 id 的流
例如,使用 “-b” 選項設置音頻流和視頻流的碼率:
ffmpeg -i input.mpg -b:a 128k -b:v 1500k output.mp4
■ 示例1:-codec 選項和 -map 選項聯合使用中的 stream_specifier
ffmpeg -i 16dvbsubtitles.trp -c:v copy -map 0:v -c:a copy -map 0:a -c:s:0 copy -map 0:s:0 -c:s:1 copy -map 0:s:3 16dvbsubtitles.ts
上述命令實現:將輸入文件中所有視頻流、所有音頻流、第 1 路字幕流和第 4 路字幕流拷貝到輸出文件中。-c:v 等同於 -codec:v 或 -vcodec,-c:a 等同於 -codec:a 或 -acodec,-c:s 等同於 -codec:s 或 -scodec。
注意:字幕流選項 “-c:s:0 copy -map 0:s:0 -c:s:1 copy -map 0:s:3” 中 -map 參數針對的是源文件中的流,而編碼器選項 -c:s:0 針對的則是 -map 選項選中的流,因為 -map 選項總共選了兩路字幕流,所以編碼器選項只能出現 -c:s:0 和 -c:s:1,而不能出現 -c:s:2。如下命令都是錯誤的:
ffmpeg -i 16dvbsubtitles.trp -c:v copy -map 0:v -c:a copy -map 0:a -c:s:0 copy -map 0:s:0 -c:s:4 copy -map 0:s:3 16dvbsubtitles.ts
ffmpeg -i 16dvbsubtitles.trp -c:v copy -map 0:v -c:a copy -map 0:a -c:s:0 copy -map 0:s:0 -map 0:s:3 16dvbsubtitles.ts
如下命令則是正確的:
ffmpeg -i 16dvbsubtitles.trp -c:v copy -map 0:v -c:a copy -map 0:a -c:s copy -map 0:s:0 -map 0:s:3 16dvbsubtitles.ts
ffmpeg -i 16dvbsubtitles.trp -c:v copy -map 0:v -c:a copy -map 0:a -c:s:1 copy -map 0:s:0 -c:s:0 copy -map 0:s:3 16dvbsubtitles.ts
6.4 擴展1:復雜濾鏡圖中的流選擇
如果某個復雜 filtergraph 中的輸出流未攜帶標號,則這些流將被添加到第一個輸出文件中。如果封裝器格式不支持這些流中的某種流類型,將會導致致命錯誤。
如果未使用 “-map” 選項,包含這些復雜 filtergraph 輸出流將導致不會對這些類型的流啟用自動選擇。
如果使用了 “-map” 選項,除 “-map” 選定的流之外,這些 filtergraph 輸出流也會被包含進來。
復雜 filtergraph 的輸出流若帶標號,則標號必須被映射一次,且只能被映射一次。
假設有三個輸入文件用於示例,其流組成成分如下:
input file 'A.avi'
stream 0: video 640x360
stream 1: audio 2 channels
input file 'B.mp4'
stream 0: video 1920x1080
stream 1: audio 2 channels
stream 2: subtitles (text)
stream 3: audio 5.1 channels
stream 4: subtitles (text)
input file 'C.mkv'
stream 0: video 1280x720
stream 1: audio 2 channels
stream 2: subtitles (image)
■ 示例1:無標號 filtergraph 的流選擇
ffmpeg -i A.avi -i C.mkv -i B.mp4 -filter_complex "overlay" out1.mp4 out2.srt
“-filter_complex” 選項指定了一個復雜 filtergraph,此 filtergraph 由單個視頻濾鏡 overlay 構成。overlay 濾鏡需要兩個視頻輸入,但此處並未為 overlay 濾鏡指定輸入,因此輸入中的頭兩個有效視頻流(A.avi 中的 stream 0 和 C.mkv 中的 stream0)會被作為 overlay 濾鏡的輸入。overlay 濾鏡輸出無標號,因此 overlay 濾鏡的輸出會被寫入第一個輸出文件 out1.mp4 中。
本來自動選擇模式會選中 B.mp4 中的 “stream 0” 視頻流(最高分辨率)和 B.mp4 中的 “stream 3” 音頻流(最多通道數)。但 overlay 濾鏡輸出流是視頻流類型,因此,不會對視頻流進行自動選擇,即不會選擇 B.mp4 中的 “stream 0”。
不會選中任何字幕流,因為 MP4 封裝格式未注冊默認字幕編碼器,用戶也未指定字幕編碼器,無編碼器可用所以不會選擇字幕流。
第二個輸出文件 out2.srt,僅接受文本類型的字幕流。所以,就算 C.mkv 中的 “stream 2” 是第一個被找到的字幕流,也會因類型不符合被忽略掉。B.mp4 中的“stream 2” 會被選中,因為它才是第一個文本字幕流。
■ 示例2:帶標號filtergraph的流選擇
ffmpeg -i A.avi -i B.mp4 -i C.mkv -filter_complex "[1:v]hue=s=0[outv];overlay;aresample" \
-map '[outv]' -an out1.mp4 \
out2.mkv \
-map '[outv]' -map 1:a:0 out3.mkv
上述命令會執行失敗,因為 filtergraph 的輸出標號 [outv] 被映射了兩次。此命令不會生成任何輸出文件。
ffmpeg -i A.avi -i B.mp4 -i C.mkv -filter_complex "[1:v]hue=s=0[outv];overlay;aresample" \
-an out1.mp4 \
out2.mkv \
-map 1:a:0 out3.mkv
上述命令也會執行失敗,因為 hue 濾鏡有一個輸出標號 [outv],但此標號未作任何映射。
正確的命令應該寫成下面這樣:
ffmpeg -i A.avi -i B.mp4 -i C.mkv -filter_complex "[1:v]hue=s=0,split=2[outv1][outv2];overlay;aresample" \
-map '[outv1]' -an out1.mp4 \
out2.mkv \
-map '[outv2]' -map 1:a:0 out3.mkv
“[1:v]” 表示 B.mp4 中的視頻流,B.mp4 中的視頻流被發送到 hub 濾鏡,hub濾鏡的輸出被 split 濾鏡拷貝了一份,生成兩份輸出,兩份輸出用標號 [outv1] 和 [outv2] 表示。
overlay 濾鏡需要兩個視頻輸入,但濾鏡輸入未帶標號,所以使用頭兩個未使用的視頻流作輸入,即 A.avi 和 C.mkv 中的視頻流(B.mp4 中的視頻流已被 hub 濾鏡使用)。overlay 濾鏡輸出未帶標號,所以 overlay 濾鏡輸出被發送到第一個輸出文件 out1.mp4,有沒有 “-map” 選項對此無影響。
aresample 濾鏡需要一個音頻輸入,但濾鏡輸入未帶標號,因此使用第一個未使用的音頻流(A.avi中的 “stream 1”)作為輸入。aresample 濾鏡輸出也未帶標號,所以 avresample 濾鏡輸出也被映射到第一個輸出文件 out1.mp4。“-an” 選項僅僅抑制了音頻流的自動或手動流選擇,而不會抑制 filtergraph 的輸出,所以 avresample 濾鏡輸出的音頻流會成功輸出到 out1.mp4 中。
所以,out1.mp4 有三個輸入流:1) overlay 濾鏡輸出、2) aresample 濾鏡輸出 和 3) 標號 outv1,out1.mp4 中 1) 2) 排序應在 3) 之前。
映射到 out2.mkv 的視頻、音頻和字幕流由自動選擇模式選定。
out3.mkv 由 hue 濾鏡輸出和 B.mp4 中的 “stream 1” 構成。
6.5 擴展2:流處理
流處理(stream handling)和流選擇是互不影響的(字幕例外)。流處理通過 “-codec” 選項設置,“-codec” 選項針對輸出文件中的流。FFmpeg 對 “-codec” 選項的處理是在流選擇(stream selection)過程之后的,因此 -codec 選項(流處理)不會影響流選擇。如果某類型的流未指定 “-codec”選項,將會使用輸出文件 muxer 注冊的默認編碼器。
上述規則不適用於字幕。如果一個輸出文件指定了字幕編碼器,那么找到的第一個字幕流(文本字幕或圖形字幕)總會被包含進來。FFmpeg 不會檢查編碼器是否能轉換選定的流或已轉換的流能否被輸出格式接受。這通常也適用:當用戶手動設置編碼器時,流選擇過程不能檢查編碼流是否可以復用到輸出文件中。如果編碼流不能復用到輸出文件,FFmpeg 會終止,所有的輸出文件處理會失敗。
7. 參考資料
[1] FFmpeg Basics
[2] ffmpeg.html,http://ffmpeg.org/ffmpeg.html
[3] ffmpeg-all.html, http://ffmpeg.org/ffmpeg-all.html
[4] What are the the data and attachment stream type?, https://ffmpeg.org/pipermail/ffmpeg-user/2015-June/027333.html
[5] Solutions to some ffmpeg errors and messages
8. 修改記錄
2018-12-15 V1.0 首次整理
2019-02-15 V1.1 完善stream_specifier章節,補充選項章節與示例章節
2019-02-16 V1.1 增加視頻截圖命令行示例
2019-02-19 V1.2 整理完善濾鏡章節
2019-02-23 V1.3 命令行選項與命令行示例拆分出去單獨成文
2020-03-26 V1.3 修改文字錯誤
