まずは、-copyts

まずは、-copyts

開始時間が異なる 2 つのビデオを重ねて、オーディオ トラックをミックスしようとしています。

これらの入力ファイルは WebRTC 録画であり、それぞれに 1 つのオーディオ トラックまたはビデオ トラックが含まれています。

入力:

  • 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

これを実行すると、ビデオは正しい (1 つのビデオは 0 秒で開始し、もう 1 つは 7 秒後に開始) が、オーディオ トラックは両方とも 0 秒で開始するという出力が得られます。予想される動作は、1 つのオーディオ トラックが 0 秒で開始し、もう 1 つが 2 番目のビデオ トラックと同期して 7 秒後に開始することです。

2回目の試みでは、-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各オーディオ入力に適用してから、フィルターされたストリームを amix します。

225.398224.1+1.298、あなたのss値 + 先に開始されたビデオ ストリームの開始時間です。対応するオーディオが先に開始されるため、ビデオ ストリームの値を使用しました。そのため、その値を使用した場合、同期が失われる可能性があります。

関連情報