Почему дополнительные данные AVCodecContext имеют значение NULL?

Я пытаюсь декодировать h264 видео, используя библиотеки ffmpeg и stagefright. Я использую этот пример.

В примере показано, как декодировать 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??

Пожалуйста, помогите мне, мне нужна Ваша помощь. Заранее спасибо.


person Arsen Davtyan    schedule 06.03.2014    source источник
comment
Вы можете найти всю необходимую информацию здесь aviadr1.blogspot.com /2010/05/   -  person Cedric Fung    schedule 06.03.2014


Ответы (1)


Если ваш ввод представляет собой необработанный файл h.264, он уже находится в формате приложения B. Так что вам не нужно делать преобразование "h264_mp4toannexb". Кроме того, в приложении B SPS/PPS передаются вместе с первым (или каждым) кадром IDR. Так что никаких дополнительных данных не нужно. Подробнее читайте здесь: Возможные местоположения для набора параметров последовательности/изображения для потока H.264

person szatmary    schedule 06.03.2014
comment
Большое спасибо за ваш ответ. Как я понял, в этом заголовке h264.. 00 00 00 01 67 64 00 1f ac d9 40 50 04 5f 9a 10 00 00 3e 90 00 0b 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);. Я прав? - person Arsen Davtyan; 07.03.2014
comment
Правильно, и вам не нужен фильтр битового потока. - person szatmary; 07.03.2014