開始時間が異なる 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.398
は224.1+1.298
、あなたのss
値 + 先に開始されたビデオ ストリームの開始時間です。対応するオーディオが先に開始されるため、ビデオ ストリームの値を使用しました。そのため、その値を使用した場合、同期が失われる可能性があります。