我正在尝试叠加两个具有不同开始时间的视频,并将它们的音轨混合在一起。
这些输入文件是 WebRTC 录音,每个文件都包含单个音频或视频轨道。
输入:
RTc0.webm
:音频,Opus 40k,开始时间 9.078 秒RT5f.webm
:音频,Opus 40k,开始时间 1.262 秒RT8c.mkv
:视频,H.264,开始时间 9.078 秒RTf7.mkv
:视频,H.264,开始时间 1.298 秒
我想并排绘制这些视频并将它们的音频混合在一起。
首次尝试,使用-copyts
我最初的想法是使用-copyts
并允许所有内容使用其共享的公共时间码进行对齐。
我的命令行如下所示:
ffmpeg \
-copyts \
-ss 224.1 -i RTc0.webm -t 60 \
-ss 224.1 -i RT5f.webm -t 60 \
-ss 224.1 -i RTf7.mkv -t 60 \
-ss 224.1 -i RT8c.mkv -t 60 \
-filter_complex "
color=c=black:s=1280x480 [background];
[2:v] scale=640x480 [left];
[3:v] scale=640x480 [right];
[background][left] overlay [background+left];
[background+left][right] overlay=x=640 [vout];
[1:a][0:a] amix [aout]
" -c:v libx264 -preset veryfast -crf 28 -c:a aac -map "[vout]" -map "[aout]" -y \
-f matroska combined.mkv
运行此程序后,我得到的输出是视频正确(一个视频从 0 秒开始,另一个在 7 秒后开始),但两个音轨都从 0 秒开始。预期行为是,一个音轨从 0 秒开始,另一个在 7 秒后开始,与第二个视频轨道同步。
第二次尝试,使用-itsoffset
和asetpts
我也尝试过使用-itsoffset
它来移动视频轨道。这有效,但-itsoffset
对我的音轨没有任何作用。它有奇怪的效果,有时将它放在一个轨道上会使两个轨道都及时移动。
ffmpeg \
-ss 0.00000000 -itsoffset 0 -i RTf7.mkv -t 60 \
-ss 0.00000000 -itsoffset 7.781 -i RT8c.mkv -t 60 \
-ss 0.00000000 -itsoffset 7.816 -i RT5f.webm -t 60 \
-ss 0.00000000 -itsoffset 0 -i RTc0.webm -t 60 \
-filter_complex "
color=c=black:s=1280x480 [background];
[0:v] scale=640x480 [left];
[1:v] scale=640x480 [right];
[background][left] overlay=shortest=1 [background+left];
[background+left][right] overlay=shortest=1:x=640 [vout];
[2:a][3:a] amix=inputs=2:duration=longest [aout]
" -c:v libx264 -preset veryfast -crf 28 -c:a aac -map "[vout]" -map "[aout]" -y \
-f matroska combined.mkv
然后我尝试使用asetpts
筛选移动音轨以保持对齐,但不起作用。该命令asetpts=PTS+(7.816/TB)
被忽略:
ffmpeg \
-copyts \
-ss 0 -i RTc0.webm -t 60 \
-ss 0 -i RT5f.webm -t 60 \
-ss 0 -itsoffset 0 -i RTf7.mkv -t 60 \
-ss 0 -itsoffset 7.781 -i RT8c.mkv -t 60 \
-filter_complex "
color=c=black:s=1280x480 [background];
[2:v] scale=640x480 [left];
[3:v] scale=640x480 [right];
[background][left] overlay [background+left];
[background+left][right] overlay=x=640 [vout];
[1:a] asetpts=PTS+(7.816/TB), [0:a] amix [aout]
" -c:v libx264 -preset veryfast -crf 28 -c:a aac -map "[vout]" -map "[aout]" -y \
-f matroska segment_0.mkv
我究竟做错了什么?
答案1
amix 过滤器同步所有输入以同时启动。解决方法是跳过-ss
音频输入,应用aresample=async=1,atrim=225.398
到每个音频输入,然后混合这些经过过滤的流。
225.398
是224.1+1.298
- 您的ss
值 + 较早开始的视频流的开始时间。我使用了视频流值,因为相应的音频开始得更早,因此如果您使用它的值,您可能会失去同步。