Я пытаюсь исследовать проблему с генерируемым MP4, возвращая ошибку:
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x55f0ae819080] Failed to add index entry
Last message repeated 277 times
[h264 @ 0x55f0ae81c300] Invalid NAL unit size (-800932280 > 6).
Первый кадр отлично декодируется, а все будущие кадры не декодируются.В результате получается видео продолжительностью 0,042 секунды.
Чтобы помочь в расследовании, я ffmpeg
кодировал одно и то же видео таким же образом, чтобы я мог сравнить два файла.Однако я заметил, что в файле с кодировкой ffmpeg
образец видео начинается не с 0x000001
или 0x00000001
.
. Я попытался просмотреть спецификацию MP4 и спецификацию H.264, чтобыпонять, почему этот стартовый код иногда требуется, но не требуется в этом случае, но там буквально сотни страниц, и я не смог ничего найти за день чтения.
Генерируемый ffmpeg
файл доступен здесь: http://files.stevendesu.com/test.mp4
Если вы откроете это с помощью синтаксического анализатора атомов MP4, вы заметите, как запускается первый mdat
атом:
0000 6DF4 6D64 6174 0000 04BF 6588 8101
1788 8C12 0001 1498 3800 188E 003F FFFC
...
Первые 8 байтов имеют смысл: 00006DF4
(28148) = размер атома mdat
, 6D646174
= "mdat" в ASCII
После этого атом mdat
начинается с 0x000004
.В соответствии с атомом traf
в предыдущем moof
, первый отсчет видео (с длительностью 800/16000 секунд и размером 19899 байт) должен начинаться именно здесь.Поэтому 0x000004
- это первые 3 байта первого примера видео.
Либо этот пример видео не начинается с кода запуска NALU, либо вокруг NALU есть какой-то заголовок / оболочка, которую я не делаюпонять.
Может кто-нибудь объяснить мне, почему этот пример видео не начинается с кода запуска NALU?