我正在嘗試使用多個視訊檔案在圖片影片中建立圖片的外觀。
我使用 FFMpeg 建立了一個 .mp4 檔案。影片在 Windows“電影和電視”應用程式中正確顯示。它無法在 Chrome、Firefox、VLC Media Player 或我擁有的任何其他應用程式中正確顯示。我計劃在瀏覽器中顯示視頻,因此跨瀏覽器支援對我來說很重要。
該視訊是透過視訊通話的兩個部分並使用 FFMpeg 執行以下操作來創建的:
- 將遠端視訊 (remote.mp4) 置於背景。
- 遠端視訊應顯示視訊的第一張影像,並在大約 2.501 秒之前顯示為暫停狀態。我已經使用 itoffset 完成了此操作。
- 遠端音訊也應在 2.501 秒後開始播放。設定 itoffset 似乎無法實現此目的,因此我為 filter_complex 新增了「adelay」選項。
- 將本地視訊 (local.mp4) 作為疊加層放置在右下角。
- 本地視訊和音訊應在 0 秒處開始播放(播放影片後立即開始播放。)
- 將背景圖片旋轉90度(橫向錄製)。
- 在遠端視訊中新增音訊延遲,以便在開始後 2.501 秒開始播放音訊串流。
- 合併音訊輸入。
- 使用 aac 編解碼器(因為它看起來很流行,如果有用的話我完全願意切換。)
- 使用 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
視訊屬性:
- 已完成.mp4(16 秒,480x640)
- local.mp4(16 秒,640x480)
- 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。