我有以下代码:
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
有什么想法吗?
谢谢, 阿里扎
答案 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文件的一个特性 格式。)