О кодировке fmp4, как заполнить поле mdat с кадром H264?

Я использовал язык C для кодирования кадров H264 (просто есть кадр I/P) в файлы fmp4. Когда я заполняю поле mdat, я не знаю, как заполнить данные фрейма.
Заполняются ли данные кадра (I/P) напрямую?
Нужно ли заполнять первые 4 байта длиной кадра?

Я попытался использовать FFMPG для кодирования файла fmp4 и обнаружил, что данные в окне mdat полностью отличаются от исходных данных кадра I/P.
Это снова закодировано?
Могу ли я напрямую заполнить данные кадра I/P в окне mdat?

1 ответ

Решение

H.264 может быть в разных форматах потока. Один называется "Приложение B", другой - MP4. В "Приложении B" ваши блоки NAL имеют префикс с начальными кодами 00 00 00 01 или 00 00 01. В MP4 ваши блоки NAL имеют префикс с размером в байтах.

Я предполагаю, что ваш кодер выдает "Приложение B".

  1. Удалить стартовый код (00) 00 00 01

  2. Префикс ваших блоков NAL с размером (обычно 4 байта)

  3. Отфильтруйте единицы AUD/SPS/PPS NAL из вашего потока

  4. Запишите преобразованные единицы NAL в поле MDAT

  5. Создайте окно конфигурации AVC ('avcC') на основе вашего SPS, PPS и размера длины

  6. Сохраните ваш avcC box в moov->trak->mdia->minf->stbl->avc1->avcC

  7. Пока вы записываете свои сэмплы в mdat - следите за размерами, смещениями и типами кадров, чтобы создать правильные поля stts, stss, stsc, stsz и stco.

Другие вопросы по тегам