4

私は次のコードを持っています:

av_register_all();
pFormatCtx = avformat_alloc_context();
const char* input = "pipe:";
AVInputFormat* iFormat = av_find_input_format("mpegts");
if ( avformat_open_input(&pFormatCtx, input, iFormat, NULL) != 0 )
         return -1;
int res = av_find_stream_info(pFormatCtx);

入力が通常のファイルの場合、これはうまく機能し、pFormatCtxにはファイル内のストリームが入力されます。ただし、入力を「pipe:」に設定すると、av_find_stream_infoは-1で返されます。

同じファイルを使用して、実行してパイプします cat mpeg.ts | myApp

何か案は?

ありがとう、アリザ

4

3 に答える 3

3

使用していたファイルが短すぎたことがわかりました。

av_format_open_inputファイルの8Kを読み取り、av_find_stream_info(の)max_analyze_durationに従って読み取りますAVFormatContext

私のファイルは短すぎたので、到達する前にパイプの終わりに到達max_analyze_durationし、したがって-1を返しました。

なぜそれが通常のファイルで機能したのかはまだわかりません-多分それはへの呼び出しの後に最初に戻ってシークしましたav_format_open_input

max_analyze_durationいずれにせよ、小さい値に設定するか、長いファイルを使用することで、彼の問題を解決することができました。

于 2012-07-09T16:15:13.420 に答える
0

これは、レイテンシーの削減とffmpeg ストリーミング ガイドに関するこの記事からのものです。

プローブサイズの最小値と最大分析期間を指定できます。

pFormatCtx->probesize = 32;
pFormatCtx->max_analyze_duration = 32;

また、小さい値は、既知のマルチプレクサに対してのみ OK であることに注意してください。そうしないと、ストリームに関するデータが不足しているため、接続が確立されない可能性があります。

于 2014-10-07T20:49:31.553 に答える
0

からMOVファイルを読み取る場合、 /stdinの値を変更してもおそらく役に立たないことにも注意してください。この電子メール スレッドによると、これは mov コンテナー形式の制限です。probesizeanalyzeduration

通常、stdin を介して mov ファイルを読み取ることはできません。これは、mov ファイルの末尾にデコードに必要な情報 (コーデックなど) が含まれているのが正常であるためです。(これは FFmpeg の制限ではなく、mov ファイル形式の機能です。)

于 2016-12-14T16:05:43.113 に答える