第一次嘗試,使用-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值 + 較早開始的視訊串流的開始時間。我已經使用了視訊串流值,因為相應的音訊較早開始,因此如果您使用它的值,您可能會失去同步。

相關內容