av_find_stream_info适用于文件,而不是管道

时间:2012-07-05 07:34:05

标签: c ffmpeg pipe libavformat

我有以下代码:

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

有什么想法吗?

谢谢, 阿里扎

3 个答案:

答案 0 :(得分: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设置为较小的值或使用较长的文件来解决问题。

答案 1 :(得分:0)

这是关于减少延迟和article

ffmpeg streaming guide

您可以为探测大小和最大分析持续时间提供最小值。

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

另外,请注意,较小的值仅适用于已知的值   复用器,否则由于缺乏连接可能无法完成   关于流的数据。

答案 2 :(得分:0)

值得注意的是,如果您正在阅读stdin中的 MOV 文件,更改probesize / analyzeduration的值可能无济于事。根据{{​​3}},它是mov容器格式的限制:

  

通常不可能通过stdin读取mov文件,因为它   mov文件包含必要的信息是完全正常的   需要在文件的最后解码(如编解码器等)。   (这不是FFmpeg的限制,而是mov文件的一个特性   格式。)