微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将各种音频和视频源混合成一个视频

如何解决将各种音频和视频源混合成一个视频

我已经阅读了FFmpeg - Overlay one video onto another video?How to overlay 2 videos at different time over another video in single ffmpeg command?FFmpeg - Multiple videos with 4 areas and different play times(以及许多关于[ffmpeg]标记setpts的类似问题),以及以下内容代码正在运行,但我相信我们可以简化它,并有一个更优雅的解决方案。

我想混合多个来源(图像和声音),起点不同:

t (seconds)           0   1   2   3   4   5   6   7   8   9  10  11  12  13    
test.png              [-------------------------------]
a.mp3                         [-------]
without_sound.mp4                                 [-------------------]        (overlay at x,y=200,200)
b.mp3                                     [---]
with_sound.mp4                    [---------------------------------------]    (overlay at x,y=100,100)

这有效:

ffmpeg -i test.png 
       -t 2 -i a.mp3 
       -t 5 -i without_sound.mp4 
       -t 1 -i b.mp3 
       -t 10 -i with_sound.mp4 
       -filter_complex "
            [0]setpts=PTS-STARTPTS[s0];
            [1]adelay=2000^|2000[s1];
            [2]setpts=PTS-STARTPTS+7/TB[s2];
            [3]adelay=5000^|5000[s3];
            [4]setpts=PTS-STARTPTS+3/TB[s4];
            [4:a]adelay=3000^|3000[t4];
            [s1][s3][t4]amix=inputs=3[outa];
            [s0][s4]overlay=100:100[o2];
            [o2][s2]overlay=200:200[outv]
       " -map [outa] -map [outv]
       out.mp4 -y

但是:

  • 我们必须同时使用 setpts adelay 是否正常?我试过没有 adelay,然后声音没有改变。换种说法,有没有办法简化:

    [4]setpts=PTS-STARTPTS+3/TB[s4];
    [4:a]adelay=3000^|3000[t4];
    

  • 有没有办法只用 setptsasetpts 做到这一点?当我用 adelay=5000|5000 替换 asetpts=PTS-STARTPTS+5/TB 以及另一个时,它没有给出预期的时移(见下文)

  • 在类似的问题/答案中我经常看到overlay=...:enable='between(t,...,...)',这里似乎不需要,为什么?

更一般地说,您将如何简化这种“混合多个音频和视频”ffmpeg代码


有关第二个要点的更多详细信息:如果我们将 adelay 替换为 asetpts

-filter_complex "
            [0]setpts=PTS-STARTPTS[s0];
            [1]asetpts=PTS-STARTPTS+2/TB[s1];
            [2]setpts=PTS-STARTPTS+7/TB[s2];
            [3]asetpts=PTS-STARTPTS+5/TB[s3];
            [4]setpts=PTS-STARTPTS+3/TB[s4];
            [4:a]asetpts=PTS-STARTPTS+3/TB[t4];
            [s1][s3][t4]amix=inputs=3[outa];
            [s0][s4]overlay=100:100[o2];
            [o2][s2]overlay=200:200[outv]

它不起作用:[3] 应该从 0'05" 开始,而 [4:a] 在 0'03" 但它们都与 [1] 同时开始,即在 0'02" .

似乎amix只考虑了第一个asetpts,其他的都舍弃了;是真的吗?

解决方法

我们必须同时使用 setpts 和 adelay 是否正常?

是的,前者是针对视频流的;后者,用于音频。 asetpts 不适合与 amix 一起使用,因为后者会忽略起始时间偏移。 adelay 填充从 0 到所需偏移量的静音。

经常看到overlay=...:enable='between(t,...,...)',这里好像不需要,为什么?

Overlay 按时间戳同步其主视频帧和叠加视频帧。当同步帧可用于两个输入时,如果希望禁用叠加,则需要 enable

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。