用ffmpeg合并视频和音频。在音频未结束时循环播放视频

问题描述:

我试图将音频文件与视频文件合并。 我有两个选择:用ffmpeg合并视频和音频。在音频未结束时循环播放视频

  • 有一个非常小的视频文件(例如,10秒)循环而音频文件还没有结束。

  • 有一个很长的视频文件(比我的任何音频文件都长),我可以在其上附加音频文件。我想在音频完成时剪切视频。

我使用后者与ffmpeg的-t选项。这意味着我必须获取音频文件的持续时间才能将其输入到ffmpeg中。可以避免这一步吗?

第一个解决方案的任何指针?

通过使用ffmpeg的-shortest选项很容易解决第二个问题。请参阅:http://www.ffmpeg.org/ffmpeg-doc.html#SEC12了解更多详情。

的第一个,尝试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

对于第一点我看不到直接的命令。我建议使用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脚本转换为批处理脚本。

的更多信息:

希望这有助于!