10 августа 2010 г.

Cтруктура mpeg4

MP4Box неправильно прописывал некоторые параметры субтитров при конвертировании видео для iPhone (статья). Можно было использовать Dumpster Atom Inspector для ручного редактирования нужных полей, но я хотел написать скрипт который делает все автоматически.

Файл формата MPEG4 (будь то .mov, .mp4 или .m4v) состоит из блоков, называемых атомами. Каждый атом имеет формат:
- байты 0-3 - длинна атома (включая эти 4 байта)
- байты 4-7 - имя атома (четырехсимвольная строка, выделенная строка на рисунке)
- байты 8-… - данные атома



Вот из таких атомов и состоит MPEG4 файл. В каждом видео файле должны присутствовать атомы с именами "ftyp", "moov" и "mdat".

В "ftyp" содержится тип этого файла и типы версий основных структур файла. Этот атом всегда первый в файле. Атом "mdat" содержит потоки видео, аудио, субтитров. Атом "moov" для меня был самым интересным, так как он содержит описание треков, информацию о тегах.

Данные атома "moov" (то что начинается с 8-го байта) имеют древовидную структуру состоящих из блоков такого-же формата что и атом (т.е. 4 байта - размер блока, 4-байта - имя блока, с 8-го байта - данные). Формат блока отределяет эго имя, например блок с именем "mvhd" занимает 108 байт, и понять, что там записано не составит труда посмотрев на содержимое этой секции в Atom Inspector.



Кстати о размере блоков, как я понимаю они записаны в "человеческом" виде, т.е. чем байт старше, тем он левее, в компьютере числа представлены в "перевернутом" виде - чем старше байт, тем он правее. Учтите это при получении размеров атомов.

Так же в атоме "moov" -> "udata" -> "meta" содержится информация о тегах iTunes (обложка фильма включительно). Каждый тег в этом блоке так-же представлен блоком формата атом.

Скрипт на Python который печатает структуру MPEG4 файла.

4 комментария:

  1. а каким образом этот скрипт работает?

    ОтветитьУдалить
  2. Скрипт работает, как и описано.
    Проходим по всем атомам выводя информацию о них, находим атом "[b]moov[/b]" и тоже выводим более подробную информацию о этом атоме

    ОтветитьУдалить
  3. Как можно задать Вам вопрос по этой теме, но не публично?

    ОтветитьУдалить