2010-07-20 4 views
3

ffmpeg (libavcodec)를 사용하여 여러 개의 nal 유닛을 디코딩하려고했지만 "프레임 없음"오류가 발생합니다. How does one encode a series of images into H264 using the x264 C API?에 가이드 라인을 적용하여 전국 단위를 제작했습니다. 나는 디코딩을 위해 다음과 같은 전략을 시도 :H264 : ffmpeg로 nal 단위의 시리즈 디코드

avcodec_init(); 
avcodec_register_all(); 
AVCodec* pCodec; 
pCodec=lpavcodec_find_decoder(CODEC_ID_H264); 
AVCodecContext* pCodecContext; 
pCodecContext=lpavcodec_alloc_context(); 
avcodec_open(pCodecContext,pCodec); 
AVFrame *pFrame; 
pFrame=avcodec_alloc_frame(); 
//for every nal unit:  
    int frameFinished=0; 
    //nalData2 is nalData without the first 4 bytes 
    avcodec_decode_video(pCodecContext,pFrame,&frameFinished,(uint8_t*) nalData2,nalLength); 

나는이 코드에 도착 모든 유닛을 통과를하지만 0은 내가 pCodecContext 설정에 문제가있을 수 있어야합니다 생각 frameFinished 유지됩니다. 누군가가 저에게 실제 사례를 보낼 수 있습니까?

고맙습니다.

+0

을 디코더를 들어 동영상을 디코딩 할 수 있도록, 당신은 그것을 스트림 매개 변수를 설정하고 사진 매개 변수를 설정 NAL 단위를 공급합니다 조각/프레임. – Flame

답변

3

이 자습서를 확인하십시오. H.264를 포함한 모든 비디오 형식 디코딩 할 수 있어야한다 :

http://dranger.com/ffmpeg/

나도 몰라 정확히 어떤 문제를 일으키는을,하지만 난 당신이 아니라는 사실을 함께 할 수있는 뭔가가 의심 libavformat의 av_read_frame을 사용하여 한 번에 프레임 상당의 데이터를 파싱합니다. H.264는 프레임을 여러 슬라이스로 분할 할 수 있으므로 여러 NAL 단위를 분할 할 수 있습니다.

저는 x264 인코더가 기본적으로이 작업을 수행하지 않으며 프레임 당 하나의 NAL 유닛을 생성합니다. 그러나, 디코더에 공급 될 필요가있는 다른 스트림 정보를 갖는 NAL 유닛이있다. 과거에 이것을 실험 해본 결과 av_read_frame은 프레임 수의 데이터를 구문 분석 할 때 가끔 여러 개의 NAL 단위를 포함합니다. 튜토리얼을 면밀히 따르고 그것이 작동하는지 확인하는 것이 좋습니다.

또 다른 것은 NAL 장치의 첫 번째 4 바이트를 avcodec_decode_video으로 전달해야한다고 생각합니다.이 코드가 시작 코드 인 경우 (0x00000001)입니다. av_read_frame의 출력을 조사한 후에 시작 코드는 디코더에 전달 될 때 데이터에 남아 있습니다.

0

코덱 컨텍스트 인스턴스 코드 후이 시도 : 제대로 디코딩하기 전에

if(pCodec->capabilities & CODEC_CAP_TRUNCATED) 
     pCodecContext->flags |= CODEC_FLAG_TRUNCATED; /* We may send incomplete frames */ 
    if(pCodec->capabilities & CODEC_FLAG2_CHUNKS) 
     pCodecContext->flags |= CODEC_FLAG2_CHUNKS;