GPAC / MP4Box

GPAC / MP4Box позволяет собирать и редактировать файлы MP4/ISOBMFF, импортировать и извлекать дорожки, разрезать и объединять материалы, готовить DASH, HLS и CMAF, управлять метаданными и HEIF, шифровать потоки и проверять структуру контейнера через команды MP4Box и фильтры GPAC.

Основная логика MP4Box строится вокруг контейнера ISO Base Media File Format: программа умеет создавать новый MP4 из элементарных потоков и других контейнеров, менять уже существующий файл, извлекать отдельные дорожки, показывать таблицы семплов и дерево боксов, а также передавать часть операций движку фильтров GPAC. Это инструмент для точного пакетирования и служебной обработки медиа, а не монтажный редактор с таймлайном.

Рабочий интерфейс в большинстве задач — командная строка. Поэтому освоение начинается не с панелей и кнопок, а с понимания идентификаторов дорожек, временных шкал, фрагментов, брендов ISOBMFF и того, когда команда переписывает исходный файл. Взамен MP4Box даёт детальный контроль над контейнером и хорошо подходит для автоматизированных цепочек подготовки видео, аудио, субтитров и потоковых представлений.

Скачать GPAC / MP4Box

Оценка 9.7Рекомендуем
  • Конвертация видео
  • Сжатие файлов
  • Просто для новичков
Скачать бесплатно на Windows
Лучшая альтернатива
GPAC / MP4Box
Оценка 8.5
  • Нет визуального таймлайна
  • Сложный синтаксис параметров
  • Резка привязана к RAP
Скачать GPAC / MP4Box
Загрузка начнётся после нажатия

Что именно делает GPAC / MP4Box

MP4Box — специализированный мультимедийный упаковщик. Его сильная сторона — операции, при которых кодированный медиапоток уже существует, а пользователю нужно правильно поместить его в MP4, 3GP, HEIF или родственный ISOBMFF-контейнер, извлечь обратно, перестроить таблицы, изменить свойства дорожек либо подготовить потоковую раздачу. При импорте источником может быть не только MP4: доступные демультиплексоры GPAC позволяют получать дорожки из AVI, MPEG-PS, MPEG-TS, Matroska и других поддерживаемых форматов.

Название GPAC в этой паре важно потому, что часть операций MP4Box выполняет через общий фильтровый движок. Импорт, экспорт, разрезание, фрагментация, DASH-пакетирование и шифрование используют фильтровые сессии. Отдельная команда gpac даёт прямой доступ к этим фильтрам и позволяет строить цепочки, которые MP4Box не выражает своими высокоуровневыми ключами. При этом редактирование существующего MP4 — удаление дорожек, правка некоторых метаданных, работа с item-структурами HEIF, hint-треками и рядом системных сущностей — остаётся характерной задачей именно MP4Box.

Практически это означает простое правило. Если задача формулируется как изменить структуру этого MP4 или упаковать эти дорожки в MP4, начинать удобнее с MP4Box. Если требуется произвольная обработка по цепочке — декодирование, масштабирование, перекодирование, смешивание, сетевой ввод, выбор PID по свойствам и вывод в несколько направлений — обычно проще перейти к gpac и явно собрать граф фильтров.

Установщик GPAC с выбором компонента MP4Box в списке устанавливаемых модулей

Командная модель и справка

Базовый синтаксис выглядит как MP4Box [опции] входной_файл [опции] [дополнительные_входы]. Ключи не образуют один строгий порядок, потому что относятся к разным подсистемам: общим параметрам, импорту, экспорту, DASH, splitting, meta/HEIF, scene encoding и hinting. Для реальной работы полезнее не запоминать длинный список, а вызывать тематическую справку и подбирать ключи под задачу.

MP4Box -h
MP4Box -h general
MP4Box -h import
MP4Box -h split
MP4Box -h dash
MP4Box -h meta
MP4Box -h hint

Одна из самых важных особенностей: при многих операциях MP4Box по умолчанию меняет указанный входной MP4, а не создаёт рядом копию. Если исходник нужно сохранить нетронутым, задавайте -out или создавайте новый контейнер через -new. Это особенно критично для команд удаления дорожек, языка, брендов и других правок структуры: команда может быть корректной, но ожидание получить новый файл без -out будет ошибочным.

При сохранении обычного MP4 программа стремится уложить метаданные в начале файла и использует интерливинг, подходящий для последовательного чтения. Такая запись может требовать временного файла. Если системный раздел мал или запрещена запись, операция завершается ошибкой даже при достаточном месте рядом с исходником. Каталог временных данных задаётся глобальным параметром -tmp. Для некоторых сценариев можно выбрать иной режим хранения, например -flat, но менять его нужно осознанно: структура размещения данных влияет на способ чтения и пригодность файла для progressive download.

Для путей с пробелами кавычки обязательны. В оболочках Windows и Unix правила экранирования отличаются, особенно когда внутри аргумента есть символы #, :, шаблоны имён или выражения фильтров. Если длинная команда неожиданно разбирается как несколько аргументов, сначала сократите путь и заключите целиком выражение source:option=value в кавычки, а уже затем ищите проблему в самом MP4Box.

Как изучать файл: -info, -infox и XML-дампы

До редактирования полезно выяснить, какие дорожки действительно лежат в контейнере. Команда -info печатает общие сведения о фильме и его потоках: длительность, timescale, бренды, число дорожек, типы sample entry, профиль кодека, размеры, частоту кадров, аудиопараметры, язык и другие признаки. Если указан идентификатор дорожки, вывод становится детальнее. -infox последовательно показывает расширенную информацию по всем дорожкам.

MP4Box -info movie.mp4
MP4Box -info 2 movie.mp4
MP4Box -infox movie.mp4
Вывод MP4Box -info для файла автомобильного регистратора с видео, аудио и text track

Идентификатор дорожки нельзя бездумно приравнивать к её порядковому номеру. В MP4 track_ID — собственное поле, и после удаления или добавления дорожек последовательность может иметь пропуски. Для команд, где принимается track ID, берите значение из вывода MP4Box, а не вторая строка значит ID 2. Для обращения именно по номеру дорожки предусмотрен -infon, где единица означает первую дорожку в файле.

Когда обычного текста мало, используйте структурные дампы. -diso и синонимичный -dmp4 выводят дерево ISO boxes в XML, -disox исключает тяжёлые sample tables, а -dxml добавляет известные описания семплов дорожек. Это один из самых полезных способов понять, где лежит конкретный флаг: в ftyp, moov, trak, mdia, stbl, udta или другом боксе.

MP4Box -diso movie.mp4 > boxes.xml
MP4Box -disox movie.mp4 > boxes_light.xml
MP4Box -dxml movie.mp4 > movie_dump.xml

Для анализа тайминга есть семейство -dts. Оно печатает информацию о семплах, их DTS/CTS, размере и позиции; варианты без offset или с проверкой дублированных временных отметок удобны при рассинхронизации и повреждённых таблицах. Для AVC/HEVC/VVC-подобных потоков семейство -dnal показывает структуру NAL-единиц выбранной дорожки, а вариант с CRC помогает сравнивать содержимое на уровне NAL без ручного извлечения.

У дампов есть практическое преимущество перед медиаплеером: плеер может успешно проигрывать файл, скрывая пограничные проблемы структуры. MP4Box показывает именно контейнерные сущности и поэтому лучше подходит для диагностики необычных брендов, edit list, нетипичных handler type, рассогласованных timescale и других случаев, когда видео запускается ещё не означает файл собран так, как ожидает другая система.

Импорт дорожек и создание нового MP4

Главный ключ импорта — -add. Он добавляет одну или несколько дорожек из источника в целевой ISO-файл. Если целевого файла ещё нет, контейнер может быть создан; -new явно требует новый результат. Базовый сценарий — упаковать готовый H.264/AVC и AAC без перекодирования.

MP4Box -add video.h264:fps=24000/1001 -add audio.aac -new movie.mp4
Терминал MP4Box при импорте H.264 и AAC в MP4 с выводом параметров и прогресса записи

Для сырого видеопотока частота кадров принципиальна: в elementary stream может не быть контейнерной временной шкалы, из которой её можно надёжно восстановить. Неверный fps даст правильные кадры, но неправильную длительность и синхронизацию. Если параметр известен в виде рационального числа, лучше сохранять дробь вроде 24000/1001, а не округлять до 23.98 или 24.

Синтаксис -add URL[#FRAGMENT][:opt1:opt2=value] позволяет выбрать конкретный поток и одновременно изменить его свойства. Фрагменты #video, #audio, #pict и #trackID=ID нужны, когда контейнер-источник содержит несколько дорожек. Это надёжнее, чем импортировать всё и потом удалять лишнее.

MP4Box -add source.mkv#video -add source.mkv#audio -new result.mp4
MP4Box -add source.mp4#trackID=4 -new only_track4.mp4

Опции после двоеточия применяются к импортируемой дорожке. Часто используются name для handler name, lang или Language для языка, group для alternate group, disable для начального состояния, delay для временного сдвига, timescale и rescale для временной шкалы. Есть и более узкие параметры для AVC/HEVC, Dolby, SVC/LHVC, тайлов и sample groups. Их нельзя применять как улучшатели качества: это сигнализация и упаковка уже существующего потока.

При импорте AVC/HEVC особенно осторожно обращайтесь с xps_inband, профилем, уровнем, Dolby Vision-сигнализацией и принудительной заменой sample entry. Возможность записать нужный 4CC не означает, что поток после этого автоматически соответствует заявленному формату. MP4Box умеет модифицировать контейнерную сигнализацию, но не превращает несовместимый битстрим в совместимый одним метатегом.

Для многодорожечного контента полезно сразу задавать язык и имя. Это облегчает последующую упаковку в DASH/HLS и выбор в плеере. Язык должен быть корректным кодом, а альтернативные группы — логично организованы: две аудиодорожки одной роли обычно относятся к одной группе выбора, но комментарий режиссёра, аудиодескрипция и основной звук могут потребовать другой схемы.

Импорт из контейнера без перекодирования

Если исходник — MKV, TS или AVI, MP4Box использует доступный демультиплексор и передаёт подходящие дорожки в ISOBMFF-мультиплексор. Успех зависит не только от расширения, но и от того, может ли конкретный кодек быть корректно представлен в выбранном MP4. Например, дорожка читается из MKV и для неё существует стандартная MP4 sample entry — разные условия. При проблеме сначала проверяйте -info источника через GPAC/другой анализатор и документацию по поддержке кодека.

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

Редактирование дорожек в существующем MP4

Одна из причин выбирать MP4Box вместо универсального транскодера — точечные изменения уже готового MP4. Можно удалить дорожку, изменить язык, включённость, группировку, имя и ряд системных параметров, не переписывая содержимое через декодер и энкодер. Это сохраняет исходное качество, потому что закодированные кадры остаются теми же.

MP4Box -rem 3 movie.mp4
MP4Box -lang 2=rus movie.mp4
MP4Box -enable 4 movie.mp4
MP4Box -disable 5 movie.mp4

Перед -rem всегда проверяйте ID. Удаление не имеет отмены внутри файла. Если материал ценен, используйте -out и сначала сравните структуру результата. После удаления дорожки её track ID не обязан перенумеровываться так, как ожидает человек; поэтому повторную правку снова начинайте с -info.

Язык и handler name — разные поля. Язык помогает программам выбирать локализацию, а handler name даёт читаемую подпись дорожки. Нельзя рассчитывать, что произвольное имя автоматически заменит стандартизованный language code, role или accessibility-признак в потоковом манифесте. Для DASH/HLS часть характеристик берётся из свойств PID и параметров dasher, а не только из старых MP4-полей.

Также MP4Box умеет работать с chapter-информацией, пользовательскими данными udta, cover art и тегами QuickTime/iTunes-типа. Для массового редактирования метаданных важно различать обычные теги, custom-domain tags и бинарные пользовательские боксы: это разные сущности с разной совместимостью в плеерах. Если получатель требует конкретный atom/box, проверяйте результат через -diso, а не только по тому, что название появилось в одном проигрывателе.

Бренды, размещение moov и режим хранения

В ftyp находятся major brand и compatible brands. Они служат заявлением о профиле контейнера и совместимости, но сами по себе не исправляют медиаданные. MP4Box может менять бренды и при ряде операций выбирает их автоматически в соответствии с содержимым. Если вы вручную ставите 4CC ради конкретного устройства или валидатора, нужно убедиться, что остальные боксы и sample entry действительно соответствуют профилю.

Расположение moov в начале файла важно для загрузки по HTTP: проигрыватель быстрее получает индекс и может начать воспроизведение без скачивания хвоста. MP4Box по умолчанию ориентируется на такой режим при обычном сохранении. Однако операция перестановки метаданных требует чтения и записи значительной части файла и может задействовать временное место. На больших исходниках это нужно учитывать при автоматизации.

Ключ -flat меняет стратегию хранения и полезен в сценариях, где важна скорость сохранения или отсутствует место для дополнительного прохода. Но это не универсальная оптимизация. Для сетевой выдачи, фрагментированного MP4 и дальнейшего DASH-пакетирования требования отличаются. В производственной цепочке режим стоит выбирать исходя из следующего потребителя, а не только из скорости одной команды.

Извлечение дорожек и дампы медиа

Ключ -raw извлекает выбранную дорожку в сырой формат, если для неё существует поддерживаемый экспортер. Это удобно, когда нужно получить AVC/HEVC, AAC, WebVTT или другой elementary stream для анализа либо дальнейшей обработки. Имя можно задавать через параметр output.

MP4Box -raw 1 movie.mp4
MP4Box -raw 2:output=audio.aac movie.mp4

-raws работает на уровне отдельных семплов: можно выгрузить каждый семпл в отдельный файл либо конкретный семпл по номеру. Это диагностический режим, особенно полезный для timed metadata, изображений и TTML, где дорожка целиком не всегда имеет один прямой внешний формат.

Для технических цепочек доступны NHNT и NHML. -nhml может формировать XML-описание семплов, а вариант full добавляет свойства пакетов. Эти форматы полезны не как пользовательский экспорт, а как промежуточное представление для лабораторной работы, тестов и воспроизводимого анализа структуры. Если конечная цель — обычное видео или звук, сырой экспорт или прямой ремультиплекс обычно проще.

Команда -single извлекает дорожку в новый MP4. Это хороший вариант, когда elementary stream не нужен: сохраняется контейнерная форма, и полученный файл проще открыть стандартным инструментом. Для субтитров есть специальные направления: TX3G можно вывести в TTXT или SRT, WVTT — в WebVTT, а для STPP/TTML в ряде случаев извлекаются отдельные семплы вместо реконструкции единого исходного документа.

Разрезание файла по времени, размеру и точкам доступа

MP4Box умеет делить файл по максимальной длительности, размеру, каждой random access point или выбранному диапазону времени. Современная реализация splitting использует фильтр reframer, поэтому границы зависят от доступных точек случайного доступа. Если в видео мало ключевых кадров, нельзя получить произвольный независимый отрезок без перекодирования.

MP4Box -split 60 movie.mp4
MP4Box -split-size 700M movie.mp4
MP4Box -split-rap movie.mp4
MP4Box -splitx 12.5:47.0 movie.mp4 -out fragment.mp4

-split принимает длительность в секундах и единицы минут/часов. -split-size ограничивает размер части. -split-rap создаёт новый файл на каждой точке случайного доступа, что при коротком GOP может породить огромное количество частей и обычно используется для технических задач, а не для бытового разрезания длинного фильма.

У диапазонных вариантов есть различия в округлении к RAP. -splitx ориентируется на ближайшую подходящую точку для начала, -splitz строит стыкуемые границы, а -splitg и -splitf используют другие правила выбора начала. Поэтому при подготовке сегментов с требованием бесшовного соединения нельзя менять варианты случайно: одинаковые числа времени могут дать разные первые кадры и фактическую длительность.

Ограничение splitting принципиально: если более одной дорожки содержит зависимые от предыдущих кадров точки, корректное разделение может быть невозможно. Также системные MPEG-4 tracks и hint tracks при таком разрезании обрабатываются не так, как обычные аудио/видео дорожки. Для сложных интерактивных файлов результат нужно проверять отдельно.

Объединение и последовательное добавление материалов

Для последовательного объединения используется -cat. Программа старается добавить медиа из следующего источника после текущего содержимого, а не просто склеить байты. Это важно: нормальное объединение контейнеров требует согласовать временные шкалы, sample descriptions и структуру дорожек. -raw-cat, напротив, выполняет сырую конкатенацию файлов и предназначен для форматов, где такая операция действительно имеет смысл.

MP4Box -cat part1.mp4 -cat part2.mp4 -new joined.mp4

Наилучший случай для -cat — части с совместимыми кодеками, параметрами и одинаковой логикой дорожек. Если первая часть содержит AVC High, вторая — HEVC, или аудиодорожки имеют разную частоту дискретизации и channel layout, склеить как один поток уже нельзя считать простой контейнерной операцией. Иногда MP4 допускает несколько sample descriptions, но совместимость плееров и потоковых профилей от этого не становится гарантированной.

Если после объединения появляются скачки времени, сначала сравните timescale и timestamps входных дорожек. Проблема может быть не в -cat, а в нестандартных edit lists, начальном отрицательном CTS, разрыве DTS или источниках, созданных разными кодерами. В таких случаях прямой граф gpac с reframer/restamp может дать больше контроля, чем высокоуровневое объединение MP4Box.

Субтитры: SRT, WebVTT, TX3G и TTML

MP4Box поддерживает несколько способов упаковки текста. SRT можно импортировать как 3GPP Timed Text, WebVTT — как WVTT, TTML — как STPP. Формат назначения зависит от входа и параметров импорта. Это не одно и то же: каждый тип хранит стили, разметку и timing по своим правилам, а поддержка на устройствах различается.

MP4Box -add subtitles.srt movie.mp4
MP4Box -add subtitles.vtt movie.mp4
MP4Box -add subtitles.ttml movie.mp4

Для обратного направления TX3G можно вывести в SRT через -srt trackID или в TTXT через -ttxt trackID. WVTT обычно извлекают -raw. Для STPP полноценная реконструкция исходного TTML-документа не всегда возможна: дорожка состоит из timed samples, поэтому -raws может создать отдельный TTML-файл на каждый семпл.

При нескольких языках задавайте language metadata ещё на этапе импорта. Для HLS/DASH одного языка иногда недостаточно: нужны корректные группы адаптации, role, forced/default и понятные representation labels. Часть этих атрибутов задаётся параметрами dasher или PID properties. Поэтому в MP4 написано rus и в HLS меню правильно показывает Русский по умолчанию — не равнозначные утверждения.

Меню аудиодорожек VLC для многоязычного CMAF/HLS, упакованного GPAC Меню английских и французских субтитров при воспроизведении DASH, созданного GPAC

DASH-пакетирование

Одна из самых востребованных функций MP4Box — создание MPEG-DASH. Ключ -dash задаёт целевую длительность сегмента в миллисекундах и запускает dasher. Входов может быть несколько: разные видеопредставления, отдельные аудиодорожки и субтитры. На выходе создаются MPD и медиасегменты либо байтовые диапазоны в зависимости от профиля и параметров.

MP4Box -dash 2000 video_1080.mp4 video_720.mp4 audio.mp4 subtitles.vtt -out stream.mpd
Файлы DASH, сформированные MP4Box: MPD и init-фрагменты видео, аудио и субтитров

Число 2000 — цель, а не обещание получить каждый сегмент ровно две секунды. Граница должна согласоваться с random access points и правилами профиля. Если энкодер поставил ключевые кадры через 5 секунд, сегментатор не создаст независимые двухсекундные видеосегменты магическим делением P/B-кадров. Для стабильного ABR сначала настраивают одинаковый GOP и синхронные точки доступа во всех вариантах качества, затем пакетируют.

В многопредставленном DASH критична временная совместимость. Видеоряды разных разрешений должны описывать одну временную шкалу контента, иначе переключение представлений приведёт к рывку или невозможности бесшовного перехода. MP4Box умеет формировать AdaptationSet и Representation на основании свойств потоков, но не исправляет концептуально разные исходники автоматически.

Параметр -frag задаёт длительность фрагмента внутри сегмента, когда требуется более мелкая ISOBMFF-фрагментация. Сегмент и fragment — разные уровни. Один DASH-сегмент может содержать несколько moof/mdat фрагментов. Это используется для low-latency и некоторых профилей, но слишком мелкие фрагменты увеличивают служебные накладные расходы и количество операций ввода-вывода.

Существует большой набор параметров именования segment template, start number, timeline, SAP alignment, профилей, single-file/single-segment режимов и MPD-настроек. Их лучше задавать исходя из требований конкретного проигрывателя или origin/CDN. В простом VOD достаточно короткой команды; в вещательной цепочке пакетировщик фактически становится частью протокола доставки, и случайные параметры могут нарушить совместимость даже при корректных MP4-сегментах.

HLS через MP4Box

HLS формируется тем же пакетирующим движком. MP4Box может выводить HLS-плейлисты как для MPEG-2 TS, так и для fragmented MP4 в зависимости от параметров mux. Это удобно, когда нужно использовать одну систему для подготовки HLS и DASH, особенно если исходные дорожки и язык уже описаны одинаково.

MP4Box -dash 2000 -profile live video_1080.mp4 video_720.mp4 audio.mp4 -out hls.m3u8 --muxtype=ts
Результат HLS-пакетирования MP4Box: master/media playlists, TS-видео, аудио и VTT

При TS-выводе создаётся master playlist, media playlists и транспортные сегменты. При fMP4 используются initialization/media fragments и соответствующие теги HLS. Набор выходных файлов зависит от профиля и single-file режима. Поэтому при автоматическом деплое нельзя жёстко считать команда всегда создаёт N файлов: лучше использовать известный шаблон имён и очищенный каталог назначения.

Содержимое master HLS playlist, созданного MP4Box, с вариантами и группами аудио/субтитров

Если плеер видит видео, но не показывает субтитры или альтернативное аудио, проверяйте не только сами дорожки. Важны HLS master entries, GROUP-ID, LANGUAGE, NAME, DEFAULT/AUTOSELECT и ссылки на media playlist. MP4Box может вывести их из свойств входов, но неверно размеченный источник приводит к технически валидному, но неудобному меню в плеере.

Воспроизведение GPAC-generated DASH в VLC с доступной дорожкой субтитров

CMAF и совместный вывод DASH/HLS

CMAF строится на fragmented MP4 и позволяет использовать общий набор медиасегментов для разных manifest-форматов. В GPAC распространён режим, при котором один запуск dasher создаёт DASH MPD и HLS-плейлисты для тех же фрагментированных медиа. Это снижает дублирование файлов и упрощает хранение, если целевые клиенты действительно поддерживают выбранные CMAF-профили и кодеки.

MP4Box -dash 2000 video_1080.mp4 video_720.mp4 audio.mp4 subtitles.vtt -out presentation.mpd:dual
CMAF-вывод MP4Box с общими fMP4-файлами, HLS-плейлистами и DASH MPD

Ключ :dual у выхода используется для совместного manifest-вывода в типовом CMAF-сценарии. В реальной инфраструктуре дополнительно задают segment naming, profile, fragment duration, encryption, roles и другие свойства. Сам термин CMAF не означает подойдёт любому HLS-плееру: старые клиенты, ожидающие TS, могут не поддерживать fMP4, а ограничения по codec/profile сохраняются.

Полезно различать три уровня совместимости: контейнер CMAF, потоковый manifest и медиакодек. Файл может быть корректным fragmented MP4, MPD — валидным, но конкретный браузер не декодирует кодек. Или наоборот, кодек поддерживается, а playlist использует атрибут, который старый клиент не понимает. MP4Box отвечает за упаковку и сигнализацию, но матрицу возможностей конечных устройств нужно учитывать отдельно.

Live и low-latency сценарии

GPAC способен пакетировать поток в режиме live, поддерживать обновляемые manifests, временные окна и низкую задержку. В этой области возможностей больше у прямого gpac и фильтра dasher, потому что длинная живая сессия — это не просто одноразовая запись MP4. Важны regulation, источник с корректными timestamps, правила очистки timeshift buffer, генерация MPD/HLS, сетевой вывод и реакция на discontinuity.

Для low-latency fragment duration обычно меньше segment duration, а фрагменты должны появляться по мере производства медиаданных. Если исходный энкодер выдаёт слишком редкие точки доступа или буферизует большие GOP, пакетировщик не может устранить всю задержку. Суммарная latency складывается из энкодера, packager, origin/CDN, сети и player buffer.

При live-входах особенно важна монотонность DTS/CTS. Разрывы времени, повторяющиеся timestamps и внезапные изменения timescale могут привести к новому Period, discontinuity или ошибке. GPAC имеет механизмы обнаружения и обработки разрывов, но желаемое поведение зависит от сервиса. Для вещательной цепочки лучше явно протестировать переключение периода, восстановление после потери пакетов и обновление manifest, а не ограничиваться проверкой первых секунд.

Шифрование и дешифрование

MP4Box поддерживает шифрование и дешифрование ISMA, OMA и CENC. Для CENC и связанных схем используется XML-файл CryptFile, где описываются ключи, KID, режим и параметры обработки дорожек. Команда -crypt применяет шифрование, -decrypt выполняет обратную операцию при наличии ключевой информации.

MP4Box -crypt DRM.xml clear.mp4 -out protected.mp4
MP4Box -decrypt DRM.xml protected.mp4 -out clear_again.mp4

CENC-шифрование не равно полноценному DRM-сервису. MP4Box способен зашифровать семплы и сформировать соответствующую сигнализацию, но лицензирование, аутентификация пользователя, выдача ключей и политика доступа — задачи внешней DRM-инфраструктуры. Ошибка в этой границе часто приводит к ожиданию, что зашифрованный MP4 сам по себе будет защищён как коммерческий потоковый сервис.

При дешифровании без CryptFile операция возможна только если используемый механизм управления ключами поддерживается в данной конфигурации. Для воспроизводимой обработки лучше хранить явное описание ключей в защищённой системе сборки и не помещать реальные ключи в общие скрипты, журнал CI или командные строки, которые сохраняются в shell history.

HEIF-объекты также могут шифроваться CENC. Но структура item-ориентированного файла отличается от обычного фильма с track samples, поэтому примеры для видеодорожек не следует переносить буквально. Проверять результат нужно через meta/HEIF-инструменты и структурный дамп.

HEIF и AVIF: работа с image items

ISOBMFF используется не только для временных дорожек. В HEIF/AVIF изображения часто представлены как items в meta, с references, properties и primary item. MP4Box имеет отдельную группу meta-команд для создания и редактирования таких файлов. Можно задать тип meta, добавить item, удалить item, извлечь изображение, изменить primary item и управлять ссылками между объектами.

Главное отличие от обычного MP4-видео: item не обязан быть track и не имеет привычной временной последовательности семплов. Поэтому команда, подходящая для -add видеодорожки, не всегда является правильным способом для HEIF. Для изображений используйте -add-image и meta options, когда требуется именно item-модель.

При импорте HEVC/AV1-картинок важно, какие свойства кодированного изображения записаны в item properties: размеры, color information, alpha/depth auxiliary references, grid и другие зависимости. Неполная сигнализация может не мешать одному декодеру, но сделать файл непригодным для другого. Структурный -diso и профильный HEIF/AVIF-валидатор полезнее, чем проверка одной просмотрщиком.

MP4Box также позволяет использовать ISOBMFF как контейнер метаданных, не обязательно содержащий обычный movie. Поэтому meta options подходят для экспериментальных и стандартных структур, где root-level meta важнее moov. Это одна из областей, где MP4Box заметно шире бытового мультиплексора MP4.

RTP/RTSP hint tracks

Историческая и до сих пор доступная функция — hinting. Hint track содержит инструкции серверу, как формировать RTP-пакеты из медиадорожки. Ключ -hint добавляет такую информацию, -unhint удаляет, а параметры MTU, payload и SDP позволяют управлять сетевой упаковкой.

MP4Box -hint movie.mp4
MP4Box -sdp movie.mp4
MP4Box -unhint movie.mp4

Hint tracks нужны не каждому RTSP-сценарию. Современные RTP/RTSP-фильтры GPAC могут пакетировать медиа на лету и не требуют заранее подготовленных hint tracks. Поэтому добавлять их для лучшего стриминга без требований конкретного сервера нет смысла: они увеличивают структуру файла и относятся к определённой модели доставки.

Если hinting всё же нужен, MTU должен соответствовать сети, а выбор payload — поддержке клиента. Ключи -mpeg4, -latm, -static и другие управляют RTP-форматом, но неправильный выбор легко создаёт поток, который один сервер принимает, а клиент не декодирует. Проверка SDP и захват RTP-пакетов здесь важнее воспроизведения самого исходного MP4.

Когда нужен gpac вместо MP4Box

Команда gpac строит граф фильтров. Источник создаёт PID, затем GPAC подбирает или получает явно указанные фильтры, которые преобразуют поток и передают его дальше. Такая архитектура полезна, когда задача выходит за рамки фиксированных операций MP4Box: несколько выходов, кодирование, масштабирование, микширование, работа с сокетами, HTTP, RTP, захватом, thumbnails или пользовательскими JavaScript-фильтрами.

gpac -i input.mkv -o output.mp4
gpac -i input.mp4 inspect:full
gpac -i input.mp4 reframer:saps=1 -o keyframes/$num$.png

MP4Box при импорте умеет передавать дополнительные параметры source/mux фильтрам через :sopt: и :dopt:. Это промежуточный вариант: высокоуровневая команда остаётся MP4Box, но отдельные свойства движка доступны глубже. Если таких расширений становится много, команда gpac обычно читается лучше и выполняет цепочку без промежуточных сессий.

Некоторые последовательности MP4Box запускают несколько независимых фильтровых сессий. Например, импорт, затем split, затем encryption могут привести к дополнительным проходам. В gpac аналогичную обработку иногда можно выразить одним графом и сократить чтение/запись. Но это не означает, что gpac полностью заменяет MP4Box: операции редактирования существующих boxes и track-level действий могут отсутствовать в фильтровой модели.

Официальная GPAC.WASM-площадка с консолью inspect:full и выводом свойств медиапотока

Транскодирование через фильтры

Современный GPAC умеет не только remux. Через доступные энкодеры и фильтры можно декодировать, масштабировать и кодировать медиа, а MP4Box при некоторых операциях способен задействовать encoding filters. Однако выбор кодека, rate control, аппаратного ускорения и качества — отдельная задача. Если цель — массовое транскодирование с тонкой настройкой энкодера, профильный интерфейс FFmpeg или прямой gpac обычно понятнее, чем попытка превратить MP4Box в универсальный frontend.

Практическая граница проходит по вопросу нужно ли менять битстрим. Если нет — сохраняйте remux-путь и не платите временем и качеством за перекодирование. Если да — сначала определите требования к кодеку, профилю, HDR, GOP, B-frames и ключевым кадрам, а уже затем пакетируйте. Особенно для DASH/HLS структуру GOP лучше задавать на этапе encoding, потому что packager зависит от точек случайного доступа.

Логи, прогресс и автоматизация

GPAC имеет общую систему логирования для MP4Box и других приложений. Категории включают core, filters, container, network, RTP, author, codec, parser и другие; уровни позволяют оставить только ошибки, предупреждения, информационные или отладочные сообщения. Для больших автоматизированных задач это удобнее, чем разбирать весь стандартный вывод.

MP4Box -logs=container:author@debug -info movie.mp4
MP4Box -log-file=mp4box.log -info movie.mp4

По умолчанию прогресс и часть диагностических сообщений могут идти не в тот поток, который ожидает простой shell-редирект. Если скрипт получает пустой stdout, но человек видит текст в консоли, проверьте stderr и объединение потоков. Для машинного парсинга лучше использовать специальные режимы вывода, XML-дампы или собственный фильтр inspect, а не зависеть от декоративного прогресс-бара.

Параметры -noprog и -quiet уменьшают шум, но -quiet способен скрыть и важные ошибки. В CI разумнее оставлять ошибки, отключая только прогресс. -strict-error полезен там, где предупреждение не должно позволять конвейеру продолжать после реально критической ошибки.

Для длительных фильтровых сессий у GPAC есть удалённый мониторинг через WebSocket и web UI. Это относится прежде всего к gpac и живым графам, а не превращает MP4Box в браузерный редактор. Такая панель полезна для наблюдения за состоянием фильтров, PID и логами на сервере, но основной способ формулировать задачу остаётся командой или конфигурацией фильтров.

Практические сценарии

Собрать H.264 и AAC в MP4 без потери качества

Убедитесь, что известна реальная частота кадров видео, затем импортируйте elementary streams. Если AAC уже содержит корректный ADTS, MP4Box прочитает параметры аудио. После создания выполните -info и проверьте длительность обеих дорожек. Большая разница обычно указывает на неверный FPS, пропущенные/дублированные samples либо исходный рассинхрон.

MP4Box -add video.h264:fps=25 -add audio.aac -new muxed.mp4
MP4Box -info muxed.mp4

Добавить вторую аудиодорожку и язык

Сначала найдите текущие ID, затем импортируйте новый звук с языком и именем. Если дорожки должны быть взаимоисключающими вариантами, назначьте подходящую alternate group. После записи проверьте, как язык отображается в целевом плеере, и при необходимости отдельно настройте потоковые роли при DASH/HLS-пакетировании.

MP4Box -add commentary.aac:lang=eng:name="Commentary" movie.mp4 -out movie_commentary.mp4

Удалить ненужные потоки из камеры или регистратора

Файлы устройств часто содержат служебный text/data track. Сначала -info покажет тип и ID. Удаляйте только после понимания назначения: telemetry может быть нужна для судебного анализа или стабилизации. Если задача — обычное воспроизведение, копия без служебной дорожки может быть удобнее, но исходник лучше сохранить.

MP4Box -info camera.mp4
MP4Box -rem 3 camera.mp4 -out camera_clean.mp4

Подготовить набор HLS из готовой ABR-лестницы

Все рендиции должны быть выровнены по времени и ключевым кадрам. Затем передайте их одной команде dasher вместе с аудио и субтитрами. После генерации проверяйте не только существование playlist, но и то, что master ссылается на правильные media playlists, bandwidth/resolution соответствуют файлам, а переключение качества не ломает декодер.

MP4Box -dash 2000 -profile live v1080.mp4 v720.mp4 v540.mp4 audio.mp4 subs.vtt -out master.m3u8 --muxtype=ts

Подготовить DASH из той же лестницы

Для DASH можно использовать те же входы, но выходом будет MPD. Если нужно fragmented MP4 с отдельными сегментами, задайте подходящий профиль и схему имён. Сравните segment boundaries разных representation. Несовпадение RAP — частая причина проблем, которые внешне выглядят как ошибка MPD.

MP4Box -dash 2000 v1080.mp4 v720.mp4 v540.mp4 audio.mp4 subs.vtt -out manifest.mpd

Сделать общий CMAF-набор для DASH и HLS

Используйте fMP4-совместимые входы и dual manifest output. Затем тестируйте оба входа — MPD и master M3U8 — на целевых клиентах. Совместные media files экономят хранение, но ошибки разметки языка и групп становятся общими для обоих протоколов, поэтому проверка нескольких аудио/субтитров особенно важна.

MP4Box -dash 2000 v1080.mp4 v720.mp4 audio.mp4 subs_en.vtt subs_ru.vtt -out cmaf.mpd:dual

Получить дерево boxes для расследования несовместимости

Начните с облегчённого -disox. Если нужная информация находится в sample tables, переходите к полному -diso или -dxml. В больших файлах XML может быть огромным, поэтому бессмысленно всегда включать самый подробный режим. Ищите сначала ftyp, sample entry, edit list, track header и media header.

MP4Box -disox problem.mp4 > structure.xml

Вырезать диапазон без перекодирования

Выберите вариант split с подходящим правилом округления. Если начало должно быть декодируемым независимо, оно привязывается к RAP, поэтому фактический первый кадр может отличаться от запрошенного времени. Для покадровой монтажной точности между ключевыми кадрами нужен декодирующий редактор/перекодирование края.

MP4Box -splitx 00:01:12.500:00:02:05.000 input.mp4 -out clip.mp4

Зашифровать CENC по заранее заданным ключам

Подготовьте CryptFile с KID и ключевой информацией, затем примените -crypt к чистому MP4. После операции убедитесь, что файл содержит ожидаемые protection boxes и что тестовый decrypt тем же ключом возвращает воспроизводимый материал. Это проверяет упаковку, но не заменяет интеграционный тест с реальным DRM-license server.

MP4Box -crypt cenc.xml clear.mp4 -out encrypted.mp4

Типичные проблемы и способы исправления

СимптомВероятная причинаЧто проверитьРешение
MP4Box меняет исходный файлОперация редактирования по умолчанию работает с входомНаличие -out или -newПовторить на копии и явно задать файл результата.
Недостаточно места, хотя рядом с видео место естьВременный файл создаётся на другом разделеСистемный temp и размер исходникаУказать каталог через -tmp на разделе с запасом.
После remux длительность видео невернаДля raw video неверно задан FPSРеальную частоту кадров и timescaleИмпортировать заново с точным рациональным fps.
Аудио постепенно уходит от видеоНесовпадение временных шкал или ошибочная длительность samplesDTS/CTS, sample rate, исходный driftСначала диагностировать timestamps; при необходимости restamp/re-encode.
Команда удаляет не ту дорожкуПерепутан track ID и порядковый номер-info/-infonИспользовать реальный ID из контейнера.
DASH-сегменты получаются длиннее целиРедкие RAP/keyframesGOP всех видеорендицийПерекодировать с подходящим и синхронным GOP.
При переключении ABR есть рывокRepresentation не выровнены по времениПервые CTS/DTS и RAPСинхронизировать encode ladder до пакетирования.
HLS открывается, но субтитров нетНеправильная группа или тип текстаMaster playlist и subtitle media playlistПроверить LANGUAGE/GROUP-ID/URI и формат WVTT/WebVTT.
В HLS не видно второй аудиодорожкиНе сформирована корректная audio groupСвойства входного PID и master tagsЗадать язык/имя/группу до или во время dasher.
fMP4 не играет на старом клиенте HLSКлиент ожидает MPEG-2 TSМатрицу поддержки устройстваДля такого клиента сформировать TS-вариант.
MP4 после ручной смены brand не принимаетсяBrand не делает структуру соответствующей профилюBoxes и sample entriesИсправить реальную структуру, а не только ftyp.
Извлечённый raw-файл не открывается плееромElementary stream не является самостоятельным контейнеромТип экспорта и параметры кодекаОткрывать подходящим декодером или использовать -single.
TTML выгружается множеством файловSTPP хранит timed samplesТип дорожкиИспользовать -raws осознанно и объединять на уровне TTML-логики.
Split начинается раньше/позже указанного времениГраница округляется к RAPТип -splitx/-splitz/-splitgВыбрать нужное правило либо перекодировать края.
Split не работает на нужной позицииНет подходящей точки случайного доступаI/IDR/CRA в видеоПерекодировать с ключевым кадром в требуемом месте.
Cat даёт проблемы на стыкеЧасти имеют разные sample descriptions/таймингиКодек, профиль, timescale, edit listНормализовать источники перед объединением.
CENC-файл не воспроизводится после шифрованияНет ключа/DRM-интеграции или неверная схемаKID, scheme, license pathОтдельно проверить decrypt и интеграцию DRM.
Логи слишком шумныеВключён общий уровень сообщенийКатегории log toolsОграничить -logs нужными категориями.
Скрипт не получает текст, видимый в консолиВывод идёт в stderrРедирект stdout/stderrПеренаправить stderr или использовать структурный dump.
Длинная команда разваливается на аргументыShell интерпретирует пробелы/#/:Кавычки и экранированиеЗаключить путь и составной source-аргумент в кавычки.
Импорт из MKV не создаёт ожидаемый MP4Кодек читается, но не поддержан целевой sample entryТип исходной дорожкиТранскодировать неподдерживаемый поток или выбрать другой контейнер.
После add язык не виден в сервисеСервис читает другие поля/manifest metadataMP4 language и потоковые свойстваНастроить language/role в dasher, не только в mdhd.
Дамп XML слишком большойПолные sample tables и sample dataИспользуемый dump modeНачать с -disox, затем расширять точечно.
Операция долго пишет большой MP4Перестановка moov и интерливинг требуют прохода/temporary fileРежим хранения и дискОценить -flat, быстрый temp-диск или другой pipeline.
Hint tracks не помогают современному RTSPСервер пакетирует поток на летуТребования RTSP-сервераНе добавлять hinting без конкретной необходимости.

Ограничения, которые важно понимать

  • Командная строка требует знания структуры контейнера; случайная комбинация ключей может создать формально читаемый, но плохо совместимый файл.
  • Точное резание между зависимыми видеокадрами без перекодирования ограничено расположением точек случайного доступа.
  • Контейнерная сигнализация не исправляет несовместимый кодированный поток: смена 4CC, profile или brand не заменяет транскодирование.
  • Поддержка конкретного входного формата зависит от доступных фильтров и сборки GPAC; расширение файла само по себе ничего не гарантирует.
  • Потоковое пакетирование не решает проблемы ABR-лестницы, созданные на этапе encoding: GOP, timestamps и codec compatibility должны быть корректны заранее.
  • Шифрование CENC не включает лицензионный сервер и политику DRM; MP4Box формирует защищённый контейнер и сигнализацию, а не всю систему доступа.
  • Некоторые нишевые функции — MPEG-4 Systems, BIFS/LASeR, hinting, SVC/LHVC — требуют понимания стандартов и имеют меньшую практическую совместимость с массовыми плеерами.
  • Для произвольных медиаграфов возможности gpac шире высокоуровневых команд MP4Box, поэтому сложный pipeline иногда лучше переносить на фильтры.

Справочник часто используемых команд

Команда или ключНазначение
MP4Box -hКраткая справка и список категорий.
MP4Box -h importПараметры импорта, track selection и modifiers.
MP4Box -h dashПараметры DASH/HLS/CMAF-пакетировщика.
MP4Box -h splitПравила разрезания и временных диапазонов.
MP4Box -h metaРабота с meta box и HEIF/IFF items.
MP4Box -h hintRTP/RTSP hinting и SDP.
-infoСведения о фильме или выбранной дорожке.
-infoxРасширенные сведения по всем дорожкам.
-infonИнформация по порядковому номеру дорожки.
-tracksКоличество дорожек.
-diso / -dmp4XML-дерево ISOBMFF boxes.
-disoxXML-дерево без sample tables.
-dxmlBoxes плюс известные сведения о samples.
-dtsDTS/CTS, размеры и позиции семплов.
-dnalСтруктура NAL для выбранной дорожки.
-dchunkИнформация о chunks.
-dump-coverИзвлечение cover art.
-dump-chapИзвлечение глав.
-dump-udtaИзвлечение user data по 4CC.
-addДобавление дорожек из источника.
-catПоследовательное объединение совместимых медиа.
-newПринудительное создание нового целевого файла.
-outЯвное имя результата вместо изменения входа.
-remУдаление дорожки.
-enable / -disableИзменение флага включённости дорожки.
-langИзменение language metadata дорожки.
-rawЭкспорт дорожки в raw-формат.
-rawsЭкспорт samples по отдельности.
-singleЭкспорт дорожки в отдельный MP4.
-nhntЭкспорт в NHNT.
-nhmlЭкспорт в NHML/XML.
-srtЭкспорт/конверсия timed text в SRT.
-ttxtЭкспорт/конверсия в GPAC TTXT.
-splitЧасти по максимальной длительности.
-split-sizeЧасти по максимальному размеру.
-split-rapНовая часть на каждой RAP.
-splitxИзвлечение временного диапазона с округлением к ближайшей RAP.
-splitzДиапазон со стыкуемыми RAP-границами.
-dashЗапуск DASH/HLS segmenter; значение — целевая длительность сегмента.
-fragДлительность MP4 fragment в пакетировании/фрагментации.
-cryptШифрование по CryptFile.
-decryptДешифрование защищённого файла.
-set-kmsИзменение KMS URI для ISMA/OMA.
-hintСоздание RTP hint tracks.
-unhintУдаление hinting information.
-sdpВывод SDP для hinted file.
-mtuРазмер RTP MTU при hinting.
-itagsQuickTime/iTunes-style metadata tags.
-hashSHA-1 hash входного файла как служебная функция.
-topcountЧисло top-level boxes заданных типов.
-topsizeСуммарный размер top-level boxes заданных типов.
-tmpКаталог временных файлов GPAC.
-noprogОтключение сообщений прогресса.
-quietОтключение сообщений, включая ошибки — использовать осторожно.
-strict-errorЗавершение при первой зарегистрированной ошибке.
-log-fileЗапись логов в файл.
-logsВыбор категорий и уровней логирования.
-fstatСтатистика фильтровой сессии для операций MP4Box, использующих filters.
-fgraphПечать связей фильтровой сессии.

Сравнение GPAC / MP4Box с аналогами

ПрограммаЛучше подходит дляГлавное ограничение
GPAC / MP4BoxТочная работа с MP4/ISOBMFF, DASH/HLS/CMAF, HEIF, дампы boxes и track-level редактированиеКомандная модель сложна; многие задачи требуют знания стандартов
Bento4MP4/CMAF/DASH/HLS-утилиты и набор специализированных инструментов для упаковки и анализаФункции распределены между несколькими отдельными программами и SDK
Shaka PackagerDASH/HLS/CMAF и DRM-пакетирование в потоковых конвейерахНе предназначен для широкого редактирования произвольных MP4 boxes и track metadata
FFmpegДекодирование, кодирование, фильтрация, remux и базовое сегментирование почти любых AV-форматовМенее специализирован на глубоком ISOBMFF-редактировании, HEIF meta и MP4 box diagnostics
GStreamerГибкие программируемые multimedia pipelines, live-сценарии и интеграция приложенийДля простой точечной правки MP4 требует сборки pipeline и знания плагинов

Если задача — перекодировать видео с фильтрами, первым выбором часто становится FFmpeg; если нужен потоковый packager с DRM и минимальным набором контейнерного редактирования — Shaka Packager; если важен модульный pipeline в приложении — GStreamer. GPAC / MP4Box особенно выгоден там, где одновременно нужны глубокие возможности ISOBMFF и промышленное пакетирование DASH/HLS/CMAF. Bento4 близок по классу, но предлагает иной набор отдельных утилит и API. ВидеоМАСТЕР в эту таблицу не включён, потому что его основная пользовательская задача — конвертация/монтаж, а не стандартно-ориентированное редактирование ISOBMFF и адаптивное пакетирование.

Вопросы и ответы

Можно ли пользоваться MP4Box без изучения всех опций?

Да. Для повседневной работы достаточно нескольких групп: -info, -add, -raw, -rem, -split* и -dash. Остальное лучше открывать через тематическую справку по мере необходимости. Ошибкой будет не незнание редких ключей, а запуск редактирующей команды на единственной копии файла без понимания, что MP4Box может перезаписать вход.

Перекодирует ли MP4Box видео при обычном -add?

Обычный импорт в MP4 в первую очередь является упаковкой уже закодированного потока. Если кодек совместим и не подключены encoding filters, качество не меняется. Однако MP4Box умеет работать с фильтрами и транскодированием в расширенных сценариях, поэтому точный ответ определяется командой, а не названием программы.

Почему MP4Box называют частью GPAC?

MP4Box использует библиотеку и фильтровый движок GPAC. Часть его функций внутри запускает filter session, а отдельная команда gpac предоставляет более прямой и универсальный доступ к тем же строительным блокам. При этом MP4Box сохраняет собственные операции редактирования ISO-файлов, которые не сводятся к обычному media pipeline.

Можно ли заменить FFmpeg на MP4Box?

Только в тех задачах, где основная работа — контейнер и упаковка. Для сложного кодирования, широкой фильтрации, захвата и огромного числа кодеков FFmpeg обычно удобнее. Эти инструменты часто дополняют друг друга: FFmpeg создаёт согласованную ABR-лестницу, а MP4Box пакетирует её в DASH/HLS/CMAF.

Можно ли создать MP4 из MKV без перекодирования?

Да, если дорожки из MKV поддерживаются целевым MP4 и GPAC может их демультиплексировать. Видео и звук при remux не меняют качество. Если внутри MKV находится формат, для которого нет подходящей MP4 sample entry или требуемой совместимости, понадобится другой контейнер либо транскодирование.

Почему -split не режет строго в указанную миллисекунду?

Потому что независимый фрагмент видео должен начинаться с подходящей точки случайного доступа. MP4Box округляет границу по правилам выбранного варианта split. Без декодирования и перекодирования нельзя сделать любой B/P-кадр самостоятельным началом клипа.

Что лучше для анализа MP4: -info или -diso?

-info быстрее отвечает на практические вопросы о дорожках, кодеках и длительности. -diso нужен, когда важно увидеть точную иерархию boxes и значения контейнерных полей. Обычно начинают с -info, затем переходят к XML только если проблема остаётся.

Можно ли MP4Box использовать для HEIF и AVIF?

Да. У него есть отдельные meta/HEIF операции, работающие с image items, properties и references. Это не просто MP4 с одним кадром: структура item-based файла отличается, поэтому применяются специализированные meta-команды и проверка соответствующих боксов.

Создаёт ли -crypt готовый DRM?

Нет. Команда создаёт зашифрованный контейнер и нужную CENC/ISMA/OMA-сигнализацию. Система выдачи лицензий, управление правами пользователя и доставка ключа находятся вне MP4Box. Для полноценного DRM нужен внешний license server и клиентская интеграция.

Можно ли генерировать HLS и DASH одновременно?

Да, в CMAF-oriented сценариях GPAC может сделать общий набор fMP4 media и оба типа manifest, например через dual output. Но совместимость всё равно определяется кодеком, профилем CMAF/HLS/DASH и возможностями целевых клиентов.

Зачем нужен -frag, если уже есть -dash?

-dash задаёт сегментацию presentation, а -frag относится к внутренним fragmented MP4 fragments. Сегмент может содержать несколько fragments. Это особенно важно для low-latency, где данные должны становиться доступными чаще, чем полный сегмент.

Почему после смены языка плеер всё равно показывает старое имя?

Потому что language code и handler name — разные поля, а потоковые manifests добавляют ещё Representation/NAME/role. Конкретный плеер может показывать любой из этих источников. Нужно определить, какое поле читает целевой клиент, и менять именно его.

Можно ли запускать MP4Box в скриптах и CI?

Да, это один из естественных сценариев. Используйте фиксированные пути, явный -out, каталог -tmp, отключение декоративного прогресса и контролируемые логи. Для проверки результата лучше анализировать exit code и структурный вывод, а не искать слово OK в человекочитаемом прогрессе.

Что делать, если команда MP4Box получается слишком длинной?

Сначала разделите pipeline на логические этапы и решите, не удобнее ли прямой gpac graph. Для сложного DASH можно использовать параметры фильтра dasher, для повторяемой автоматизации — скрипт с переменными. Длинная одна строка хуже читается и чаще ломается из-за shell quoting.

Есть ли у GPAC графический интерфейс?

У GPAC существуют GUI-возможности для проигрывания и web-интерфейсы мониторинга, а также экспериментальная WASM-площадка. Но MP4Box как инструмент упаковки и редактирования управляется в первую очередь командной строкой. Поэтому сторонние программы с названием MP4Box GUI нельзя считать интерфейсом самого MP4Box.

Подходит ли MP4Box для простого домашнего монтажа?

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

Временная модель MP4: timescale, DTS, CTS и edit list

Большая часть сложных проблем MP4Box связана не с кодеком, а со временем. В ISOBMFF у фильма есть movie timescale, у каждой дорожки — media timescale, а у каждого семпла — длительность и временные отметки. DTS описывает порядок декодирования, CTS — момент показа. Для потоков с B-кадрами эти шкалы не совпадают: кадр может декодироваться раньше, чем отображается. Поэтому простая арифметика номер кадра × 1/FPS годится только для ограниченного класса CFR-материалов.

При импорте raw video MP4Box должен получить достаточную информацию, чтобы построить sample durations. Если вы задаёте fps=24000/1001, программа может сформировать корректную временную сетку для постоянной частоты кадров. Если исходник уже контейнерный, timestamps обычно берутся из него. Параметры timescale, rescale и sampdur позволяют вмешаться в эту модель, но применять их на всякий случай опасно: можно добиться ровных чисел и одновременно разрушить синхронизацию с аудио.

Edit list — отдельный слой времени. Он способен сдвигать начало дорожки, задавать пустой интервал или отображать только часть media timeline. Поэтому два файла с одинаковыми DTS/CTS внутри stbl могут стартовать по-разному после применения edts/elst. Если в одном плеере звук синхронен, а в другом нет, проверьте edit list через -diso и сравните фактические presentation timestamps.

Опция noedit при импорте B-frame video отключает создание edit list, который обычно компенсирует композиционное смещение. Это не универсальный способ починить задержку. Если поток использует reordered frames, изменение edit logic должно сопровождаться проверкой CTS-DTS offsets и поведения целевого декодера. Аналогично negctts меняет способ представления composition offsets и имеет смысл только при требованиях конкретного профиля или инструментария.

ПонятиеЧто означаетГде проявляется ошибка
Movie timescaleЕдиницы времени для общей шкалы фильмаНекорректная общая длительность, главы, edit list
Media timescaleЕдиницы времени конкретной дорожкиАудио и видео расходятся при неверном rescale
DTSВремя декодирования семплаНарушение порядка декодирования, ошибки GOP
CTS/PTSВремя представления семплаРывки, рассинхрон, неверное отображение B-frames
Sample durationДлительность отдельного семплаНеверный FPS или скорость воспроизведения
Edit listПреобразование media timeline в movie timelineНачальный сдвиг, пустой участок, разное поведение плееров

Import modifiers: что меняют параметры после двоеточия

Составной аргумент source:option=value — один из самых мощных механизмов MP4Box. Он позволяет описать дорожку при импорте, не выполняя отдельный проход редактирования. Однако такие параметры относятся к разным уровням: одни меняют только метаданные, другие заставляют importer переписать NAL units или изменить sample grouping. Полезно разделять их по эффекту.

ГруппаПримерыПрактический смысл
Идентификацияname, lang, hdlrПодпись, язык и тип обработчика дорожки
Выбор и группировкаgroup, disable, fragment selectorАльтернативные дорожки и начальное состояние
Таймингfps, timescale, rescale, sampdur, delayКак семплы размещаются во времени
AVC/HEVC signalingxps_inband, xps_inbandx, nosei, profile, levelParameter sets, SEI и заявленные параметры sample entry
Слои и тайлыsvc, svcmode, temporal, tiles, split_tilesРазделение scalable/HEVC tile структуры на tracks
Sample groupsroll, proll, audio_rollСигнализация preroll/roll для декодирования
Совместимостьnegctts, forcesync, keep_refsТочечные изменения контейнерного поведения

forcesync особенно показателен: он может пометить некоторые не-IDR I-slices как sync points. Документация прямо предупреждает, что такой результат способен нарушать строгую спецификацию, хотя иногда улучшает seeking в практических плеерах. Этот ключ не следует использовать для обычного импорта; он оправдан только когда вы понимаете структуру OpenGOP/GDR и готовы принять компромисс совместимости.

nosei удаляет SEI во время импорта. Внутри SEI могут находиться HDR, mastering, recovery, captions или vendor metadata, поэтому очистка лишних служебных сообщений легко удалит значимые данные. Перед применением исследуйте NAL structure через -dnal или специализированный bitstream analyzer и определите, какие именно SEI присутствуют.

split_tiles и связанные режимы SVC/LHVC предназначены для потоков, где слои или тайлы имеют стандартизованные зависимости. Они полезны для tile-based streaming и исследовательских сценариев, но не превращают произвольное HEVC-видео в независимые области кадра. Тайл должен быть подготовлен энкодером с подходящими ограничениями motion prediction и slice structure.

Идентификаторы дорожек, alternate groups и роли

Track ID — технический идентификатор внутри MP4. Alternate group — другая концепция: она говорит плееру, что несколько дорожек являются вариантами одного выбора. Например, английский и русский звук могут быть в одной группе, чтобы одновременно активной была одна дорожка. Но commentary или audio description иногда логичнее отделить по роли. В DASH/HLS эта семантика дополнительно отражается в AdaptationSet, Role, GROUP-ID, NAME и других свойствах.

При автоматическом импорте из многодорожечного контейнера не полагайтесь на порядок потоков. Два файла от разных поставщиков могут иметь video/audio/subtitles в разной последовательности. Селекторы #video, #audio и #trackID делают pipeline устойчивее. Для ещё более сложного выбора в gpac можно связывать PID по типу потока и другим свойствам.

Если после добавления новой дорожки целевой сервис выбирает не тот звук по умолчанию, смотрите сразу три уровня: флаг enable/disable внутри MP4, alternate group и manifest-level default/autoselect. Исправление только одного уровня иногда ничего не меняет, потому что конкретный player отдаёт приоритет информации из HLS/DASH manifest.

Фрагментированный MP4: moof, mdat и индексирование

Обычный flat MP4 хранит центральные таблицы семплов в moov. Fragmented MP4 делит данные на последовательности moof + mdat, а начальный moov содержит базовую конфигурацию. Это позволяет выдавать медиаданные частями без знания полного файла заранее и является основой fMP4 в DASH, CMAF и современном HLS.

В каждом fragment находятся run-таблицы с длительностями, размерами, флагами и offsets семплов. Если целевая длительность fragment меньше segment duration, один сетевой сегмент может содержать несколько таких блоков. Слишком крупный fragment увеличивает задержку появления данных, слишком мелкий — служебный overhead и нагрузку на файловую систему/HTTP.

Для on-demand часто используются индексы, позволяющие клиенту находить диапазоны байтов. В single-file схеме manifest может ссылаться на ranges внутри одного большого fMP4. В multi-file схеме каждый media segment отдельный. Оба варианта технически корректны, но CDN-кэширование, origin и плеер могут предпочитать один из них. Поэтому profile и naming выбираются по архитектуре доставки, а не по эстетике каталога.

Если fragmented MP4 проигрывается как локальный файл, это ещё не доказывает корректность потоковой схемы. Плеер может сканировать файл целиком и компенсировать отсутствующий индекс. Для DASH/HLS нужно проверить реальные HTTP-запросы, init segment, range/segment URLs и возможность начать воспроизведение без загрузки хвоста.

Interleaving и progressive download

Interleaving определяет, как chunks разных дорожек чередуются в файле. Если сначала записать всё видео, затем всё аудио, последовательное чтение через сеть будет неудобным: для синхронного воспроизведения клиенту нужны данные из далёких областей файла. MP4Box при обычном сохранении использует интерливинг примерно с полусекундным шагом, чтобы соседние временные участки разных tracks находились ближе на диске.

Но interleaving имеет стоимость: для перестройки существующего файла нужно переписать медиаданные. На SSD это обычно приемлемо, а на очень больших файлах или сетевом хранилище может быть заметно. Если файл служит лишь промежуточным источником для немедленной фрагментации, иногда рациональнее избежать лишней перестановки и построить конечный fMP4 напрямую в фильтровой цепочке.

Progressive download также зависит от расположения moov. Если он в конце, HTTP-клиент без range requests должен дождаться значительной части файла, чтобы узнать таблицы. MP4Box умеет сохранять метаданные в начале. Но для настоящего adaptive streaming лучше использовать segmented/fMP4-модель, а не пытаться имитировать потоковую систему одним fast start MP4.

DASH: как читать основные параметры без путаницы

Параметров dasher много, потому что MPEG-DASH описывает не один формат сегмента, а систему представлений, периодов, шаблонов, временных шкал и профилей. Удобно делить настройки на пять групп: границы сегментов, внутреннюю фрагментацию, naming/template, структуру MPD и свойства входных representation. Такой подход уменьшает риск смешать параметр контейнера с параметром manifest.

Группа настроекЧто контролируетТипичная ошибка
Segment durationЦелевую длительность единицы доставкиОжидание точного числа без учёта RAP
Fragment durationЧастоту moof внутри fMP4Считать fragment синонимом segment
RAP/SAP alignmentТочки безопасного переключения representationПакетировать несинхронные GOP
ProfileНабор ограничений DASH и модель выдачиВыбирать профиль по названию, не по клиенту
Segment template/nameURL и файловые имена сегментовКоллизии имён разных representation
Timeline/numberingКак MPD адресует время и номераНесовпадение startNumber и реальных сегментов
Input propertiesLanguage, role, representation metadataНеправильные AdaptationSet и меню языка

В VOD с несколькими bitrate variants сначала добейтесь ключевых кадров в одинаковых timestamps. Если один вариант имеет IDR на 0, 2, 4 секунды, а другой на 0, 2.5, 5, packager может сформировать сегменты, но seamless ABR становится проблемным. Исправлять это параметром segment duration поздно: GOP создаётся энкодером.

Для live структура MPD меняется во времени. Появляются availability, timeShiftBufferDepth, update period и другие временные сущности. В GPAC соответствующие детали реализует dasher. При диагностике полезно сохранить несколько последовательных MPD и сравнить, как движется окно, а не смотреть только один snapshot.

Многопериодный DASH нужен при discontinuity, смене ключа, рекламы или существенном изменении конфигурации. Но лишний Period увеличивает сложность player state. Если source timestamps случайно обнуляются в середине потока, это может выглядеть как необходимость нового периода, хотя реальная проблема — повреждённая временная шкала.

HLS: master playlist, media playlist и вариант контейнера

Master playlist перечисляет варианты видео и альтернативные media groups. Media playlist описывает последовательность сегментов конкретной дорожки или группы. При диагностике сначала определите, на каком уровне ошибка. Если master не содержит AUDIO/SUBTITLES group, плеер не покажет выбор, даже если соответствующие media playlists и файлы существуют.

В TS-варианте каждый сегмент — MPEG-2 Transport Stream. В fMP4-варианте HLS использует initialization section и media fragments. CMAF обычно опирается на второй вариант. Переключение --muxtype=ts меняет не просто расширение: меняется контейнер и набор требований клиента.

Для subtitle в HLS обычно важны отдельный playlist и WebVTT-сегменты либо поддерживаемая fMP4-текстовая схема. Если MP4Box корректно упаковал subtitle track, но конкретный player не показывает его, проверьте клиентскую поддержку именно выбранного способа, а не только наличие LANGUAGE и NAME.

HEVC, Dolby Vision, HDR и AV1: контейнерная сигнализация

Современные видеокодеки несут существенную часть параметров внутри bitstream, но MP4 sample entry и auxiliary boxes тоже важны. Для HEVC различаются варианты, где parameter sets находятся в sample entry и/или in-band. Dolby Vision добавляет собственную конфигурацию и совместимость с базовым слоем. AV1 использует свою codec configuration record. MP4Box умеет читать и формировать такую сигнализацию, однако она должна соответствовать реальному содержимому.

При Dolby Vision нельзя безопасно назначить профиль произвольному HEVC. Профиль зависит от состава слоёв, RPU и базового HDR/SDR. Аналогично изменение AVC/HEVC profile или level в import modifier не перекодирует поток до новых ограничений. Это инструмент override для корректно известного bitstream, а не конвертер профилей.

HDR metadata может существовать и в VUI/SEI, и в контейнерных boxes. Удаление SEI, remux через неподходящий промежуточный формат или ручное изменение signaling может привести к картинке с неверным tone mapping. Если pipeline предназначен для HDR, после MP4Box проверяйте не только codec name, но и mastering display, content light, transfer characteristics и Dolby/HDR10+ сущности, которые требуются вашей системе.

Теги, главы, cover art и user data

MP4Box поддерживает QuickTime-style tagging через -itags. Теги задаются как список name=value, а специальное значение позволяет очищать набор. Custom tags используют domain/mean и подходят для vendor-specific metadata. Они отличаются от произвольного udta box и от стандартных track properties.

Главы тоже имеют несколько представлений. MP4Box может импортировать chapter file при добавлении и выгружать главы в TTXT/OGG-подобных форматах. При миграции между программами проверяйте, какой именно chapter mechanism читает плеер: Nero chapters, QuickTime text track и другие схемы могут внешне выглядеть одинаково, но храниться по-разному.

Cover art обычно находится в metadata atom и может быть извлечён -dump-cover. Если задача — сохранить все теги при remux из другого контейнера, не предполагайте автоматический перенос каждого vendor field. Сначала сравните metadata до и после, потому что Matroska tags, ID3 и MP4 atoms имеют разную модель.

-dump-udta позволяет извлечь user data заданного 4CC из movie-level или track-level udta. Это полезно для камер, профессиональных систем и файлов с телеметрией. Но неизвестный бинарный блок не следует интерпретировать как текст без документации производителя.

Scene description и системные дорожки

GPAC исторически поддерживает MPEG-4 Systems, BIFS, LASeR, XMT, SVG и связанные scene description механизмы. MP4Box умеет кодировать/декодировать некоторые такие представления и выводить сцены в BT, XMT, VRML, X3D, LASeR XML или SVG. Для обычного MP4-видео эти возможности почти не нужны, но они объясняют наличие множества опций, которые не относятся к современному ремультиплексированию.

При splitting документация отдельно предупреждает, что MPEG-4 Systems и hint tracks обрабатываются не как обычные медиа. Если вы работаете с интерактивным или исследовательским MP4, нельзя предполагать, что операция, безопасная для video + audio, сохранит всю scene graph semantics. Перед преобразованием сделайте структурный dump и определите, какие system tracks присутствуют.

Фильтровый граф gpac: источники, PID и связи

В gpac каждый фильтр получает и выдаёт PID — логические медиапотоки с properties. Автоматическое разрешение графа подбирает подходящие demux/mux/decoder/encoder по возможностям, но связи можно указывать явно. Символ @ соединяет фильтры, а дополнительные селекторы позволяют выбирать конкретные PID. Это особенно полезно, если один источник содержит несколько video/audio streams.

gpac -i input.mkv inspect
gpac -i input.mkv @#Video inspect:full
gpac -i input.mp4 reframer:xs=10:xe=20 -o clip.mp4

Фильтр probe удобен для быстрого определения источника, inspect — для свойств и packet-level диагностики. В отличие от MP4Box -info, inspect работает в общей filter model и может анализировать не только ISO-файл, но и то, что выдаёт предыдущий фильтр. Поэтому при проблеме внутри сложной цепочки inspect можно вставить между стадиями и увидеть, где именно меняются timestamps или properties.

Фильтры mux/demux, restamp/reframer, bsrw, text converters и network I/O можно комбинировать. Однако больше фильтров не означает лучше. Каждый преобразующий этап должен иметь конкретную цель. Если нужен только remux, короткий -i/-o обычно надёжнее графа из декодера, энкодера и лишних преобразований.

Параметры source и destination filters из MP4Box

Когда MP4Box почти подходит, но нужен один низкоуровневый параметр фильтра, можно использовать разделители :sopt: и :dopt:. Первый передаёт опции source side, второй — multiplexer side. Это позволяет, например, изменить block size чтения или специфический параметр MP4 muxer, не переписывая всю команду в синтаксис gpac.

MP4Box -add source.264:sopt:blocksize=20k:dopt:maxchunk=1M -new file.mp4

Порядок важен: обычные MP4Box modifiers должны идти до sopt/dopt. Если команда стала содержать несколько уровней двоеточий, кавычки особенно важны. Для поддержки в скрипте лучше вынести длинный source expression в переменную и печатать итоговую команду в лог перед запуском.

Если одновременно требуется много source/destination options, custom links и несколько outputs, это сигнал перейти на прямой gpac. Так проще читать graph, разделять свойства фильтров и получать -fgraph без попытки мысленно восстановить внутреннюю сессию MP4Box.

Контроль прогресса, ошибки и exit code в скриптах

Человек легко замечает красную строку в консоли, но автоматизация должна опираться на код завершения и структурные проверки. Запускайте MP4Box так, чтобы shell останавливал pipeline при ненулевом exit code. Не используйте -quiet, если затем у вас нет другого канала диагностики. Для CI лучше -noprog плюс log file и строгий режим ошибок.

MP4Box -noprog -strict-error -add video.h264:fps=25 -add audio.aac -new out.mp4
MP4Box -info out.mp4

Если операция создаёт множество DASH/HLS файлов, проверка должна учитывать manifest и хотя бы один media segment, а не только существование каталога. Для remux полезно сравнить число дорожек, codec type, длительность и ожидаемые languages. Это не второй encode test, а минимальный контракт pipeline: результат должен обладать теми свойствами, ради которых команда запускалась.

В shell redirect учитывайте stderr. Некоторые диагностические сообщения MP4Box традиционно направляются туда, даже если не являются критической ошибкой. Поэтому конструкция, которая сохраняет только stdout, может получить пустой файл. Для машинных отчётов лучше использовать dump-команды или фильтр inspect с предсказуемым форматом.

Кавычки и shell: Windows, PowerShell и Bash

Одинаковая строка MP4Box может по-разному интерпретироваться оболочкой. В Bash символ # начинает комментарий, если находится вне кавычек в подходящем контексте; $ расширяет переменные. В PowerShell особые значения имеют $, обратный апостроф и массивы аргументов. В cmd.exe свои правила для кавычек и ^. Поэтому сложный source selector или template всегда лучше заключать в кавычки.

MP4Box -add "input.mkv#video:lang=eng:name=Main" -new "output file.mp4"

В автоматизации безопаснее передавать аргументы как массив через API процесса, а не собирать одну строку shell. Тогда путь с пробелом, # и двоеточиями остаётся одним аргументом без ручного экранирования. Это особенно важно для пользовательских имён файлов, которые могут содержать символы оболочки.

Если ошибка выглядит как unknown option, хотя ключ существует, распечатайте фактический argv или максимально упростите команду. Часто проблема оказывается не в версии MP4Box, а в том, что shell разделил -add source:opt=value на несколько частей или поглотил фрагмент после #.

Производительность: где тратится время

При чистом remux CPU обычно не является узким местом: доминируют чтение и запись. Если MP4Box перестраивает interleaving и переносит moov, объём I/O может быть сравним с размером всего файла, а временный файл удваивает кратковременные требования к диску. На сетевом хранилище задержки могут быть намного выше, чем на локальном SSD.

DASH/HLS-пакетирование тоже часто I/O-bound, если кодирование выполнено заранее. Нагрузка CPU растёт при encryption, hashing, сложных bitstream rewrites и особенно при транскодировании через filters. Поэтому оценивать скорость MP4Box по одному сценарию бессмысленно: remux 100 ГБ и encode 10 минут 4K — принципиально разные workloads.

Для серверной цепочки полезно размещать temporary directory на быстром диске с достаточным запасом и избегать лишних промежуточных flat MP4, если конечная цель — fMP4. Но менять storage mode ради скорости нужно только после определения downstream требований: экономия одного прохода не оправдывает несовместимый результат.

Работа с повреждёнными и необычными файлами

MP4Box может сообщать о несогласованных размерах boxes, обрезанном mdat, неверных offsets, duplicate timestamps или неизвестной sample entry. Не все предупреждения означают, что файл невозможно спасти, но автоматически подавлять их опасно. Сначала сделайте -info, затем -disox, а для временных проблем — -dts.

Если moov отсутствует полностью, обычный MP4 не содержит таблиц, по которым можно восстановить расположение и временную структуру семплов. MP4Box не является универсальным forensic repair tool, способным гарантированно реконструировать такой файл из mdat. Возможность восстановления зависит от кодека, внешних эталонов и специализированных методов.

При работе с недоверенными файлами разумно запускать анализ в изолированной среде и использовать поддерживаемую сборку GPAC. Мультимедийные парсеры работают со сложными бинарными структурами, поэтому security-патчи для них существенны. Это особенно важно для серверов, где файл поступает от внешнего пользователя и автоматически проходит через MP4Box.

Как построить надёжный production-процесс

  1. Зафиксировать требования конечного файла: контейнер, кодеки, языки, роли, streaming profile, DRM.
  2. Проанализировать входы: codec configuration, timestamps, GOP/RAP, duration, sample rate, subtitle format.
  3. Решить, нужен remux или encode. Не кодировать повторно без необходимости.
  4. Нормализовать ABR ladder до пакетирования: одинаковая временная база и синхронные keyframes.
  5. Собрать команду MP4Box или граф gpac с явными output names и temp directory.
  6. Сделать metadata/track mapping детерминированным: language, handler, groups, representation labels.
  7. Для DASH/HLS использовать шаблоны имён, исключающие коллизии разных representation.
  8. Для encryption хранить ключи вне обычных логов и shell history.
  9. Проверять технический контракт результата: tracks, duration, manifest references, segment accessibility.
  10. Сохранять команду и ключевые параметры в build log, чтобы результат можно было воспроизвести.

Эта последовательность важнее конкретного набора ключей. MP4Box очень гибок и позволяет исправлять многие свойства после факта, но стабильный pipeline строится тогда, когда encoder, packager и player согласованы по времени, кодекам и метаданным заранее. Чем меньше магических исправлений в финальной команде, тем легче сопровождать систему.

Дополнительные диагностические команды

КомандаКогда применятьЧто даёт
-topcount 4ccНужно быстро проверить количество top-level boxesЧисло боксов выбранных типов без полного XML
-topsize allОценка распределения размера контейнераРазмеры top-level boxes
-hashТехническая сверка входа в воспроизводимой цепочкеSHA-1 по входному файлу
-dchunkПроблемы interleaving/chunk layoutИнформацию о chunks
-dnalcСравнение NAL contentNAL dump с CRC
-dtscПодозрение на duplicate DTS/CTSБолее медленную проверку семплов
-check-xmlАвтоматическая обработка XML dumpПроверку формата XML-вывода
-fstatОперация MP4Box задействует filtersСтатистику фильтров и PID
-fgraphНужно понять внутренний media pathСвязи фильтровой сессии

Эти ключи не нужны в каждом запуске. Их ценность проявляется в редких ошибках, когда обычный -info говорит файл нормальный, но downstream-система обнаруживает проблему. Вместо полного hex-анализа можно постепенно углублять диагностику: info → box dump → sample timing → bitstream/NAL → filter graph.

Удалённые ресурсы, manifests и сетевой ввод

MP4Box умеет работать не только с файлами на диске. В GPAC есть HTTP-клиент, кэш, proxy-настройки и сетевые фильтры, поэтому некоторые источники можно читать по URL. Для повторяемых production-задач это удобно, но сетевой ввод добавляет новый класс ошибок: таймаут, partial download, сертификат, redirect, proxy и нестабильная пропускная способность. Если требуется гарантированно воспроизводимая упаковка, критические исходники часто лучше предварительно зафиксировать в локальном или объектном хранилище с известной версией.

Опция -wget выполняет загрузку ресурса по HTTP(S) как служебную функцию. -mpd-rip предназначена для получения MPD и связанных сегментов на диск. Эти команды полезны для диагностики и подготовки тестового набора, но их не нужно путать с полноценным downloader для произвольных сайтов: GPAC работает с прямыми медиаресурсами и manifests, а не обходит авторизацию или веб-логику платформ.

Отдельная опция -mpd может преобразовать HLS или Smooth manifest в MPD в базовом режиме. Важное ограничение: это преобразование описания, а не транскодирование и не перепаковка всех связанных сегментов. Если исходные media files несовместимы с предполагаемым DASH-клиентом, один новый MPD проблему не решит. Для сложной конверсии потоковой схемы лучше использовать фильтр dasher и явно задать, какие media streams следует перепаковать.

При работе через сеть учитывайте глобальные параметры таймаута, кэша и proxy. Слишком агрессивный timeout способен оборвать нормальную загрузку большого сегмента, а бесконтрольный cache — подменить свежий manifest старой копией во время теста. В live-сценарии это особенно заметно: ошибку packager легко спутать с тем, что клиент читает устаревший MPD или media playlist из кэша.

Как выбрать между -raw, -single, -mux и обычным -add

Эти команды решают похожие на первый взгляд, но разные задачи. -raw извлекает кодированный поток без контейнера. -single оставляет выбранную дорожку в новом MP4. -mux направляет вход к заданному выходному multiplex format через фильтровый механизм. -add добавляет дорожку в ISO-файл и даёт богатый набор track modifiers. Выбор определяется тем, что нужно получить на следующем шаге.

Нужно получитьПредпочтительный путьПочему
Elementary stream для анализатора-rawНет лишнего контейнера, сохраняется кодированный поток.
Одну дорожку как обычный MP4-singleСохраняется контейнерная форма и привычная совместимость.
Новый MP4 из нескольких источников-add ... -newМожно выбрать tracks и задать language, timing и grouping.
Вывести источник в другой поддерживаемый mux-mux или gpac -i ... -o ...Используется общий фильтровый движок и нужный multiplexer.

Ошибочный выбор часто создаёт лишний этап. Например, извлечь AAC через -raw, а затем тут же добавить его в новый MP4 — допустимо, но если цель состояла только в выделении одной аудиодорожки в MP4, -single проще и сохраняет больше контейнерной информации. Аналогично длинная серия -raw + внешние временные файлы часто заменяется одним графом gpac, если медиаданные не нужно сохранять между стадиями.

При raw extraction расширение результата зависит от codec/exporter и не является гарантией самодостаточности. Некоторые потоки требуют внешней конфигурации, parameter sets или специфического framing. Если извлечённый файл не открывается обычным плеером, это не обязательно означает ошибку MP4Box: elementary stream может быть предназначен для анализатора или повторного mux, а не для непосредственного пользовательского воспроизведения.

Итоговая логика выбора команд

Самый надёжный рабочий порядок для GPAC / MP4Box выглядит так: сначала идентифицировать дорожки и временные параметры через -info, затем сформулировать, меняется ли битстрим или только контейнер, после чего выбрать высокоуровневую команду MP4Box либо граф gpac. При редактировании сохраняйте исходник через -out, при больших файлах заранее задавайте подходящий -tmp, а после операций со структурой проверяйте не только воспроизведение, но и boxes/manifest, которые действительно важны следующему этапу цепочки.

Для MP4/ISOBMFF MP4Box особенно силён там, где требуется сочетать точность контейнера с потоковой упаковкой: создать MP4 из elementary streams, управлять дорожками, извлечь samples, разобрать структуру, подготовить fMP4, DASH, HLS или CMAF, добавить CENC и обработать HEIF. Эта широта одновременно является главным порогом входа: чтобы получить предсказуемый результат, нужно понимать, какой уровень меняется — битстрим, track, box, fragment, segment или manifest — и выбирать команду именно для него.