Содержание статьи +
- Кратко
- Зачем это нужно
- Сначала одно важное различие: кодек и контейнер
- Что такое «дорожка» и почему это ключевая идея для аудио
- MP4: универсальный файл и как он хранит аудио в боксах
- fMP4 и CMAF: те же боксы, но разрезанные на сегменты для стриминга
- Matroska и WebM: гибкий открытый контейнер
- MPEG-TS: контейнер вещания, работающий с крошечными пакетами
- Разбор с цифрами: сколько на самом деле добавляет вторая аудиодорожка?
- Сравнение бок о бок
- Ловушка, которую стоит запомнить: баг немой дорожки
- Где здесь Фора Софт
- Главное
- Что читать дальше
Кратко
Контейнер – это своего рода коробка, в которой звук и видео хранятся вместе с инструкциями, необходимыми плееру для их синхронизации. При этом контейнер – не то же самое, что кодек, с помощью которого был сжат звук. Четыре контейнера, с которыми видеопродукт сталкивается в 2026 году, – это MP4 (универсальный формат для скачивания и прогрессивного воспроизведения), fMP4 (тот же формат, разбитый на короткие сегменты для стриминга), Matroska/WebM (гибкий открытый контейнер) и MPEG-TS (рабочая лошадка вещания и легаси-стриминга). Каждый из них хранит аудио как отдельную переключаемую дорожку со своими метаданными – кодеком, частотой дискретизации, конфигурацией каналов и языком – поэтому один файл может одновременно содержать английское стерео, микс 5.1 и комментарий режиссёра. Эта статья объясняет, как каждый контейнер работает с аудио, почему один MP4 может включать пять языков и какие ошибки на уровне контейнера приводят к аудиобагам, которые пользователи замечают первыми.
Зачем это нужно
Если вы создаёте стриминговый сервис, OTT-приложение, инструмент видеосвязи или любой продукт, воспроизводящий медиа, контейнер – это слой, в котором живёт ваша аудиопроводка, и именно сюда команды заглядывают только тогда, когда что-то ломается. Играет не та дорожка, пропал язык, iOS-приложение выбрало 5.1, хотя телевизор поддерживает только стерео, файл идеально воспроизводится в VLC и падает без звука в Safari. Почти каждый такой баг – это проблема на уровне контейнера, а не кодека. Эта статья даёт продакт-менеджеру или разработчику словарь, чтобы уверенно рассуждать о дорожках, сегментах и PID – читать манифест, общаться с инженером и выбирать правильный контейнер до того, как придёт баг-репорт.
Сначала одно важное различие: кодек и контейнер
Почти вся путаница с контейнерами возникает из-за одной подмены понятий – исправим её в первую очередь. Кодек – это метод сжатия аудио: он определяет, как звук преобразуется в компактный поток байтов. Opus, AAC, AC-3 и FLAC – примеры кодеков. Контейнер – это формат файла, который объединяет сжатые данные с метаданными, необходимыми плееру: какие дорожки присутствуют, что они собой представляют, какова их длительность и как поддерживать синхронизацию. MP4, Matroska и MPEG-TS – это контейнеры.
Бытовая аналогия – посылочная коробка. Кодек – это способ упаковки содержимого: вакуум, плёнка, насыпью. Контейнер – это картонная коробка с накладной снаружи: что внутри, куда отправляется, сколько весит. Один и тот же вакуумный пакет можно положить в маленькую или большую коробку; в одну коробку можно упаковать много разных вещей. Курьеру всё сообщает накладная, а не способ упаковки.
Вот почему фраза «MP4-аудио» – слегка неверная, хотя вы будете слышать её постоянно. У формата MP4 нет собственного звука. MP4-файл несёт аудиодорожку, и эта дорожка почти всегда – AAC, но может быть Opus, AC-3 или другой. Когда говорят «аудио в MP4», имеют в виду «аудиодорожка AAC (или другая) обёрнута в контейнер MP4». Держать кодек и контейнер раздельно – самая полезная привычка во всей теме.
Две мысли из этого раздела. Первая: кодек сжимает аудиоданные, а контейнер упаковывает их, обеспечивая целостность и структуру. Вторая: один и тот же кодек может использоваться в разных контейнерах, а один контейнер может содержать несколько кодеков – они развиваются независимо друг от друга.
Что такое «дорожка» и почему это ключевая идея для аудио
Внутри любого современного контейнера медиа организовано в дорожки (tracks). Дорожка – это один непрерывный поток одного вида медиа: одна видеокартинка, один аудиопоток или один поток субтитров, – каждый из которых описан собственным блоком метаданных. Метаданные аудиодорожки невелики, но важны: кодек, частота дискретизации (сколько раз в секунду измерялся звук, обычно 48 000 для видео – см. частоту дискретизации), раскладка каналов (моно, стерео или 5.1) и языковая метка.
Поскольку каждая аудиодорожка самоописательна, один файл может содержать несколько таких дорожек. Один фильм легко размещает в себе английское стерео, английский 5.1, испанский дубляж, французский дубляж и комментарий режиссёра – пять аудиодорожек, каждая с указанием языка и кодировки, при одной видеодорожке. Плеер считывает список дорожек, отображает меню и переключается между ними, не затрагивая изображение. Эта модель переключаемых дорожек одинакова в MP4, Matroska и MPEG-TS; различаются только способы хранения на диске. Всё остальное в статье – это всего лишь четыре ответа на вопрос: «Как этот контейнер хранит и подписывает свои аудиодорожки?»
MP4: универсальный файл и как он хранит аудио в боксах
MP4 – это формат, который поддерживает практически любое устройство на планете. Он построен из простой повторяющейся структуры – бокса (в спецификации это называется box; старые инструменты используют термин «atom» – это одно и то же). Бокс – это подписанный контейнер в контейнере: у него есть размер, четырёхбуквенный код типа и содержимое, которое может быть либо данными, либо снова вложенными боксами. Весь файл представляет собой дерево таких боксов. MP4 – это один из профилей более широкого стандарта ISO Base Media File Format (ISOBMFF), описанного в ISO/IEC 14496-12; специфические правила для MP4 определены в ISO/IEC 14496-14.
Три бокса верхнего уровня выполняют основную работу. Бокс ftyp в самом начале – это накладная на коробке: он объявляет, по каким правилам формата живёт файл, чтобы плеер сразу понял, умеет ли он его читать. Бокс moov – это оглавление: он содержит все метаданные каждой дорожки, но не включает ни одного байта самого аудио или видео. Бокс mdat – это грузовой отсек: он хранит сырые сжатые сэмплы без собственных подписей; на них указывает moov.
Метаданные аудиодорожки хранятся в строго определённых боксах внутри moov. Путь к ним проходит через moov → trak → mdia → minf → stbl → stsd, а аудиоспецифичный маркер – это бокс smhd (заголовок аудио-носителя), по которому плеер определяет, что перед ним аудио, а не видео. Конечная точка – бокс stsd (описание образца) – указывает используемый кодек и содержит его параметры. Для дорожки AAC идентификатор кодека – это mp4a, а внутри него находится небольшой бокс esds, в котором хранится конфигурация AAC (AudioSpecificConfig) – несколько байтов, без которых декодер не сможет воспроизвести ни одного кадра. Потеря этих данных приводит к полной тишине на дорожке; это реальный и довольно распространённый баг при упаковке медиафайлов.
Порядок двух больших боксов важен для стриминга. В обычном файле для скачивания порядок обычно такой: [ftyp][mdat][moov] – оглавление находится в конце. Для полностью загруженного файла это не проблема, но браузер, пытающийся начать воспроизведение во время загрузки, не может стартовать, пока не получит moov – то есть ему пришлось бы сначала загрузить весь файл целиком.
Решение – fast-start (также известный как «веб-оптимизация» или «перенос moov-атома»): бокс moov перемещают в начало файла, получая [ftyp][moov][mdat], чтобы плеер сразу получил оглавление и мог начать воспроизведение уже после первых секунд.
Если ваши прогрессивные видео «бесконечно буферизуются перед стартом», то неперенесённый moov – первое, что стоит проверить.
Несколько аудиодорожек в одном MP4
Да, MP4 может содержать несколько аудиодорожек – это ответ на один из самых частых вопросов о формате. Каждый язык или микс – это просто отдельный бокс trak внутри контейнера moov со своей записью кодека, конфигурацией каналов и языковой меткой. Классическая ошибка не в том, может ли MP4 их хранить, а в том, показывает ли их плеер: некоторые современные плееры и браузеры воспроизводят только первую аудиодорожку, поэтому французский зритель никогда не услышит французский вариант, хотя он присутствует в файле. Для надёжного воспроизведения нескольких аудиодорожек в браузере обычно требуется стриминг с манифестом (о нём ниже), а не один прогрессивный MP4.
fMP4 и CMAF: те же боксы, но разрезанные на сегменты для стриминга
Обычный MP4 – это один длинный файл, что неудобно для стриминга, где плеер должен загружать по несколько секунд за раз и менять качество в реальном времени. Фрагментированный MP4 (fMP4) решает эту проблему, используя тот же формат боксов, но разбивая файл на части. Вместо одного огромного moov и одного огромного mdat, поток fMP4 начинается с небольшого сегмента инициализации (ftyp плюс moov, который описывает дорожки, но не содержит медиа), за которым следует серия медиасегментов – каждый из них представляет собой бокс moof (movie fragment) в паре с небольшим mdat. moof – это мини-оглавление только для сэмплов данного сегмента; mdat содержит только аудио и видео этого сегмента.
Именно такая нарезка делает возможным адаптивный стриминг, а аудио идёт вместе с ней. Аудио каждого сегмента продолжительностью несколько секунд – это одна пара moof+mdat, адресуемая отдельно, поэтому плеер может запрашивать аудиосегменты независимо от видеосегментов и переключать аудиодорожки на границе сегмента. CMAF – Common Media Application Format, ISO/IEC 23000-19 – стандартизирует единый формат fMP4-сегмента, чтобы одни и те же аудио- и видеосегменты могли использоваться как для HLS, так и для DASH. До появления CMAF сервисы часто хранили отдельные сегменты: MPEG-TS для HLS Apple и MP4 для DASH – то есть две копии одного и того же контента. CMAF позволяет использовать один и тот же набор fMP4-сегментов для обоих протоколов, что сокращает затраты на упаковку и хранение примерно на объём второй копии. Как именно плеер выбирает нужный аудиосегмент из предложенных – это вопрос уровня стриминговой логики, который мы подробно разбираем в статье аудио в HLS, DASH, CMAF.
Matroska и WebM: гибкий открытый контейнер
Matroska (файл .mkv) – это открытый контейнер, предназначенный для хранения практически неограниченного числа дорожек любого типа, а также богатых метаданных, глав и вложений. Его байтовый формат – EBML (Extensible Binary Meta Language), бинарный аналог XML: структура из именованных элементов с префиксом длины, похожая на боксы MP4, но более универсальная. С 2024 года Matroska закреплена документом IETF – RFC 9559, который превратил формат из общественной спецификации в опубликованный стандарт.
Аудио в Matroska хранится в элементе TrackEntry, а кодек указывается в поле CodecID – это текстовая строка. Соответствия очевидны: A_OPUS – для Opus, A_VORBIS – для Vorbis, A_AAC – для AAC, A_FLAC – для FLAC, A_AC3 – для Dolby Digital. Характеристики аудио – частота дискретизации, количество каналов, разрядность – находятся в подэлементе Audio той же дорожки.
Есть одна важная деталь: AAC, помещённый в Matroska, не содержит ADTS-обрамления кадров и мультиплексируется как «сырые» кадры, поскольку Matroska предоставляет собственное обрамление. Эта особенность может подвести, когда инструмент извлекает AAC и выдаёт поток, который наивный декодер не распознаёт без дополнительных заголовков.
WebM – это строгое подмножество Matroska, спроектированное для открытого веба. Оно намеренно разрешает только бесплатные от роялти кодеки: VP8/VP9/AV1 для видео, а для аудио спецификация говорит, что CodecID ДОЛЖЕН быть A_VORBIS или A_OPUS. На практике аудио в WebM в 2026 году почти всегда Opus (см. кодек Opus). Если вы отдаёте <video> в HTML с WebM-файлом, ваше аудио – это Opus внутри контейнера-подмножества Matroska: три независимых факта, которые люди регулярно схлопывают в «это WebM».
MPEG-TS: контейнер вещания, работающий с крошечными пакетами
MPEG-TS (MPEG-2 Transport Stream, ISO/IEC 13818-1) – самый старый формат в этом списке и при этом самый распространённый в телевещании, кабельных сетях, спутниковой передаче и во множестве устаревших реализаций HLS. Он создан для «враждебной» среды – одностороннего канала вещания, где теряются биты, а приёмник может подключиться в любой момент, – поэтому устроен принципиально иначе, чем файловые контейнеры-деревья, описанные выше. Вместо одного большого файла с оглавлением в начале MPEG-TS представляет собой непрерывный поток небольших фиксированных пакетов по 188 байт, каждый из которых содержит метку, указывающую, к какому потоку он относится.
Этот штамп – PID (Packet Identifier) – и есть ключ к тому, как MPEG-TS работает с аудио. Каждый элементарный поток – будь то видео или аудио – получает свой уникальный PID, а его сжатые данные разбиваются на блоки PES (Packetised Elementary Stream), которые затем распределяются по 188-байтным транспортным пакетам с этим PID. Приёмник находит нужный аудиопоток, фильтруя пакеты по соответствующему PID и собирая из них PES-единицы.
Поскольку формат должен позволять приёмнику подключиться к потоку в любой момент, информация о том, «что за PID что означает», регулярно транслируется в небольшой таблице – PMT (Program Map Table). В PMT перечисляются PID всех потоков и код stream_type, указывающий используемый кодек: 0x0F для AAC (в обрамлении ADTS), 0x11 для AAC в обрамлении LATM, 0x81 для AC-3 (по конвенции ATSC) и 0x03/0x04 для старых слоёв аудио MPEG-1/2.
Несколько языков – это просто несколько аудио-PID, перечисленных в PMT, каждый со своим языковым дескриптором.
Практический вывод: MPEG-TS жертвует эффективностью ради устойчивости. Повтор PMT и добавление заголовка к каждому 188-байтному пакету создают накладные расходы, которых нет у файловых контейнеров, но именно это позволяет приёмнику восстановиться после потери данных и начать воспроизведение с любой точки – а это критически важно для вещания и старого HLS. Эта плата за надёжность – главная причина, по которой индустрия переходит HLS на CMAF fMP4 во всех случаях, где позволяет поддержка плееров.
Разбор с цифрами: сколько на самом деле добавляет вторая аудиодорожка?
Частое опасение – что добавление аудиодорожек раздувает файл. Посчитаем с реальной арифметикой. Возьмём полнометражный фильм продолжительностью 90 минут, аудио с частотой дискретизации 48 кГц и добавим одну дополнительную стереодорожку с комментариями в формате AAC со стандартной битрейтом 128 кбит/с:
битрейт = 128 кбит/с = 128 000 бит в секунду
длительность = 90 мин = 5 400 секунд
размер (бит) = 128 000 × 5 400 = 691 200 000 бит
размер (байт) = 691 200 000 ÷ 8 = 86 400 000 байт
размер (МБ) = 86 400 000 ÷ 1 000 000 ≈ 86 МБТо есть дополнительный стереоязыковый трек занимает около 86 МБ на полном метре – мелочь по сравнению с многогигабайтной HD-видеодорожкой. Дорожка 5.1 в формате AC-3 со скоростью 384 кбит/с занимает примерно втрое больше – около 259 МБ, что всё ещё мало по сравнению с видео. Накладные расходы контейнера на перенос этих дорожек (лишний бокс trak или дополнительный PID в TS) ничтожно малы – всего несколько килобайт. Поэтому мультиязычная доставка – это вопрос организации дорожек и хранения, а не «можем ли мы это позволить»; реальная стоимость проявляется на уровне CDN при масштабировании на множество тайтлов, что мы подробно разбираем в статье хранение и CDN-математика мультиязычного аудио.
Сравнение бок о бок
| Критерий | MP4 / fMP4 | Matroska / WebM | MPEG-TS |
|---|---|---|---|
| Стандарт | ISO/IEC 14496-12 / -14; CMAF 23000-19 | RFC 9559 (Matroska); WebM – подмножество | ISO/IEC 13818-1 |
| Структура | Дерево боксов (moov/mdat) | Дерево элементов EBML (TrackEntry) | Пакеты по 188 байт с PID |
| Чем назван аудиокодек | запись в stsd (mp4a + esds) | строка CodecID (A_OPUS, A_AAC) | stream_type в PMT |
| Типичный аудиокодек | AAC; Opus в fMP4/WebM | Opus (WebM), AAC/FLAC/AC-3 (MKV) | AAC, AC-3, MP2 |
| Мультидорожечное аудио | Да (несколько trak) | Да (много TrackEntry) | Да (несколько аудио-PID) |
| Силён в | Универсальном воспроизведении, стриминге через CMAF | Гибкости, архиве, открытом вебе | Вещании, восстановлении после потерь, легаси-HLS |
| Старт с любой точки | Только на границах сегментов (fMP4) | Границы кластеров | Любая точка (так и задумано) |
Ловушка, которую стоит запомнить: баг немой дорожки
Самый частый аудиосбой на уровне контейнера – это не пропавшая дорожка, а присутствующая, которая воспроизводит тишину или не декодируется. Почти всегда причина – отсутствующие или некорректные метаданные настройки кодека. В MP4 это может быть отсутствующий или повреждённый esds (байты конфигурации AAC); в Matroska – отсутствующий CodecPrivate; в MPEG-TS – неверный stream_type или отсутствующий аудиодескриптор в PMT. Файл выглядит целым, воспроизводится в одном плеере, который умеет «догадываться», но падает в строгом плеере вроде Safari или в аппаратном декодере, который буквально доверяет метаданным. Урок: если аудио работает в одном плеере, но не работает в другом – сначала проверяйте бокс настройки кодека в контейнере, а не сам кодек или аудиоданные. Ремукс, пересобирающий метаданные настройки, исправляет гораздо больше случаев «сломанного аудио», чем переэнкодинг.
Где здесь Фора Софт
Выбор контейнера возникает почти в каждом видеопродукте, который мы создаём. При работе с OTT и стримингом переход на CMAF fMP4 означает использование одного набора аудиосегментов для HLS и DASH вместо двух – это упрощает как конвейер упаковки, так и расходы на хранение. В записи видеосвязи и e-learning звонок сохраняется в контейнер – чаще всего Matroska или MP4 – где корректность метаданных настроек и языковых меток аудиодорожек критически важна: в противном случае ломаются последующая транскрипция и воспроизведение. В системах видеонаблюдения и телемедицины применяются как MPEG-TS, так и fMP4 – в зависимости от того, используется вещательный или веб-путь. Во всех этих случаях аудиобаги, докатившиеся до пользователя – неправильная дорожка, пропавший язык, немое воспроизведение – как правило, являются следствием ошибок на уровне контейнера. Поэтому мы рассматриваем упаковку как полноценную часть конвейера, а не как второстепенную задачу, выполняемую напоследок.
Главное
- Кодек сжимает аудио, а контейнер его упаковывает и связывает. Они могут меняться независимо.
- Аудио хранится в самоописных дорожках, поэтому один файл может содержать несколько языков и звуковых дорожек.
- MP4 хранит аудио в структуре боксов: moov – индекс, mdat – данные, esds содержит настройки AAC.
- fMP4 и CMAF разбивают те же боксы на сегменты, чтобы один и тот же набор мог использоваться и для HLS, и для DASH.
- MPEG-TS передаёт аудио через PID, который сопоставляется с кодеком по stream_type в таблице PMT.
- Большинство проблем со «сломанным аудио» вызваны потерей метаданных настроек кодека – их можно исправить ремуксом, а не переэнкодингом.
Что читать дальше
- PCM, WAV, AIFF, FLAC, ALAC: форматы без потерь – это чистые и lossless-форматы, которые часто используются в качестве мастер-файлов внутри контейнеров.
- Кадры, пакеты, гранулы: почему аудио нарезано на куски – как выглядят сжатые сэмплы внутри mdat и PES.
- Аудио в HLS, DASH, CMAF: как плеер выбирает аудиодорожку – как плеер выбирает нужную аудиодорожку из тех, что предоставляет контейнер.