2012-11-22 2 views
2

ffmpeg C API를 사용하여 라이브 렌더링 비디오를 mpg 및/또는 mp4로 인코딩합니다 (이후 비디오 사용법에 따라 다름). mp4로 인코딩하면 모든 것이 잘됩니다. 그러나 mpg로 인코딩 할 때 결과 비디오는 모든 플레이어에서 재생할 수 없습니다. ffprobe를 빠르게 호출하면 헤더가 누락되었음을 알 수 있습니다. 그러나 이것은 명시 적으로 쓰고 있기 때문에 거의 불가능합니다. 헤더를 작성할 때avformat_write_header를 사용 함에도 불구하고 mpg에서 헤더가 누락되었습니다.

// ptr->oc is the AVFormatContext 
int error = avformat_write_header(ptr->oc, NULL); 
if (error < 0) 
{ 
    s_logFile << "Could not write header. Error: " << error << endl; 
    fprintf(stderr, "Could not write header. Error: '%i'\n", error); 
    return 1; 
} 

결코 오류가 없습니다 :

이 어떤 프레임을 인코딩하기 전에 내가 헤더를 작성하는 방법입니다.

인코딩의 경우, 나는 the official muxing.c example을 따르고 있으므로 CODEC_FLAG_GLOBAL_HEADER 플래그를 설정합니다. 나는 CODEC_ID_MPEG2VIDEO (비디오 용)와 CODEC_ID_MP2 (오디오 용)를 사용합니다.

결과 mpg로이 작업을 수행 할 때 I "인코딩"그것과 같은 외부는 FFmpeg 실행에 추가 단계 : "는 FFmpeg -i ownEncoded.mpg -sameq -y working.mpg". 는 그래서 여기

가 유일한의는 FFmpeg 전에보고입니다 ... 모든 데이터가있을 경우에만 헤더는 어떤 이유로 누락 된 것 같다/헤더 기록 할 때 :

mpeg ------------------- 
lvl: 24 
msg: VBV buffer size not set, muxing may fail 

하면 해당 될 수 있을까 문제?

mp4로 인코딩 할 때 qmin, qmax, me_method 등과 같은 특별한 값을 설정하는 것을 제외하고는 mp4를 정확히 동일한 인코딩으로 인코딩 할 때 여기서 무엇이 잘못 될지 궁금합니다. ffmpeg가 실제로 헤더를 올바르게 쓰도록 특수 값을 설정해야합니까?

+1

사용중인 형식/vcodec/acodec을 지정하십시오. "mpeg"/ "mpeg1video"/ "mp2"? – pogorskiy

+0

그것은 mpeg2video/mp2입니다. 질문에 추가 할 것입니다. – TheSHEEEP

+0

오 마이어! 나는 CODEC_ID_MPEG2VIDEO가 제대로 설정되지 않고 오히려 H264를 사용하는 오타가 있음을 알게되었습니다. 힌트를 주셔서 감사합니다. 다시 한 번 보았습니다. :) – TheSHEEEP

답변

1

오 마이!

나는 H2D64를 기본값으로 사용하는 대신 CODEC_ID_MPEG2VIDEO가 제대로 설정되지 않는 오타가 있었다. 물론 그것은 그 좋은 .mpg를 작동시키지 않습니다.

의견에 대한 힌트를 주셔서 감사합니다. :)

2

아마 AVCodecContext에 대해 CODEC_FLAG_GLOBAL_HEADER 플래그를 설정해야합니다. 따라서 당신이

if(outputFormat->oformat->flags & AVFMT_GLOBALHEADER) 
    codec->flags |= CODEC_FLAG_GLOBAL_HEADER; 

어쩌면 경고가의는 FFmpeg 출력을 참조 할 필요가 작성해야 outputFormatAVOutputFormat

인 경우 outputFormat->oformat->flags & AVFMT_GLOBALHEADER == true에 필요합니다.

+0

muxing.c 예제를 따르기 때문에이 플래그를 설정합니다. 나는 그 정보를 원래의 질문에 추가 할 것이다 :) ffmpeg가보고하는 것을 추가 할 것이다. – TheSHEEEP

관련 문제