将各种音频和视频源混合成一个视频
Posted
技术标签:
【中文标题】将各种音频和视频源混合成一个视频【英文标题】:Mixing various audio and video sources into a single video 【发布时间】:2021-02-18 08:43:15 【问题描述】:我已经阅读了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(以及许多关于setpts
标记为[ffmpeg]
的类似问题),并且以下代码正在运行,但我'确信我们可以简化它,并有一个更优雅的解决方案。
我想混合多个来源(图像和声音),起点不同:
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];
?
有没有办法只使用setpts
和asetpts
?当我将 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
,而丢弃了其他的;是真的吗?
【问题讨论】:
"有没有办法简化" 今天没时间看这个,但一个懒惰的建议是使用adelay=5s:all=1
,这样你就可以在几秒钟内完成工作不必知道频道的数量(确保您的 ffmpeg 不是太旧,否则它将无法工作)。
【参考方案1】:
我们必须同时使用 setpts 和 adelay 是否正常?
是的,前者用于视频流;后者,用于音频。 asetpts 不适合与 amix 一起使用,因为后者忽略了开始时间偏移。 adelay 填充从 0 到所需偏移量的静音。
经常看到overlay=...:enable='between(t,...,...)',这里好像不需要,为什么?
Overlay 按时间戳同步其主视频帧和重叠视频帧。如果希望在两个输入都可使用同步帧时禁用覆盖,则需要enable
。
【讨论】:
以上是关于将各种音频和视频源混合成一个视频的主要内容,如果未能解决你的问题,请参考以下文章