Обзор
В рамках проекта по написанию синтаксического анализатора файлов MPEG-4 (MP4) мне нужно понять, как обрабатывается размер расширенного блока (или блока) в файле MP4. Когда я попытался вручную смоделировать файл MP4 с расширенным размером блока, мультимедийные проигрыватели сообщали, что файл недействителен.
Техническая информация
Перефразируя спецификацию MPEG-4 :
Файл MP4 формируется как серия объектов, называемых «ящиками». Все данные содержатся в полях, в файле нет других данных.
Вот снимок экрана Раздел 4.2: Структура объекта , который описывает заголовок окна и его поля размера и типа:
Большинство заголовков блоков MP4 содержат два поля: 32-битный компактный размер блока и 32-битный тип блока. Компактный размер коробки поддерживает данные коробки до 4 ГБ. Иногда блок MP4 может содержать больше данных (например, большой видеофайл). В этом случае размер компактного блока устанавливается на 1, и восемь (8) октетов добавляются сразу после типа блока. Это 64-разрядное число известно как «расширенный размер ящика» и поддерживает размер ящика до 2 ^ 64.
Чтобы лучше понять размер расширенного блока, я взял простой файл MP4 и хотел изменить поле moov/trak/mdia
, чтобы использовать расширенный размер блока, а не компактный размер.
Вот как выглядит файл MP4 перед его изменением. Три заголовка блока выделены КРАСНЫМ:
Мой план был следующий:
- Изменить поле
moov/trak/mdia
- В
moov/trak/mdia
вставьте восемь (8) октетов сразу после типа поля ('mdia'). В конечном итоге это будет наш расширенный размер.
- Скопируйте размер компактного блока во вновь вставленный расширенный размер блока, добавив 8 к размеру, чтобы компенсировать вновь вставленные октеты. Размер вставляется в порядке с прямым порядком байтов.
- Установите компактный размер 1.
- Изменить поле
moov/trak
- Добавьте 8 к существующему размеру компактной коробки (чтобы компенсировать восемь октетов, добавленных к
mdia
).
- Изменить поле
moov
- Добавьте 8 к существующему размеру компактной коробки (опять же, чтобы компенсировать восемь октетов в
mdia
)
Вот как теперь выглядит файл MP4 с измененными октетами в RED:
Что мы сделали?
Мы сказали, что анализатор / проигрыватель MP4 должен брать размер поля moov/trak/mdia
из расширенного поля, а не из поля компактного размера, и увеличил все родительские блоки на восемь (8), чтобы компенсировать недавно вставленный расширенный блок размер в mdia
коробке.
В чем проблема?
Когда я пытаюсь воспроизвести измененный файл MP4, я получаю сообщения об ошибках от различных медиаплееров:
Почему медиапроигрыватели видят измененный файл как недействительный MP4?
- Мне нужно было изменить какие-либо другие поля?
- Должен ли расширенный размер поля превышать 2 ^ 32?
- Может ли быть так, что только определенные типы ящиков поддерживают расширенный размер ящиков (например, Media Data)?