ffmpeg で入力ストリームに意図的に遅延を追加する方法

ffmpeg で入力ストリームに意図的に遅延を追加する方法

私は Windows PC に接続するフレームグラバーを持っています。キャプチャ入力デバイスは 1080p、60fps、4:4:4 の RAW ビデオです。これをテスト セットアップで使用して、ユーザーに既存の Windows アプリケーションで作業してもらい、画像圧縮、解像度の低下、フレーム レートの低下を導入してもらいます。目的は、ユーザー エクスペリエンスを調べ、ユーザーにさまざまな設定を評価してもらうことです。私のアイデアは、ffmpeg を使用して RAW 入力ストリームを取得し、遅延を導入して、MJPEG にトランスコードし、さまざまな JPEG レベルを追加して遅延を追加することです。キャプチャ デバイスにアクセスして解像度を変更し、フレーム レートを下げることはすでにできますが、遅延を導入できるかどうかはわかりません。ほとんどの場合、ユーザーはオーディオ遅延を考慮してビデオ遅延を導入するか、意図的にビデオ遅延を追加するのではなく、ビデオ遅延を削減したいからです :-) 現在、ストリームを処理する方法は次のとおりです。

ffmpeg -f dshow -i video="framegrabber_capture_1" -vf format=yuv420p,scale=1280x1024,fps=5 -f sdl test

補足: テスト設定では純粋なビデオのみが必要で、オーディオは必要ありません。

MJPEG へのトランスコード方法がわかりませんでしたが、おそらく可能だと思います。ビデオの遅延に関する情報はまったく見つかりませんでした。これは、ストリームがどこかにキャッシュされていることを意味するからです。誰かが正しい方向を示してくれるとありがたいです。

ありがとう!

J.

答え1

FFmpeg はビデオ プレーヤーではないため、表示されるビデオを遅延するようには設計されていません。

カメラからのビデオの前に短いビデオを連結することで、FFmpegにビデオを遅らせるように強制することができます。連結フィルター
も追加する必要がありますリアルタイムフィルター。FFmpeg に出力レートを入力レートに一致させるように強制します (このフィルターがない場合、FFmpeg はビデオを可能な限り高速に送信します)。

MJPEG エンコーディングでは を使用できないため-f sdl test、FFmpeg 出力を FFplay にパイプしてビデオを表示します。


キャプチャしたビデオを 5 秒遅らせる例:

ffmpeg -an -f dshow -rtbufsize 1G -i video="framegrabber_capture_1" -filter_complex "color=white:size=1280x1024:rate=5:duration=5[w];[0:v]scale=1280x1024,setsar=1,fps=5[v0];[w][v0]concat,realtime=limit=10" -c:v mjpeg -pix_fmt yuvj420p -f mjpeg pipe: | ffplay pipe:


  • -rtbufsize 1G- 入力バッファのサイズを 1 GByte に増やします (「多数の」入力ビデオ フレームを保存できます)。
  • color=white:size=1280x1024:rate=5:duration=5[w]- 長さ 5 秒、レート 5fps の合成ホワイト ビデオを作成します。 に保存します[w]
  • [0:v]scale=1280x1024,setsar=1,fps=5- 入力ビデオをスケーリングし、フレームレートを設定します。 に保存します[v0]
  • [w][v0]concat- 5 秒間の白いビデオをスケーリングされた入力ビデオと連結します (5 秒間の白いビデオが最初になります)。
  • realtime=limit=10- 出力レートを入力レートまで遅くします(limit=10一時停止の制限)。
  • -c:v mjpeg -f mjpeg- 出力ビデオを MJPEG コーデックでエンコードし、MJPEG コンテナ形式で保存します。
  • pipe:- 出力として stdout を使用します。
  • | ffplay pipe:FFmpeg からの stdout パイプを FFplay の stdin パイプ (入力として使用) に渡します。

注:
追加の遅延が組み込まれているため、遅延は正確ではありません。

setpts=0より高いフレームレートを使用し、 FFplay コマンドに追加することで、遅延の精度を向上させることができます (改善を試みることもできます)。

ffmpeg -an -f dshow -rtbufsize 1G -i video="Microsoft® LifeCam HD-3000" -filter_complex "color=white:size=1280x1024:rate=25:duration=5[w];[0:v]scale=1280x1024,setsar=1,fps=25[v0];[w][v0]concat,realtime=limit=10" -c:v mjpeg -pix_fmt yuvj420p -f mjpeg pipe: | ffplay -vf setpts=0 pipe:

関連情報