叠加两个视频时的音频问题 (ffmpeg)

Posted

技术标签:

【中文标题】叠加两个视频时的音频问题 (ffmpeg)【英文标题】:Audio issues when overlaying two videos (ffmpeg) 【发布时间】:2021-07-31 23:45:15 【问题描述】:

我正在尝试在 2 分钟的视频上叠加一个 10 秒的短视频,并让 10 秒的视频显示在 30 秒的标记处。这是我到目前为止所拥有的

start = 30
subprocess.run(
    f'ffmpeg -y \
        -i os.path.join(path, "2minutevideo.mp4") \
        -i os.path.join(path, "popup.mov") \
        -filter_complex \
        "[0:v]setpts=PTS-STARTPTS[v0]; \
        [1:v]setpts=PTS-STARTPTS+notify_start/TB[v1]; \
        [v0][v1]overlay=enable=\'between(t, notify_start, notify_start + get_duration(os.path.join(path, "popup.mp4")))\' [out1]" \
        render_flags -r 24 -map 1:a -map [out1] -async 1 \
        os.path.join(source_folder, "test.mp4")')

它的作用是 popup.mov 在 30 秒后显示并播放整个持续时间。但是,我有两个问题:

    popup.mov 的音频仍然在开头播放。我已经尝试了它的偏移量,设置了 pts,但两者似乎都不起作用或有错误。 播放的唯一音频是 popup.mov 的音频。我希望 2minutevideo 和 popup.mov 都播放音频。是的,我知道这是因为 -map 1:a 仅将弹出窗口的音频映射到最终视频,但我不知道如何同时播放音频。我需要混合吗?

谢谢

【问题讨论】:

【参考方案1】:

添加adelay 和amix 过滤器:

start = 30
subprocess.run(
    f'ffmpeg -y \
        -i os.path.join(path, "2minutevideo.mp4") \
        -i os.path.join(path, "popup.mov") \
        -filter_complex \
        "[0:v]setpts=PTS-STARTPTS[v0]; \
        [1:v]setpts=PTS-STARTPTS+notify_start/TB[v1]; \
        [v0][v1]overlay=enable=\'between(t, notify_start, notify_start + get_duration(os.path.join(path, "popup.mp4")))\' [out1]; \
        [1:a]adelay=notify_starts:all=1[a1];[0:a][a1]amix[a]"
        render_flags -r 24 -map [out1] -map [a] -async 1 \
        os.path.join(source_folder, "test.mp4")')

这纯粹是一个 ffmpeg 问题。 python代码只是噪音。如果没有蟒蛇挡路,你可能会更快得到答案。

【讨论】:

以上是关于叠加两个视频时的音频问题 (ffmpeg)的主要内容,如果未能解决你的问题,请参考以下文章

FFMPEG:结合“从图像创建视频”+ 缩放到 x + 添加音频 + 覆盖徽标

如何在ffmpeg中合并音频和两个视频文件?

ffmpeg 命令用于从两个不同的视频和两个不同的音频创建最终视频

一次用ffmpeg实现图片+音频合成视频的开发

来自两个视频的FFMPEG mux视频和音频

第十章 视频播放器开发之音频播放