背景影片中帶有延遲音訊和視訊的 FFMpeg 視訊疊加

背景影片中帶有延遲音訊和視訊的 FFMpeg 視訊疊加

我正在嘗試使用多個視訊檔案在圖片影片中建立圖片的外觀。

我使用 FFMpeg 建立了一個 .mp4 檔案。影片在 Windows“電影和電視”應用程式中正確顯示。它無法在 Chrome、Firefox、VLC Media Player 或我擁有的任何其他應用程式中正確顯示。我計劃在瀏覽器中顯示視頻,因此跨瀏覽器支援對我來說很重要。

該視訊是透過視訊通話的兩個部分並使用 FFMpeg 執行以下操作來創建的:

  1. 將遠端視訊 (remote.mp4) 置於背景。
  2. 遠端視訊應顯示視訊的第一張影像,並在大約 2.501 秒之前顯示為暫停狀態。我已經使用 itoffset 完成了此操作。
  3. 遠端音訊也應在 2.501 秒後開始播放。設定 itoffset 似乎無法實現此目的,因此我為 filter_complex 新增了「adelay」選項。
  4. 將本地視訊 (local.mp4) 作為疊加層放置在右下角。
  5. 本地視訊和音訊應在 0 秒處開始播放(播放影片後立即開始播放。)
  6. 將背景圖片旋轉90度(橫向錄製)。
  7. 在遠端視訊中新增音訊延遲,以便在開始後 2.501 秒開始播放音訊串流。
  8. 合併音訊輸入。
  9. 使用 aac 編解碼器(因為它看起來很流行,如果有用的話我完全願意切換。)
  10. 使用 h264 視訊編解碼器,同樣是因為它看起來很流行。

我的FFMpeg指令如下:

ffmpeg -itsoffset 2.501 -i remote.mp4 -i local.mp4 \
     -filter_complex \
     " [1:v]scale=iw/4:-1:flags=lanczos[loc0]; \
     [0:v]transpose=1[rotate1]; \
     [rotate1][loc0]overlay=main_w-overlay_w-10:main_h-overlay_h-10:eof_action=pass[rem0]; \
     [0:a]adelay=2501|2501[0adelay]; \
     [0adelay]apad[0a]; \
     [0a][1:a]amerge=inputs=2[a]" \
     -map "[rem0]" -map "[a]" \
     -ac 2 -vcodec libx264 \
     -ar 44100 -acodec aac \
     completed.mp4

視訊屬性:

  1. 已完成.mp4(16 秒,480x640)
  2. local.mp4(16 秒,640x480)
  3. Remote.mp4(14 秒,640x480,橫向旋轉)

當我在瀏覽器中查看完整的影片時,不是 16 秒,而是 18 秒。當我在完成的影片上使用 ffprobe 時,它顯示:持續時間:00:00:16.68。本地音視頻在瀏覽器中播放也需要等待2.501秒。

任何幫助都會很棒。我不知道為什麼瀏覽器的渲染方式與我的預期不同。謝謝!

答案1

透過時間戳偏移,ffmpeg 將透過輸出 MP4 中的編輯清單來實現這一點。看起來瀏覽器不會解析它們。所以,我們需要一個解決方法。

ffmpeg -i remote.mp4 -i local.mp4 \
     -filter_complex \
     " [1:v]scale=iw/4:-1:flags=lanczos[loc0]; \
     [0:v]transpose=1,setpts='if(eq(N,0),PTS,PTS+2.501/TB)',fps=30[rotate1]; \
     [rotate1][loc0]overlay=main_w-overlay_w-10:main_h-overlay_h-10:eof_action=pass[rem0]; \
     [0:a]adelay=2501|2501,apad[0a]; \
     [0a][1:a]amerge=inputs=2[a]" \
     -map "[rem0]" -map "[a]" \
     -ac 2 -vcodec libx264 \
     -ar 44100 -acodec aac \
     completed.mp4

setpts除了第一幀之外的所有幀的移位時間戳。然後,過濾器用fps第一幀的副本填滿該間隙。我假設輸入流速率為 30。

相關內容