Содержание статьи +
- Кратко
- Зачем это нужно
- Сначала одно различие, объясняющее всё: кодек против контейнера
- Что такое «дорожка» и почему это ключевая идея для аудио
- 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 (sound media header), по которому плеер понимает, что это аудио, а не видео. Конечная точка, бокс stsd (sample description), называет кодек и несёт его настроечные данные. Для дорожки AAC запись кодека – это mp4a, и внутри неё спрятан маленький бокс esds, держащий те несколько байтов конфигурации AAC (AudioSpecificConfig), без которых декодер не сыграет ни одного кадра. Потеряйте эти байты – и дорожка молчит; это реальный и частый баг упаковки.
Порядок двух больших боксов важен для стриминга. В обычном файле для скачивания порядок часто такой: [ftyp][mdat][moov] – оглавление лежит в конце. Для полностью скачанного файла это нормально, но браузер, пытающийся играть во время скачивания, не может начать, пока не получит moov, – то есть ему пришлось бы сначала забрать весь файл. Решение – fast-start (его же зовут «веб-оптимизацией» или «переносом moov atom»): бокс 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: как плеер выбирает аудиодорожку – как плеер выбирает среди аудиодорожек, которые эти контейнеры показывают.