用ffmpeg合并视频和音频。在音频未结束时循环播放视频
问题描述:
我试图将音频文件与视频文件合并。 我有两个选择:用ffmpeg合并视频和音频。在音频未结束时循环播放视频
有一个非常小的视频文件(例如,10秒)循环而音频文件还没有结束。
有一个很长的视频文件(比我的任何音频文件都长),我可以在其上附加音频文件。我想在音频完成时剪切视频。
我使用后者与ffmpeg的-t选项。这意味着我必须获取音频文件的持续时间才能将其输入到ffmpeg中。可以避免这一步吗?
第一个解决方案的任何指针?
答
的第一个,尝试ffmpeg -i yourmovie.mp4 -loop 10
循环输入10次
答
对于第一点我看不到直接的命令。我建议使用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脚本转换为批处理脚本。
的更多信息:
希望这有助于!
-loop_input已弃用,请使用-loop 1 请注意,这两个循环选项仅适用于-f image2 – puchu 2012-03-05 18:42:29
无法使用-loop 10或-loop 1工作。我正在尝试将mp4视频(3分钟)循环播放2小时的音频。 – Sun 2014-12-31 22:01:23