2011-02-16 329 views
16

我試圖將音頻文件與視頻文件合併。 我有兩個選擇:用ffmpeg合併視頻和音頻。在音頻未結束時循環播放視頻

  • 有一個非常小的視頻文件(例如,10秒)循環而音頻文件還沒有結束。

  • 有一個很長的視頻文件(比我的任何音頻文件都長),我可以在其上附加音頻文件。我想在音頻完成時剪切視頻。

我使用後者與ffmpeg的-t選項。這意味着我必須獲取音頻文件的持續時間才能將其輸入到ffmpeg中。可以避免這一步嗎?

第一個解決方案的任何指針?

回答

-2

的第一個,嘗試ffmpeg -i yourmovie.mp4 -loop 10循環輸入10次

+4

-loop_input已棄用,請使用-loop 1 請注意,這兩個循環選項僅適用於-f image2 – puchu 2012-03-05 18:42:29

+1

無法使用-loop 10或-loop 1工作。我正在嘗試將mp4視頻(3分鐘)循環播放2小時的音頻。 – Sun 2014-12-31 22:01:23

-1

對於第一點我看不到直接的命令。我建議使用ffprobe來計算這兩個文件的持續時間,並計算在音頻持續時間內需要播放的視頻循環數。

以下將導致輸入的持續時間。

ffprobe -i input_media -show_entries format=duration -v quiet -of csv="p=0" 

然後,您可以手動循環播放視頻,直到您滿足視頻實例的計算值。

ffmpeg -i input_audio -f concat -i <(for i in {1..n}; do printf "file '%s'\n" input_video; done) -c:v copy -c:a copy -shortest output_video 

1..n表示視頻需要循環的次數。因爲您已經計算了音頻的持續時間,所以您可以使用-t而不是-shortest

以下是關聯的shell腳本。

#!/bin/bash 
audio_duration=$(ffprobe -i ${1} -show_entries format=duration -v quiet -of csv="p=0") 
video_duration=$(ffprobe -i ${2} -show_entries format=duration -v quiet -of csv="p=0") 
n_loops=$(echo "(${audio_duration}/${video_duration}) + 1"|bc) 
ffmpeg -i ${1} -f concat -i <(for i in {1..${n_loops}}; do printf "file '%s'\n" ${2}; done) -c:v copy -c:a copy -shortest ${3} 

對於windows,您可以將此shell腳本轉換爲批處理腳本。

的更多信息:

希望這有助於!