Разбор MP4 Atom - где настроить время?

Я написал синтаксический анализатор MP4, который может просто считывать атомы в MP4 и сшивать их вместе — в результате получается технически действительный файл MP4, который может открыть Quicktime и т. д., но он не может воспроизводить звук, как я полагаю, информация о времени/сэмплировании отключена. Я, вероятно, должен упомянуть, что меня интересует только аудио.

Что я делаю, так это пытаюсь взять атомы moov/etc из существующего MP4, а затем взять только подмножество атома mdat в файле, чтобы создать новый, меньший MP4. При этом я изменил duration в атоме mvhd, а также продолжительность в заголовке mdia. В этом файле нет tkhd атомов, которые имеют правки, поэтому я считаю, что мне не нужно изменять там длительность - что я упускаю?

При создании нового MP4 я правильно разделяю блок mdat широким полем и сохраняю заголовок/размер «mdat» на своих местах — я обязательно обновляю размер с новым содержимым.

Теперь это на 110% возможно, я упускаю что-то важное в формате, но если это возможно, я бы хотел получить финальную часть. Кто-нибудь получил какие-либо входные данные/идеи?

Код можно найти по следующей ссылке:

https://gist.github.com/ryanmcgrath/958c602cff133bd7fa0b


person Ryan McGrath    schedule 26.08.2013    source источник
comment
Какой звук хранится в этих файлах? Необработанный PCM, сжатый CBR или сжатый VBR?   -  person Multimedia Mike    schedule 31.08.2013


Ответы (1)


Я собираюсь нанести удар в темноте и сказать, что вы не обновляете свои смещения stbl должным образом. По крайней мере, я нигде (на первый взгляд) не видел, чтобы ваш питон делал это.

СТСК

Начнем с расположения данных. Пакеты записываются в файл в виде фрагментов, а заголовок сообщает декодеру, где находится каждый «блок» этих фрагментов. В таблице stsc указано, сколько существует элементов на блок. first chunk указывает, где начинается этот новый фрагмент. Это немного сбивает с толку, но посмотрите на мой пример. Это говорит о том, что у вас есть 100 сэмплов на чанк, вплоть до 8-го чанка. На 8-м чанке 98 сэмплов.

введите здесь описание изображения

СТКО

Тем не менее, вы также должны отслеживать, где находятся смещения этих фрагментов. Это работа таблицы stco. Итак, где в файле смещение чанка 1, или смещение чанка 2 и т. д.

введите здесь описание изображения

Если вы измените какие-либо данные в mdat, вы должны сохранить эти таблицы. Вы не можете просто вырезать mdat данные и ожидать, что декодер знает, что делать.

Как будто этого было недостаточно, теперь вы также должны поддерживать таблицу времени выборки (stts), таблицу размера выборки (stsz) и, если это было видео, таблицу выборки синхронизации (stss).

СТТС

stts указывает, как долго должен воспроизводиться семпл в единицах временной шкалы. Если вы делаете аудио, шкала времени, вероятно, составляет 44100 или 48000 (кГц).

введите здесь описание изображения

Если вы отключили некоторые данные, теперь все может быть не синхронизировано. Если все значения здесь имеют одинаковую продолжительность, все будет в порядке.

СТСЗ

stsz указывает размер каждой выборки в байтах. Это важно для того, чтобы декодер мог начать с фрагмента, а затем просмотреть каждый образец по его размеру.

введите здесь описание изображения

Опять же, если все размеры выборки одинаковы, все будет в порядке. Аудио, как правило, почти одинаково, но видео сильно различается (с ключевыми кадрами и прочим).

СТСС

И последнее, но не менее важное: у нас есть таблица stss, в которой указано, какие кадры являются ключевыми. У меня есть опыт работы только с AAC, но каждый звуковой кадр считается ключевым кадром. В этом случае у вас может быть одна запись, описывающая все пакеты.

введите здесь описание изображения


Что касается вашего первоначального вопроса, отображение времени не всегда одинаково соблюдается в каждом игроке. Самый точный способ — суммировать длительность всех кадров в заголовке и использовать это как общее время. Другие проигрыватели используют метаданные в заголовках дорожек. Я считаю, что лучше оставить все значения одинаковыми, и тогда игроки будут счастливы.

Если вы делаете все это, а я пропустил это в сценарии, вы можете опубликовать образец mp4 и отдельное приложение, и я могу попытаться вам помочь.

person devshorts    schedule 31.08.2013
comment
Привет - не игнорирую твой ответ, просто в данный момент занят. Я, вероятно, вернусь к нему в ближайшие день или два! - person Ryan McGrath; 06.09.2013
comment
@RyanMcGrath, не парься, не торопись - person devshorts; 07.09.2013
comment
Это было невероятно информативно и полезно, даже несмотря на то, что в конце концов я подошел к проблеме по-другому (полностью избегая необходимости в этом, хотя и раздражающе...). Вы оказались правы, насколько я могу судить. - person Ryan McGrath; 27.09.2013
comment
Потрясающий пост @devshorts Мне интересно, есть ли ограничение на количество сэмплов на кусок. Могу ли я иметь один фрагмент со всеми моими необработанными сэмплами AAC? Или мне нужно разделить образцы на разные куски? - person Soham; 09.05.2014
comment
@Soham, ты можешь сделать их все одинаковыми. Согласно спецификации, каждая запись в таблице соответствует набору последовательных фрагментов, каждый из которых содержит одинаковое количество образцов. Кроме того, каждый из образцов в этих фрагментах должен использовать одно и то же описание образца. Всякий раз, когда изменяется количество сэмплов на порцию или описание сэмпла, вы должны создать новую запись в таблице. Если все фрагменты имеют одинаковое количество сэмплов на фрагмент и используют одно и то же описание сэмпла, в этой таблице будет одна запись. - person devshorts; 09.05.2014
comment
@devshorts все m4as (аудио с постоянным битрейтом), которые я открываю, имеют переменные размеры в STSZ ... каждый образец имеет разный размер. Как это возможно? Как рассчитать размер сжатой выборки? (Я думаю, что образцы сжатого звука должны иметь одинаковый размер выборки) - person Soham; 13.05.2014
comment
@Soham, это зависит от водителя. Постоянный битрейт не означает постоянный размер данных. Постоянная скорость передачи данных обычно является предложением, и вокруг этого есть различия. Если у вас есть AAC, размер пакета может незначительно отличаться. PCM всегда имеет один и тот же размер, поскольку он всегда необработанный, но с удалением психоакустики вы можете получить различия в сжатии. - person devshorts; 13.05.2014
comment
Как называется это программное обеспечение, которое анализирует и печатает данные MP4 таким образом? - person Tomer; 03.08.2015
comment
@Tomer, если вам нужен программный синтаксический анализатор, я написал его в качестве примера использования моей библиотеки комбинатора парсеров f#: github.com/devshorts/ParsecClone/tree/master/Samples/Mp4Matcher - person devshorts; 03.08.2015
comment
@devshorts Спасибо, очень полезно - person Tomer; 03.08.2015
comment
@devshorts Как я могу извлечь вышеуказанную информацию, если у меня есть только атом mdat? - person TOP; 24.12.2015
comment
Если у вас есть только mdat, у вас в основном просто двоичные данные без метаданных, поэтому вы не можете. Это в основном мусор без метаданных - person devshorts; 24.12.2015
comment
Можете ли вы сказать, какой инструмент вы использовали для анализа файла? - person fillobotto; 25.01.2020
comment
Я думаю, это называлось просмотрщик атомов QuickTime. - person devshorts; 27.01.2020