バックグラウンドビデオで遅延オーディオとビデオを表示する FFMpeg ビデオオーバーレイ

バックグラウンドビデオで遅延オーディオとビデオを表示する FFMpeg ビデオオーバーレイ

複数のビデオ ファイルを使用して、画像ビデオ内に画像の外観を作成しようとしています。

FFMpeg を使用して .mp4 ファイルを作成しました。ビデオは Windows の「映画 & テレビ」アプリでは正しく表示されます。Chrome、Firefox、VLC Media Player、その他のアプリでは正しく表示されません。ビデオをブラウザーで表示する予定なので、クロスブラウザー サポートは私にとって重要です。

このビデオは、ビデオ通話の 2 つの部分を撮影し、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 を使用すると、次のように表示されます: Duration: 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 と想定しました。

関連情報