Как заполнить поле avcC при кодировании файла fmp4 данными H264? - PullRequest
0 голосов
/ 03 января 2019

В моем кадре h264 просто есть рамка I / P.

Поле avcC, которое я заполнил, выглядит следующим образом, но он не может воспроизводиться с проигрывателем VLC (временная метка запускается, но изображение отсутствует).

Запись конфигурации декодера AVC:

Начальное смещение 511 (0X000001FF)

Размер коробки 39 (0X00000027)

Тип коробки avcC (0X61766343)

Подробная информация:

Версия конфигурации 1 (0X00000001)

Индикация профиля AVC Main = 77 (0X0000004D)

Совместимость профиля AVC 0 (0X00000000))

Индикация уровня AVC 42 (0X0000002A)

NAL Размер длины блока 3 (0X00000003)

Количество наборов параметров последовательности 1 (0X00000001)

Параметр последовательностиset (0) 0x67 0x4d 0x00 0x2a 0x96 0x35 0xc0 0xf0 0x04 0x4f 0xcb 0x37 0x01 0x01 0x01 0x02

Num наборы параметров изображения 1 (0X00000001)

набор параметров изображения (0x 0xc 0xx 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x 0x

Фрейм IDR H264 (SPS PPS SEI):

unsigned char IDR_NALU [] = {0x00,0x00,0x00,0x01, 0x67,0x4D, 0x00,0x2A, 0x96,0x35,0xC0,0xF0, 0x04,0x4F, 0xCB, 0x37, 0x01,0x01,0x01,0x02, 0x00,0x00,0x00,0x01, 0x68,0xEE, 0x3C, 0x80, 0x00,0x00,0x00,0x01, 0x06,0xE5,0x01,0x2E, 0x80 / ​​ Данные кадра I опущены /};

Я думаю, что мой ящик avcC заполнен неправильно, но я не знаю, как правильно его заполнить.Какой мастер может мне помочь

1 Ответ

0 голосов
/ 03 января 2019

Вот некоторый псевдокод о том, как записать содержимое поля avcC:

//  Version
Write(0x1);

//  Profile
Write(sps[0].data[1]);

//  Compatibility
Write(sps[0].data[2]);

//  level
Write(sps[0].data[3]);

// Reserved (6 bits), NAL Unit length size - 1 (2 bits)
Write(0xFC | 3);

//  Reserved (3 bits), num of SPS (5 bits)
Write(0xE0 | 1);

// 2 bytes for length of SPS
WriteWord(sps[0].size);

//  Data of SPS
for (size_t i = 0; i < sps[0].size(); ++i)
{
    Write(sps[0].data[i]);
}

// Number of PPS
Write(&b, pps.size());

for (size_t i = 0; i < pps.size(); ++i)
{
    // 2 bytes for length of PPS
    WriteWord(pps[i].size);

    for (size_t j = 0; j < pps[i].size; ++j)
    {
        //  Data of PPS
        Write (pps[i].data[j]);
    }
}
...