
我有一個視訊檔案(時長 1 小時)。我需要將視訊檔案(30 分鐘)的任何部分轉換為音訊文件
ffmpeg -ss 00:30:00 -t 01:00:00 -i /opt/a.mp4 -vcodec copy -acodec copy /opt/b.mp4
然後我用了
ffmpeg -ss 00:30:00 -t 01:00:00 -i /opt/a.mp4 -acodec copy /opt/b.mp4
但我仍然可以觀看視訊和音訊。我只需要音訊文件
答案1
如果您只需要音訊(我希望我理解正確),那麼您根本不需要第一步。如果您使用:
ffmpeg -ss 00:30:00 -t 01:00:00 -i /opt/a.mp4 -vn -acodec copy /opt/b.mp3
它會做到的假如原來的音訊編解碼器是mp3。如果沒有,您可以強制重新編碼:
ffmpeg -ss 00:30:00 -t 01:00:00 -i /opt/a.mp4 -vn -acodec libmp3lame ...other_parameters.. /opt/b.mp3
將other_parameters
有比特率等。
答案2
有兩種主要方法可以從包含視訊或音訊的檔案中獲取兩者。預設情況下流選擇ffmpeg 中的行為將為每種流類型選擇一個流。請注意,輸入可以包含多種串流類型:視訊、音訊、字幕和資料。有些輸入甚至可以包含其中每種流類型的多個;例如兩個視訊串流。
-vn
或者-an
這些選項告訴 ffmpeg 忽略視訊 ( -vn
) 或音訊 ( -an
)。
若要省略影片並複製音訊:
ffmpeg -i input -vn -codec:a copy output.mka
若要省略音訊並複製影片:
ffmpeg -i input -an -codec:v copy output.mkv
這些例子將串流複製所需的流。這意味著 ffmpeg 將簡單地重新復用它而不是重新編碼。這非常快,而且由於本質上是“複製和貼上”,因此不會影響品質。
使用
-vn
和-an
不會忽略可能存在的其他串流,例如字幕或資料流,但純音訊格式無論如何都會忽略這些。
-map
這-map
選項可能看起來更複雜,但更靈活和有用。例如,-vn
告訴 ffmpeg 僅省略視訊串流,但使用流說明符 -map
可以告訴 ffmpeg 忽略除所需流之外的所有內容。
僅複製影片:
ffmpeg -i input -map 0:v -codec copy output.mkv
僅複製音訊:
ffmpeg -i input -map 0:a -codec copy output.mka
這
0:v
是一個串流說明符,告訴 ffmpeg 僅包含第一個輸入中的0
視訊串流v
。這可以進一步擴展。如果您的輸入包含多個視訊串流並且您只需要第一個視訊串流,則使用0:v:0
方法和 會很有用。first input:video:first video stream
請參閱 ffmpeg 控制台輸出以找出輸入中流的順序。您也可以使用負映射。使用
-map 0 -map -0:a:1
將映射除第二個音訊串流之外的所有串流。-map 0
告訴 ffmpeg 包含來自輸入0
(第一個輸入)的所有串流,然後-map -0:a:1
告訴 ffmpeg 忽略來自第一個輸入的第一個音訊串流。
答案3
第一部分是對的。在第二部分中,僅提取 b.mp4 檔案的音訊。
ffmpeg -i b.mp4 -vn -acodec copy audio_b.mp3