これは古い質問だと思いますが、最近この問題に遭遇したので、これはおそらく OP には役立たないでしょうが、後世のために答えを書き留めておきます。
簡単な答え:
and/orのAVFormatContext
フィールドをデフォルトよりも小さい値に設定します。つまり、probesize
max_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_info
AVFormatContext
入力データ ストリームから読み取り、確認したパケットに基づいて入力を試みます。これは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
この値を低く設定しすぎると、正確なコーデック情報を取得できない可能性があることに注意してください。