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 填充了文件中的流。但是,当我将输入设置为“管道:”时,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;

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

于 2014-10-07T20:49:31.553 回答
0

还值得注意的是,如果您从 中读取MOV文件stdin,更改probesize/的值analyzeduration可能无济于事。根据此电子邮件线程,这是 mov 容器格式的限制:

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

于 2016-12-14T16:05:43.113 回答