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 (который не должен понимать это как предотвращение эмуляции)? Или файл содержит ошибку и байты ДОЛЖНЫ быть экранированы?