
我正在嘗試將視訊/音訊從 mkv 容器複製到 mp4。當我跑步時,ffmpeg -i input.mkv -c:v copy -c:a copy output.mp4
我沒有看到帶有優美音頻的視頻。只有一個視訊串流,串流#0:0。流 #0:1 是波蘭語音頻,#0:2 英語,#0:3 - #0:5 是字幕。
我讀FFmpeg 維基:地圖但並不真正理解它。為什麼-map 0:1
範例1中寫了兩次?有什麼-c:s
作用?將 #0:0 複製到視訊並將 #0:2 複製到音訊的命令是什麼樣的?
答案1
-map <inputNo>:<streamNo>
告訴 ffmpeg 獲取流流號從輸入輸入號並將其添加到輸出中,其中<inputNo>
以 0 開頭。
有時,您可能想要兩次使用相同的輸入流(例如-map 0:1 -map 0:1
範例中),因為您可以使用不同的編解碼器/參數對每個輸入流進行編碼。在範例中,輸出包含兩次相同的音訊串流,一次為 MP3,另一次為 AAC。
預設情況下(即根本沒有-map
命令),將從輸入中獲取一個視訊、一個音訊和一個字幕串流。如果您想要映射來自一個輸入的所有流,請使用-map <inputNo>
。
您無法使用命令獲取視訊只能意味著一件事:您的視訊軌道使用可以在 MKV 中混合的編解碼器進行編碼,但不能在 MP4 中混合。所以它會被自動丟棄。您可以發布一個日誌ffmpeg -i input.mkv
,以便我們可以檢查曲目使用哪些編解碼器進行編碼嗎?
最後,-c:s
用於字幕編解碼器(同時-c:a
用於音訊和-c:v
視訊)
答案2
這個例子讓我明白了。想像以下命令:
ffmpeg -i tears_of_steel.mkv -map 0:0 -map 0:2 -map 0:1 -map 0:4 -map 0:3 -c copy tears_of_steel-v2.mkv
以下是 ffmpeg 進行映射的方式:
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #0:2 -> #0:1 (copy)
Stream #0:1 -> #0:2 (copy)
Stream #0:4 -> #0:3 (copy)
Stream #0:3 -> #0:4 (copy)
發生了什麼事?
在指令中,我們只有一個輸入:tears_of_steel.mkv。這就是為什麼我們所有的地圖都以 #0 開頭:...
然後我們寫第一個映射選項:-map 0:0,它指的是我們輸入的第一個流(tears_of_steel.mkv),它可能是視訊串流,但這並不重要。
因為它是第一個映射選項,所以它將映射到輸出檔案 (tears_of_steel-v2.mkv) 中的第一個流。
然後我們寫第二個映射選項:-map 0:2,它引用我們輸入的第三個流。因為它是第二個映射選項,所以它被映射到輸出中的第二個流。
等等...
我在我的 github 上寫了這樣的內容:https://github.com/lingtalfi/ffmpeg-notes/blob/master/ffmpeg-map.md
答案3
以下是-c
(選擇編解碼器)和-map
(選擇串流)選項的工作原理:
-c:a -> select first or best supported audio (transcoded)
-c:a copy -> best supported audio (copied)
-map 0:a -> all audio from 1st input file (transcoded)
-map 1:a:0 -> 1st audio stream from 2nd input file (transcoded)
-map 1:a:1 -c:a copy -> 2nd audio stream from 2nd input file (copied)
要從第一個輸入檔複製所有字幕流而不進行轉碼:
-map 0:s -c:s copy
您的輸出檔案是 mp4,輸入檔案是 mkv,並且您選擇了視訊輸出而不轉碼 ( -c:v copy
) 為 mp4 相容格式,因此您最終會得到一個沒有(可播放)視訊的 mp4 檔案。
指定與 mp4 相容的視訊編碼器,例如。-c:v libx264
而不是-c:v copy
或留空(即不要提及編碼器和 ffmpeg選擇的編碼器將是每個輸出格式註冊的預設編碼器)
如果您不想對視頻進行轉碼(因為這可能需要相當長的時間),則將視頻流複製到同一容器,但選擇您想要的音頻,例如。 mkv。若要取得包含轉碼視訊和選定音訊的 mp4 檔案:
ffmpeg -i input.mkv -map 0:0 -c:v libx264 -map 0:2 -c:a copy output.mp4
答案4
對於像我這樣喜歡簡單工作解釋的人來說,這是一個簡單的答案。當您將 mkv 複製到 mp4 並想要選擇音訊串流:
你必須寫-map 0:流數減去一個-c: 前面的副本
假設影片有 3 個串流(您可以在 mediainfo 中看到)。第一個流是視頻,第二個流是預設音頻,第三個流是您想要的語言的非預設音頻。所以你必須寫 -map 0:2 NOT -map 0:3
另外,你必須寫-map 0:0 位於 -c:v 複製前面因為如果你不這樣做,ffmpeg將不會複製視訊串流,你只會得到音訊串流(如果視訊有兩個視訊串流,你想複製第二個,你必須寫-map 0:1)
所以最終命令列看起來像這樣:
ffmpeg -i "inputpath\input.mkv" -map 0:0 -c:v copy -map 0:2 -c:a copy "outputpath\output.mp4"
在這種情況下,您將獲得第一個視訊串流和第三個音訊串流
另一個例子:
ffmpeg -i "inputpath\input.mkv" -map 0:1 -c:v copy -map 0:6 -c:a copy "outputpath\output.mp4"
在這種情況下,您應該獲得第二個視訊串流和第七個音訊串流
我希望這有幫助