2014-03-06 6 views
0

ffmpegstagefright 라이브러리를 사용하여 h264 비디오를 디코딩하려고합니다. 나는 this 예제를 사용하고 있습니다.왜 AVCodecContext extradata가 NULL입니까?

이 예제는 mp4 개의 파일을 디코딩하는 방법을 보여 주지만, 비디오는 h264 개만 디코딩하고 싶습니다. 여기

내 코드의 조각입니다 ..

AVFormatSource::AVFormatSource(const char *videoPath) 
    { 
     av_register_all(); 

     mDataSource = avformat_alloc_context(); 
     avformat_open_input(&mDataSource, videoPath, NULL, NULL); 
     for (int i = 0; i < mDataSource->nb_streams; i++) 
     { 
      if (mDataSource->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO) 
      { 
       mVideoIndex = i; 
       break; 
      } 
     } 
     mVideoTrack = mDataSource->streams[mVideoIndex]->codec; 

     size_t bufferSize = (mVideoTrack->width * mVideoTrack->height * 3)/2; 
     mGroup.add_buffer(new MediaBuffer(bufferSize)); 
     mFormat = new MetaData; 

     switch (mVideoTrack->codec_id == CODEC_ID_H264) 
     { 
      mConverter = av_bitstream_filter_init("h264_mp4toannexb"); 
      mFormat->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_AVC); 
      if (mVideoTrack->extradata[0] == 1) //SIGSEGV Here 
      { 
       mFormat->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_AVC); 
       mFormat->setData(kKeyAVCC, kTypeAVCC, mVideoTrack->extradata, 
           mVideoTrack->extradata_size); 
      } 
     } 

     mFormat->setInt32(kKeyWidth, mVideoTrack->width); 
     mFormat->setInt32(kKeyHeight, mVideoTrack->height); 
    } 

mVideoTrack->extradata은 NULL입니다. 내가 뭘 잘못하고있어 ?? 내 질문은 에 대해 mVideoTrack->extradata에 있어야하는 내용입니다. kKeyAVCC ??

제발 도와주세요, 당신의 도움이 필요합니다. 미리 감사드립니다.

+0

여기에서 필요한 모든 정보를 찾을 수 있습니다. http://aviadr1.blogspot.com/2010/05/h264-extradata-partially-explained-for.html –

답변

2

입력 내용이 원시 h.264 파일 인 경우 이미 부속서 B 형식입니다. 따라서 "h264_mp4toannexb"변환을 수행 할 필요가 없습니다. 또한 부록 B에서 SPS/PPS는 첫 번째 (또는 모든) IDR 프레임과 함께 인라인으로 전송됩니다. 따라서 추가 데이터가 필요하지 않습니다. 여기에서 자세한 내용을 읽어보십시오. Possible Locations for Sequence/Picture Parameter Set(s) for H.264 Stream

+0

답장을 보내 주셔서 감사합니다. 내가 알기로는,이 'h264'헤더에서 .. 00 00 00 01 67 64 00 1f ac d9 40 50 04 5f 9a 10 00 00 3e 90 00b b8 08 f1 83 19 60 00 00 00 01 68 eb ec b2 2c'. 이 데이터는 SPS 및 PPS입니다. 그래서 ...이 코드는 필요 없습니다. ** mFormat-> setData (kKeyAVCC, kTypeAVCC, mVideoTrack-> extradata, mVideoTrack-> extradata_size); **. 내가 맞습니까? –

+0

정확하고 비트 스트림 필터가 필요하지 않습니다. – szatmary

+0

고마워요 ... –