[FFmpeg] 挑選輸入串流 (Streams) / 軌道 (Tracks)

FFmpeg

簡介與其他資料:
 http://www.mobile01.com/topicdetail.php?f=510&t=3734550

其他範例:
  http://www.mobile01.com/topicdetail.php?f=510&t=4487462


串流說明符

有些選項應用於每個串流,例如位元率或編解碼器。
串流說明符被用來精準的指定一個給定的選項屬於哪些串流。

串流說明符可用下列組合:

串流索引
匹配串流的索引。例如 "1" 即代表第2個串流。

串流類型:串流索引
匹配相同的類型與索引。例如 "a:2" 為第二個音訊串流。

串流類型
匹配串流的類型。例如 "a" 為音訊串流。
可用類型: v (Video, 視訊), a (Audio, 音訊), s (Subtitle, 字幕), d (Data, 資料), t (Attachment, 附件)。


指定某選項用於某串流

規則:
-選項[:串流說明符] [設定值]


"全部輸出音訊串流" 使用 libfdk_aac 重新編碼為 AAC 2ch 320kbps:
ffmpeg -input.mkv -ac:a 2 -c:v copy -c:a libfdk_aac -b:a 320k output.mkv

"第1個(#0)輸出音訊串流" 使用 libfdk_aac 重新編碼為 AAC 2ch 320kbps:
ffmpeg -input.mkv -ac:a:0 2 -c:v copy -c:a:0 libfdk_aac -b:a:0 320k output.mkv

"第3個(#2)輸出串流" 使用 libfdk_aac 重新編碼為 AAC 2ch 320kbps:
ffmpeg -input.mkv -ac:2 2 -c:v copy -c:2 libfdk_aac -b:2 320k

  ※若 "第3輸出串流" 不是音訊串流則會失敗


選取串流

-map [輸入檔ID][:串流說明符]
  選取串流。
  當使用 -map 選取串流時,其他未被選取的串流全都會被禁用。

例:
'-map 0'
選取第1個輸入檔的全部串流。
'-map a'
選取全部輸入檔的全部音訊串流。
'-map 1:1'
選取第2個輸入檔的第2個串流。
'-map 1:a'
選取第2個輸入檔的全部音訊串流。
'-map 0:a:1'
選取第1個輸入檔的第2個音訊串流。
'-map 0:m:language:eng'
選取第1個輸入檔的英語音訊串流。

--------------------------------

假設要轉換一個影片檔 - input.m2ts

首先使用下列命令取得 input.m2ts 的訊息:
ffmpeg -hide_banner -i input.m2ts

假設上述命令執行結果如下:

Input #0, mpegts, from 'input.m2ts':
Stream #0:0: Video: h264
Stream #0:1: Audio: truehd
Stream #0:2: Audio: ac3

(使用 -hide_banner 會隱藏 FFmpeg 版本與組態訊息)

如上,由輸出結果可以發現 input.m2ts 內有多個串流
如果不使用 -map 則 FFmpeg 會自動選擇串流

--------------------------------

重新封裝:
ffmpeg -hide_banner -i input.m2ts -codec copy output.mp4

執行結果如下:

Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #0:2 -> #0:1 (copy)

複製串流將會自動選取輸出檔案格式(MP4)所支援的輸入編碼格式

--------------------------------

重新編碼:
ffmpeg -hide_banner -i input.m2ts -codec:v copy -codec:a libfdk_aac output.mp4

執行結果如下:

Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #0:1 -> #0:1 (truehd (native) -> aac (libfdk_aac))

重新編碼將會自動選取優先率高的輸入串流

--------------------------------

需要強制選擇串流,可以使用 -map 來選取所需的輸入串流 (可重複)
而 -map 的順序將會決定輸出串流的排列順序

如果要選取第2個輸入串流,可用 -map 0:1
同時,第2個輸入串流同時也是第1個輸入音訊串流,所以也可用 -map 0:a:0

以下示範如何選取多個串流

完整命令:
ffmpeg -hide_banner -i input.m2ts -map 0:0 -map 0:1 -map 0:2 -map 0:1 -codec copy output.mkv

執行結果如下:

Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #0:1 -> #0:1 (copy)
Stream #0:2 -> #0:2 (copy)
Stream #0:1 -> #0:3 (copy)

從執行結果可以得知 -map 選項的排序即輸出串流排序

--------------------------------

承上,以下示範如何分別設定多個串流

完整命令:
ffmpeg -hide_banner -i input.m2ts -map 0:0 -map 0:1 -map 0:2 -map 0:1 -c:0 libx264 -crf:0 20 -c:1 flac -c:2 copy -c:3 libfdk_aac -ac:3 2 -b:3 320k output.mkv

執行結果如下:

Stream mapping:
Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
Stream #0:1 -> #0:1 (truehd (native) -> flac (native))
Stream #0:2 -> #0:2 (copy)
Stream #0:1 -> #0:3 (truehd (native) -> aac (libfdk_aac))

如上,如果要設定第4個輸出串流 (#0:3) 用 libfdk_aac 重新編碼,可用 -codec:3 libfdk_aac
同時,第4個輸出串流同時也是第3個輸出音訊串流,所以也可用 -codec:a:2 libfdk_aac
2014-12-17 19:19 #1
限制級
您即將進入之討論頁 需滿18歲 方可瀏覽。
提醒:內容可能因過於寫實、驚悚而令人感到不舒服,是否繼續觀看?

根據「電腦網路內容分級處理辦法」修正條文第六條第三款規定,已於該限制級網頁,依台灣網站分級推廣基金會規定作標示。
評分
複製連結