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

33

我正在尝试将音频文件与视频文件合并。

我有两个选项:

  • 使用非常小的视频文件(例如10秒)循环播放,直到音频文件结束。

  • 使用非常长的视频文件(比任何音频文件都要长),在其中附加音频文件。我想在音频完成后剪辑视频。

我正在使用后者,并使用 ffmpeg 的 -t <持续时间(秒)> 选项。这意味着我必须获取音频文件的持续时间并将其提供给 ffmpeg。有没有可能避免这一步?

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

4个回答

40

如果你想将新的音频与视频合并,让视频重复播放直到音频结束,你可以尝试以下方法:

ffmpeg  -stream_loop -1 -i input.mp4 -i input.mp3 -shortest -map 0:v:0 -map 1:a:0 -y out.mp4

使用-stream_loop -1意味着无限循环输入视频input.mp4,-shortest意味着在最短的输入流结束时完成编码。这里最短的输入流将是input.mp3。

如果您想将新音频与视频合并,并重复音频直到视频结束,您可以尝试以下方法:

ffmpeg  -i input.mp4 -stream_loop -1 -i input.mp3 -shortest -map 0:v:0 -map 1:a:0 -y out.mp4

使用 -y 选项将在不询问的情况下覆盖输出文件。


1
你能描述一下它们的不同之处吗? - Wolfpack'08
4
视频没有声音怎么办? - theonlygusti
这个运行得非常完美。之前没有工作。如果它对你不起作用,请更新FFMPEG。 - Dhruv Kaushal
@theonlygusti,-map 0:v:0 -map 1:a:0 已经完成了它的工作。它将只从第一个 -i 中获取视频,只从第二个 -i 中获取音频,无论你的第二个输入是视频文件还是音频文件。 - Ninh Pham
第一个命令将一直执行,直到音频播放完成,想象一下有一小时的音频! - Mouaad Abdelghafour AITALI
显示剩余3条评论

1

1
这只是半个答案,仅提供了一个链接,只回答了问题的一半。 - Zim
@Zim 在答案中已经明确指出,只回答了第二个要点。 - preciousbetine

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脚本转换为批处理脚本。

更多信息:

希望这可以帮助您!


谢谢!不幸的是,我认为我不能在Windows上使用这个shell脚本。你有Windows版本吗? - Basj
很抱歉,我没有运行Windows的电脑。但是你仍然可以在答案中关注更新后的链接。 - Chamath

-2

对于第一个问题,可以尝试使用 ffmpeg -i yourmovie.mp4 -loop 10 命令将输入循环播放10次。


5
-loop_input已被弃用,请使用-loop 1。请注意,这两个循环选项仅与-f image2一起使用。 - puchu
2
无法使 -loop 10 或 -loop 1 正常工作。我正在尝试将一个3分钟的mp4视频循环播放成为2小时的音频。 - Sun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接