【问题标题】:Merge video and audio with ffmpeg. Loop the video while audio is not over使用 ffmpeg 合并视频和音频。在音频未结束时循环播放视频
【发布时间】:2011-06-28 07:07:20
【问题描述】:

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

我有两个选择:

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

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

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

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

【问题讨论】:

    标签: video audio ffmpeg


    【解决方案1】:

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

    【讨论】:

    • 这只是一个答案,它只是一个只解决了一半问题的链接。
    • @Zim 在答案中明确指出它仅针对第二个要点。
    【解决方案2】:

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

    【讨论】:

    • -loop_input 已弃用,使用 -loop 1 注意,两个循环选项仅适用于 -f image2
    • 无法让 -loop 10 和 -loop 1 工作。我正在尝试将 mp4 视频(3 分钟)循环播放为 2 小时长的音频。
    【解决方案3】:

    对于第一个要点,我没有看到直接命令。我的建议是使用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 版本吗?
    • 对不起。我没有在 Windows 上运行的电脑。您仍然可以跟进答案中的更新链接。
    【解决方案4】:

    如果您想在音频完成之前将新音频与视频重复视频合并,您可以尝试以下操作:

    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 选项将在不询问的情况下覆盖输出文件。

    【讨论】:

    • 你能描述一下它们有何不同吗?
    • 视频没有音频怎么办?
    • 这是完美的工作。以前没有工作。如果 FFMPEG 不适合您,请更新它。
    • @theonlygusti, -map 0:v:0 -map 1:a:0 已经完成了它的工作。无论您的第二个输入是视频还是音频文件,它将只接收来自第一个 -i 的视频和来自第二个 -i 的音频。
    • 第一个命令会一直执行到音频结束,想象一下有 1 小时的音频!
    猜你喜欢
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    • 2019-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    相关资源
    最近更新 更多