5

ffmpeg を使用して iDevice で udp ストリームを再生しています。ビデオとオーディオを正常に再生します。

私がここで得た唯一の問題は、次の関数呼び出しに時間がかかることです

avformat_find_stream_info

この関数の実行が完了するまでに約 10 秒かかります。私が再生しているメディアには、次のプロパティがあります。

MPEG-4 VIDEO v3 (DIV3)
RESOLUTION : 640x480
Frame rate : 25

この遅延を回避する方法はありますか?

4

1 に答える 1

8

これは古い質問だと思いますが、最近この問題に遭遇したので、これはおそらく OP には役立たないでしょうが、後世のために答えを書き留めておきます。

簡単な答え:

and/orのAVFormatContextフィールドをデフォルトよりも小さい値に設定します。つまり、probesizemax_analyze_duration

std::string url_path = "...";
AVFormatContext *format_ctx = NULL;
avformat_open_input(&format_ctx, url_path.c_str(), NULL, NULL);
format_ctx->max_analyze_duration = 50000;
avformat_find_stream_info(format_ctx, NULL);

より長い答えについては:

avformat_find_stream_infoAVFormatContext入力データ ストリームから読み取り、確認したパケットに基づいて入力を試みます。これはmax_analyze_duration、構造体に設定されている値まで行うことができますAVFormatContext

たとえば、ローカル ビデオ ファイルの場合、通常は非常に高速ですが、ネットワーク ストリームの場合は非常に時間がかかることがあります (特にストリームが破損している場合)。ここで長い待ち時間が発生avformat_find_stream_infoします。のデフォルト値max_analyze_durationは 5000000 (AV_TIME_BASE の単位) です。これは、仮想的にavformat_find_stream_infoは、入力ストリームからパケットをその期間までサンプリングできることを意味します (IIRC AV_TIME_BASE はマイクロ秒に相当するため、デフォルトの最大待機時間は 5 秒です)。

max_analyze_durationを 50,000 (~500ms) などの小さい値に設定することで、最悪の場合の待機時間をより妥当なものに制限しながら、情報の少ないフィールドavformat_find_stream_infoを選択するように強制します。AVFormatContext私の経験では、これによって問題が発生することはありません (ただし、これはビデオ ソースの状態によって異なります)。このフィールドは、ストリームから読み取ることができるprobesizeバイト数を決定します。avformat_find_stream_infoこの値を低く設定しすぎると、正確なコーデック情報を取得できない可能性があることに注意してください。

于 2013-08-21T23:40:15.103 に答える