web-dev-qa-db-ja.com

バックグラウンドビデオで遅延オーディオとビデオを使用したFFMpegビデオオーバーレイ

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

FFMpegを使用して.mp4ファイルを作成しました。ビデオはWindowsの「Movies&TV」アプリで正しく表示されます。 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. complete.mp4(16秒、480x640)
  2. local.mp4(16秒、640x480)
  3. remote.mp4(14秒、640x480、横向き)

完成したビデオをブラウザで見ると、16秒ではなく18秒と表示されます。完成したビデオでffprobeを使用すると、次のように表示されます。再生時間:00:00:16.68。ローカルオーディオとビデオも、ブラウザで再生されるまで2.501秒待機します。

どんな助けでも素晴らしいでしょう。ブラウザが意図したものとは異なる方法でレンダリングしている理由がわかりません。ありがとう!

2
Daryl

タイムスタンプオフセットを使用すると、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と想定しました。

2
Gyan