О кодировке 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".
Удалить стартовый код (00) 00 00 01
Префикс ваших блоков NAL с размером (обычно 4 байта)
Отфильтруйте единицы AUD/SPS/PPS NAL из вашего потока
Запишите преобразованные единицы NAL в поле MDAT
Создайте окно конфигурации AVC ('avcC') на основе вашего SPS, PPS и размера длины
Сохраните ваш avcC box в moov->trak->mdia->minf->stbl->avc1->avcC
Пока вы записываете свои сэмплы в mdat - следите за размерами, смещениями и типами кадров, чтобы создать правильные поля stts, stss, stsc, stsz и stco.