我正在嘗試疊加兩個具有不同開始時間的視頻,並將它們的音軌混合在一起。
這些輸入檔是 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
值 + 較早開始的視訊串流的開始時間。我已經使用了視訊串流值,因為相應的音訊較早開始,因此如果您使用它的值,您可能會失去同步。