2012-08-01 3 views
2

ffmpeg를 사용하여 iDevice에서 udp 스트림을 재생하고 있습니다. 비디오 및 오디오가 성공적으로 재생됩니다.ffmpeg : udp 스트림 재생

나는 다음과 같은 함수 호출 시간이 오래

avformat_find_stream_info 

그것은이 기능의 실행을 완료하는 데 약 10 초 소요을한다는 것을 여기에있어 유일한 문제.

MPEG-4 VIDEO v3 (DIV3) 
RESOLUTION : 640x480 
Frame rate : 25 

어떤 아이디어이 지연을 해결하는 방법 : 내가 연주하고있어 미디어는 다음과 같은 속성이 있습니다?

+0

[documentation] (http://ffmpeg.org/doxygen/trunk/group__lavf__decoding.html#gd42172e27cddafb81096939783b157bb) 그것은 왜 그것이 장치에서 느린 지 이해할 수 있습니다. 'avformat_find_stream_info'는 여러 개의 코덱을 시도하여 인코딩 정보를 얻기 위해 헤더없는 스트림을 읽도록 설계되었습니다. 스트림에 헤더가 없는가? – Joe

+0

VLC로 스트리밍 했으므로 헤더가있는 것 같습니다. 이것을 위해 사용해야 할 것이 무엇인지, 이것을 올바르게 처리하는 방법을 알고 있습니까? – deimus

+0

필자는 익숙하지 않지만 문서에 따르면'avformat_open_input'은 헤더 정보를 얻을 수 있지만 헤더 정보가없는 경우'avformat_find_stream_info'를 호출 할 것을 권장합니다. – Joe

답변

5

나는 이것이 이전 질문 이었음을 알았지 만, 최근에이 문제가 발생 했으므로 OP가 도움이되지는 않을지라도 나는 후손을 위해 답을 줄 것이다.

짧은 대답 :

probesize 및/또는 기본보다 작은 뭔가를 max_analyze_durationAVFormatContext 필드를 설정, 즉 더 이상 대답을

std::string url_path = "..."; 
AVFormatContext *format_ctx = NULL; 
avformat_open_input(&format_ctx, url_path.c_str(), NULL, NULL); 
format_ctx->max_analyze_duration = 50000; 
avformat_find_stream_info(format_ctx, NULL); 

:

avformat_find_stream_info가 읽 입력 데이터 스트림을보고 패킷을 기반으로 AVFormatContext을 채 웁니다. AVFormatContext 구조체에 설정된대로 max_analyze_duration 값까지이 작업을 수행 할 수 있습니다.

로컬 비디오 파일의 경우 일반적으로 매우 빠르지 만 네트워크 스트림의 경우 매우 오랜 시간이 걸릴 수 있습니다 (특히 스트림이 손상된 경우). 이 곳에서 avformat_find_stream_info의 긴 대기 시간이 적용됩니다. max_analyze_duration의 기본값은 5000000 (AV_TIME_BASE 단위)입니다. 즉, avformat_find_stream_info은 입력 스트림에서 해당 기간까지 샘플링 패킷을 처리 할 수 ​​있습니다 (IIRC AV_TIME_BASE는 마이크로 초와 같기 때문에 기본 최대 대기 시간은 5 초입니다) . 작은 일에 max_analyze_duration을 설정하여

는보다 합리적인 뭔가 최악의 대기 시간을 제한하면서 우리의 AVFormatContext 필드 적은 정보로 무엇을 선택 avformat_find_stream_info 강제 50,000 (~ 500ms 이내) 말한다. 제 경험상이 문제는 아무런 문제가 없었습니다 (비디오 소스가 어떻게 달라졌을지라도). probesize 필드는 avformat_find_stream_info이 스트림에서 읽을 수있는 바이트 수를 결정합니다. 이 값을 너무 낮게 설정하면 정확한 코덱 정보를 얻을 수없는 경우가 있습니다.

+0

50,000 마이크로 초 ~ 50 밀리 초 –

관련 문제