Байты предотвращения эмуляции в MP4

H.264 определяет, что последовательность из двух нулевых байтов должна быть экранирована путем добавления байта «3» после двух нулевых байтов («Предотвращение эмуляции»).

Верно ли это правило экранирования и для формата файла mp4?

Вопрос сопровождается результатами отладки ffmpeg. Я попытался открыть следующий файл:

https://www.dropbox.com/s/vrdy8z96pohh7ah/live_video_fragment_1.mp4?dl=0

VLC играет, а ffmpeg нет. ffmpeg показывает много ошибок, первая из них (с отладкой на уровне журнала):

AVC: Consumed only 41 bytes instead of 796

Отладка ffmpeg показывает, что он пытается проанализировать блок moof в декодере H.264 и терпит неудачу на https://github.com/FFmpeg/FFmpeg/blob/master/libavcodec/h264.c#L312

При синтаксическом анализе 4 байтов, предшествующих блоку traf (который указывает его размер), он понимает байты «0 0 3» как байты предотвращения эмуляции, и из-за этого весь синтаксический анализ выходит из строя.

Итак, является ли это неправильным поведением ffmpeg (который не должен понимать это как предотвращение эмуляции)? Или файл содержит ошибку и байты ДОЛЖНЫ быть экранированы?


person MaMazav    schedule 14.05.2015    source источник


Ответы (1)


Верно ли это правило экранирования и для формата файла mp4?

Экранирование включено для содержимого H264 в MP4, но его следует включать только для частей H264 внутри контейнера MP4. Так что, учитывая, что поле traf является частью формата контейнера MP4, а не каким-либо из модулей NAL H264, его не следует экранировать. Я бы зарегистрировал ошибку в FFmpeg.

person Ronald S. Bultje    schedule 14.05.2015
comment
Спасибо. Я до сих пор не уверен, что это баг ffmpeg, возможно файл содержит ошибку. По какой-то причине ffmpeg считает, что данные выборки начинаются в начале блока MOOF, я предполагаю, что в файле просто отсутствует значение для начального смещения данных фрагмента. Все еще проверяю. Если вы также можете сказать мне, в каком поле должно содержаться это начальное смещение, это очень поможет. Спасибо! - person MaMazav; 14.05.2015
comment
Ну, на самом деле я думаю, что нашел ошибку. в блоке TRUN отсутствует значение data_offset, поэтому считается, что data_offset равен нулю с начала блока MOOF. - person MaMazav; 14.05.2015