HDMIエンコーダ用のFFplayでレイテンシーを削減 | サポートが存在する

FAQ:エンコーダ用のFFplayでレイテンシーを減らす

FFplayで遅延を低減するためのステップバイステップガイド

1. FFmpegとFFplayをインストールする

FFmpeg(FFplayを含む)がシステムにインストールされていることを確認してください。インストールされているかどうかは、以下を実行して確認できます:
  1. ffplay -version
インストールされていない場合は、FFmpegを以下からダウンロードしてインストールできます:公式サイトまたは、お使いのオペレーティングシステムに応じて、以下のようなパッケージマネージャーを使用してください:apt or brew2. RTSPストリームでFFplayを開く

まず、RTSPストリームURLを指定してFFplayを実行します:

ffplay rtsp://192.168.1.120:554/live/1_0
  1. 以下を置き換えてください:
実際の映像エンコーダーのRTSP URLに。rtsp://192.168.1.120:554/live/1_03. バッファサイズを調整する

遅延を最小限に抑えるために、デフォルトのバッファサイズを減らします。-rtsp_transportフラグを使用して、トランスポートプロトコル(TCPまたはUDP)を選択します。通常、UDPの方が低遅延になります。

コマンド例
ffplay -rtsp_transport udp -fflags nobuffer -analyzeduration 0 -probesize 32 rtsp://192.168.1.120:554/live/1_0:
  1. 説明
-rtsp_transport udp:
  1. : UDPトランスポートを強制します。これは一般的にTCPよりも低遅延です。-fflags nobuffer
  2. : バッファリングを無効にして遅延を低減します。-analyzeduration 0
  3. : FFplayがストリームを解析する時間を制限し、再生をより迅速に開始できるようにします。-probesize 32
  4. : ストリームのプローブに使用するデータ量を制限し、これも遅延を低減します。4. 映像出力の遅延を調整する

-syncフラグを使用して、映像の同期を調整します。これをvideoに設定すると、FFplayは映像ストリームと同期するようになり、遅延の低減に役立ちます。

Use the -sync flag to adjust video synchronization. Setting it to video forces FFplay to sync with the video stream, which can help with reducing latency.
コマンド例:
  1. ffplay -rtsp_transport udp -fflags nobuffer -analyzeduration 0 -probesize 32 -sync video rtsp://192.168.1.120:554/live/1_0

5. 映像と音声のバッファリングを削減する

テストに音声が不要な場合は、-vn(映像なし)で音声再生を無効化または最小化するか、-an(音声なし)で音声バッファサイズを調整してください。
例:
  1. ffplay -rtsp_transport udp -fflags nobuffer -analyzeduration 0 -probesize 32 -sync video -an rtsp://192.168.1.120:554/live/1_0

6. デコードオプションの微調整

デコード性能を最適化し、レイテンシを最小化するためのオプションを追加します。例えば:
  1. ffplay -rtsp_transport udp -fflags nobuffer -analyzeduration 0 -probesize 32 -sync video -an -flags low_delay rtsp://192.168.1.120:554/live/1_0

7. 追加の最適化(オプション)

-x および -y フラグを使用して映像ウィンドウのサイズを指定し、-framedrop を使用して処理が間に合わないフレームを破棄することで、FFplay をさらに調整できます:
  1. ffplay -rtsp_transport udp -fflags nobuffer -analyzeduration 0 -probesize 32 -sync video -an -framedrop -flags low_delay -x 640 -y 360 rtsp://192.168.1.120:554/live/1_0
説明:
  1. -framedrop: システムがデコードに追いつけない場合にフレームを破棄し、バッファリングを削減します。
  2. -x 640 -y 360: 映像を再生する解像度を指定し、デコード負荷を軽減します。

最終的なコマンド例

  1. ffplay -rtsp_transport udp -fflags nobuffer -analyzeduration 0 -probesize 32 -sync video -an -framedrop -flags low_delay -x 640 -y 360 rtsp://192.168.1.120:554/live/1_0

8. レイテンシの監視

設定後、再生を監視してレイテンシの削減を確認します。FFprobe などのツールを使用して、ストリームの詳細を検査することでリアルタイムにレイテンシを測定できます。
ストリームの統計を確認するための FFprobe コマンド例:
  1. ffprobe -v quiet -print_format json -show_streams rtsp://192.168.1.120:554/live/1_0
上記のコマンドを使用し、さまざまなフラグを調整することで、映像エンコーダーからの RTSP ストリームをテストする際のレイテンシを効果的に削減できます。

FFplay でレイテンシをさらに削減するためのステップバイステップガイド

提供された手順に従った後にレイテンシが増加した場合、いくつかの原因が考えられます。以下に考えられる原因と対処方法を示します:

1. バッファリング設定(不適切なバッファ調整)

-fflags nobufferフラグはバッファリングを最小化することを目的としていますが、ネットワーク状況が理想的でない場合など、不安定になったりレイテンシが増加したりすることがあります。十分なバッファがないと、FFplay がフレームをスムーズに処理できず、再生にさらなる遅延が発生する可能性があります。flag is intended to minimize buffering, but in some cases, this can lead to instability or increased latency, especially if the network conditions are not ideal. FFplay may struggle to process frames smoothly without enough buffer, causing additional delays in playback.

解決策: バッファリング戦略を調整してみてください。バッファリングを完全に無効にするのではなく、より保守的なバッファ設定を使用するか、-fflags nobufferフラグを削除することができます:

  1. ffplay -rtsp_transport udp -analyzeduration 0 -probesize 32 -sync video rtsp://192.168.1.120:554/live/1_0

2. RTSPトランスポートプロトコル(UDP対TCP)

切り替え先UDPは通常、RTSPストリーミングにおいてTCPよりも高速ですが、特定のネットワーク条件下ではパケットロスやジッターが発生し、デコーダーの処理が遅延する可能性があります。ネットワークが不安定な場合、UDPを使用すると、FFplayが失われたパケットや破損したパケットを補正しようとするため、意図せずレイテンシーが増加する可能性があります。

解決策: TCPトランスポートでテストし、レイテンシーが改善されるか確認してください。-rtsp_transport tcpフラグを使用してTCPを強制します:
ffplay -rtsp_transport tcp -analyzeduration 0 -probesize 32 -sync video rtsp://192.168.1.120:554/live/1_0

3. フレームドロップ

-framedropフラグは、FFplayが時間内にデコードできない場合にフレームを破棄するよう指示し、レイテンシーを減少させるはずです。ただし、あまりにも多くのフレームが破棄されると、FFplayが復旧して再同期するのに時間がかかるため、遅延が増加する可能性があります。解決策

: フレームドロップが過剰な場合は、-framedropフラグを削除するか、その影響を軽減してみてください:ffplay -rtsp_transport udp -analyzeduration 0 -probesize 32 -sync video rtsp://192.168.1.120:554/live/1_0
  1. あるいは、-framedropの動作を調整して、遅延の削減に役立つかどうかを確認することもできます:
ffplay -framedrop 0 -rtsp_transport udp -analyzeduration 0 -probesize 32 -sync video rtsp://192.168.1.120:554/live/1_0
  1. 4. ネットワーク条件とジッター

4. Network Conditions and Jitter

TheUDPトランスポートは、高遅延または不安定なネットワークでは理想的ではない場合があります。UDPはパケット配信を保証しないため、クライアント側でジッターやバッファリング遅延が発生する可能性があります。UDPは完璧なネットワーク条件下では遅延を削減できますが、ネットワークの不安定性や輻輳がある場合には、より多くの問題を引き起こすことがよくあります。

Solution: 安定した混雑の少ないネットワークでテストするか、ネットワークに高いジッターやパケットロスがある場合はTCPに戻してください。

5. デコーダーの過負荷

もし-flags low_delayフラグが大きなビデオストリームや高解像度と共に使用されると、FFplayがフレームをあまりに速くデコードしようとしてデコーダーの過負荷を引き起こし、さらなる処理遅延を招く可能性があります。

Solution: ビデオの解像度を下げてデコーダーの負荷を軽減するか、問題を引き起こしている場合は低遅延フラグをオフにしてください:
  1. ffplay -rtsp_transport udp -analyzeduration 0 -probesize 32 -sync video -an rtsp://192.168.1.120:554/live/1_0

6. 過剰な分析とプロービング

フラグ-analyzeduration 0および-probesize 32は、FFplayがストリームの分析に費やす時間と初期パケットプローブのサイズを制限することを意図しており、起動を高速化するはずです。しかし、これらの値が厳しすぎると、FFplayが不完全な情報で動作することを余儀なくされ、同期遅延や、欠落データから回復しようとする際の全体的な遅延の増加を引き起こす可能性があります。

Solution: -analyzedurationと-probesizeの値を少し増やして、遅延を大幅に増やすことなく、起動時にFFplayがより多くのデータを収集できるようにしてください:
  1. ffplay -rtsp_transport udp -analyzeduration 5000000 -probesize 5000000 -sync video rtsp://192.168.1.120:554/live/1_0

7. ビデオ同期モード

The-sync videoflagはFFplayに対してビデオフレームを正確に同期するよう指示するため、次のフレームを待つ必要がある場合に遅延が発生することがあります。エンコーダーの出力フレームレートがFFplayの同期期待値と適切に一致しない場合、不必要な遅延が発生する可能性があります。

解決策: ビデオではなくオーディオ or タイムスタンプへの同期を試すことができます:
  1. ffplay -rtsp_transport udp -analyzeduration 0 -probesize 32 -sync audio rtsp://192.168.1.120:554/live/1_0
あるいは、-syncフラグを完全に削除すると改善する場合があります:
  1. ffplay -rtsp_transport udp -analyzeduration 0 -probesize 32 rtsp://192.168.1.120:554/live/1_0

結論:

レイテンシを削減するには、バッファリング戦略、トランスポートプロトコル、デコード設定のバランスを調整して試してみてください。UDPは通常より低いレイテンシを提供しますが、安定したネットワークが必要です。一方、TCPはネットワーク品質が不安定な場合により信頼性が高い可能性があります。バッファサイズ、プロービング動作、フレームドロップ設定を調整することも、過剰なレイテンシの軽減に役立ちます。さまざまな設定をテストして、特定のユースケースに最適なセットアップを見つけてください。