首次尝试,使用-copyts

首次尝试,使用-copyts

我正在尝试叠加两个具有不同开始时间的视频,并将它们的音轨混合在一起。

这些输入文件是 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 秒后开始,与第二个视频轨道同步。

第二次尝试,使用-itsoffsetasetpts

我也尝试过使用-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.398224.1+1.298- 您的ss值 + 较早开始的视频流的开始时间。我使用了视频流值,因为相应的音频开始得更早,因此如果您使用它的值,您可能会失去同步。

相关内容