2012-07-05 21 views
4

我有以下代碼:av_find_stream_info與文件工作原理確定,不與管

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

原來我是用太短的文件。

av_format_open_input讀取文件& av_find_stream_info根據(的AVFormatContext)max_analyze_duration讀取的8K。

由於我的文件太短,在到達max_analyze_duration之前它已到達管道末端,因此返回-1。

我還不確定它爲什麼使用普通文件 - 也許它在av_format_open_input的電話後回到開頭。

在任何情況下,我可以通過將max_analyze_duration設置爲更小的值或使用更長的文件來解決問題。

0

這是從這個article約減少延遲和ffmpeg streaming guide

你可以給probesize和最大持續時間分析最小值。

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

而且,請注意,較小的值只針對已知 muxers OK,否則連接可能不是由於缺乏有關流 數據來完成。

0

還值得一提的是,如果你是從stdin閱讀MOV文件,改變probesize/analyzeduration值可能不會幫助。據this email thread,它是MOV容器格式的限制:

它通常不可能通過stdin讀取MOV文件,因爲它 是完全正常的,MOV文件包含解碼所需的必要信息 (如編解碼器等等)在文件的最後。 (這不是FFmpeg的限制,而是mov文件 格式的一個特性。)

相關問題