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

发布于 2024-10-18 01:51:34 字数 324 浏览 1 评论 0原文

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

我有两个选择:

  • 有一个非常小的视频文件(例如 10 秒),在音频文件未结束时循环播放。

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

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

有第一个解决方案的指针吗?

I'm trying to merge an audio file with a video file.

I have two options:

  • Have a very small video file (e.g., 10 seconds) that loop while the audio file is not over.

  • Have a very long video file (longer than any of my audio file) on which I can attach the audio file. I would like to cut the video when the audio is finished.

I'm using the latter with the -t <duration in second> option of ffmpeg. It means I have to get the duration of the audio file to feed it into ffmpeg. Is it possible to avoid this step?

Any pointer for the first solution?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

巴黎盛开的樱花 2024-10-25 01:51:34

如果你想将新的音频与视频重复视频合并直到音频完成,你可以尝试这样做:

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表示无限循环输入.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 选项将覆盖输出文件而不询问。

If you want to merge new Audio with video repeat video until the audio finishes, you can try this:

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

Using -stream_loop -1 means infinite loop input.mp4, -shortest means finish encoding when the shortest input stream ends. Here the shortest input stream will be the input.mp3.

And if you want to merge new Audio with video repeat audio until the video finishes, you can try this:

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

use -y option will overwrite output files without asking.

深府石板幽径 2024-10-25 01:51:34

通过使用 ffmpeg 的 -shortest 选项可以轻松解决第二个要点。请参阅:http://www.ffmpeg.org/ffmpeg-doc.html#SEC12 了解更多详情。

The second bullet point was easily solved by using the -shortest option of ffmpeg. See: http://www.ffmpeg.org/ffmpeg-doc.html#SEC12 for more details.

魂牵梦绕锁你心扉 2024-10-25 01:51:34

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

详细信息:

希望这会有所帮助!

For the first bullet point I don't see a direct command. What I'm suggesting is to use ffprobe to calculate the duration of both files and calculate the number of video loops that need to play for the duration of audio.

Following will result the duration of the inputs.

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

Then you can loop the video manually until you satisfy the calculated value of video instances.

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 stands for the number of times the video need to be looped. Instead of -shortest you can use -t as you have already calculated the duration of the audio.

Following is the associated shell script.

#!/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}

For windows you can convert this shell script to a batch script.

More information:

Hope this helps!

橘寄 2024-10-25 01:51:34

对于第一个,尝试 ffmpeg -i yourmovie.mp4 -loop 10 循环输入 10 次

for the first one, try ffmpeg -i yourmovie.mp4 -loop 10 to loop the input 10 times

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文