Почему я не могу заставить работать измененный размер расширенного блока (чанка) MPEG-4? - PullRequest
0 голосов
/ 14 апреля 2019

Обзор

В рамках проекта по написанию синтаксического анализатора файлов MPEG-4 (MP4) мне нужно понять, как обрабатывается размер расширенного блока (или блока) в файле MP4. Когда я попытался вручную смоделировать файл MP4 с расширенным размером блока, мультимедийные проигрыватели сообщали, что файл недействителен.

Техническая информация

Перефразируя спецификацию MPEG-4 :

Файл MP4 формируется как серия объектов, называемых «ящиками». Все данные содержатся в полях, в файле нет других данных.

Вот снимок экрана Раздел 4.2: Структура объекта , который описывает заголовок окна и его поля размера и типа:

MPEG-4 Object Structure (part 1)

enter image description here

Большинство заголовков блоков MP4 содержат два поля: 32-битный компактный размер блока и 32-битный тип блока. Компактный размер коробки поддерживает данные коробки до 4 ГБ. Иногда блок MP4 может содержать больше данных (например, большой видеофайл). В этом случае размер компактного блока устанавливается на 1, и восемь (8) октетов добавляются сразу после типа блока. Это 64-разрядное число известно как «расширенный размер ящика» и поддерживает размер ящика до 2 ^ 64.

Чтобы лучше понять размер расширенного блока, я взял простой файл MP4 и хотел изменить поле moov/trak/mdia, чтобы использовать расширенный размер блока, а не компактный размер.

Вот как выглядит файл MP4 перед его изменением. Три заголовка блока выделены КРАСНЫМ:

MP4 file before inserting an extended box size

Мой план был следующий:

  1. Изменить поле moov/trak/mdia
    • В moov/trak/mdia вставьте восемь (8) октетов сразу после типа поля ('mdia'). В конечном итоге это будет наш расширенный размер.
    • Скопируйте размер компактного блока во вновь вставленный расширенный размер блока, добавив 8 к размеру, чтобы компенсировать вновь вставленные октеты. Размер вставляется в порядке с прямым порядком байтов.
    • Установите компактный размер 1.
  2. Изменить поле moov/trak
    • Добавьте 8 к существующему размеру компактной коробки (чтобы компенсировать восемь октетов, добавленных к mdia).
  3. Изменить поле moov
    • Добавьте 8 к существующему размеру компактной коробки (опять же, чтобы компенсировать восемь октетов в mdia)

Вот как теперь выглядит файл MP4 с измененными октетами в RED:

MP4 file after inserting an extended box size

Что мы сделали?

Мы сказали, что анализатор / проигрыватель MP4 должен брать размер поля moov/trak/mdia из расширенного поля, а не из поля компактного размера, и увеличил все родительские блоки на восемь (8), чтобы компенсировать недавно вставленный расширенный блок размер в mdia коробке.

В чем проблема?

Когда я пытаюсь воспроизвести измененный файл MP4, я получаю сообщения об ошибках от различных медиаплееров:

Windows Media Player

Windows Movies & TV App

Почему медиапроигрыватели видят измененный файл как недействительный MP4?

  • Мне нужно было изменить какие-либо другие поля?
  • Должен ли расширенный размер поля превышать 2 ^ 32?
  • Может ли быть так, что только определенные типы ящиков поддерживают расширенный размер ящиков (например, Media Data)?

1 Ответ

0 голосов
/ 15 апреля 2019

Наконечник шляпы @Alan Birtles за указание на то, что смещения чанка также должны быть изменены. Действительно, поле stco (пример смещения фрагмента таблицы?) Содержит абсолютные смещения файла для фрагментов данных в блоке mdat (вместо относительных смещений в блоке). Это можно увидеть в спецификации документа:

MPEG-4 Specification for stco box

Смещение чанка должно быть увеличено на количество октетов, которые мы добавили в файл перед полем mdat. В нашем случае это расширенный размер восьми (8) октетов, вставленный в поле mdia.

Осталось только вручную изменить смещения чанка, найденные в двух полях stco (как видео, так и аудиодорожки), добавив восемь (8) к каждому смещению чанка. Вот поля stco перед добавлением 8 к их смещениям чанка:

stco box: audio stco box: video

Теперь файл проходит тесты достоверности инструментов ffmpeg и ffprobe . Интересно, что хотя VLC преуспевает в воспроизведении измененного файла, другие медиаплееры (например, Windows Media Player, MS Photos, MS Movies & TV, MS MovieMaker) сообщают, что файл поврежден. Не ясно, почему они не могут воспроизвести файл. Непроверенные возможности включают в себя:

  • Не поддерживает расширенный размер ящика для любого ящика, кроме mdat
  • Balking, если размер расширенного ящика меньше 2 ^ 32

В итоге, если какие-либо поля добавляются в блоки (например, расширенный размер блока), смещения фрагмента stco необходимо увеличивать на количество октетов, вставленных в файл MP4, предшествующий каждому блоку stco.

...