MP4

30 сентября 2026 · ~15 мин чтения

формат-данных видео стандарт медиа

MP4

MP4 (MPEG-4 Part 14) — это формат файла-контейнера: «коробка», в которую упакованы видеодорожка, аудиодорожка, субтитры и служебная информация о том, как их синхронно проигрывать. Сам MP4 ничего не сжимает — сжатием занимаются кодеки (H.264, H.265, AAC и другие), чьи данные лежат внутри.

История

Чтобы понять MP4, надо начать с Apple. В декабре 1991 года Apple выпустила QuickTime 1.0 — мультимедийную технологию для Mac, а вместе с ней формат файла .mov (QuickTime File Format). Главная идея QuickTime-формата оказалась очень живучей: файл устроен как дерево вложенных «атомов» (атом — блок с длиной, типом и содержимым). Это позволяло добавлять новые типы данных, не ломая старые программы: неизвестный атом можно просто пропустить, раз известна его длина.

Параллельно, с 1988 года, существовала рабочая группа MPEG (Moving Picture Experts Group) при ISO/IEC — её основали Леонардо Кьярильоне (Leonardo Chiariglione) и Хироси Ясуда. MPEG дала миру MPEG-1 (из него вырос MP3, 1993) и MPEG-2 (DVD и цифровое телевидение, середина 1990-х). В конце 1990-х группа работала над стандартом MPEG-4 — большим семейством из десятков «частей» (Parts), от кодеков до систем описания сцен.

Для MPEG-4 понадобился формат файла. Вместо того чтобы изобретать с нуля, MPEG взяла за основу формат QuickTime, который Apple предложила в качестве базы. Вехи примерно такие:

Сегодня MP4 — открытый международный стандарт ISO/IEC, у него нет единственного владельца. Спецификации развивает MPEG (в 2020 году группу реорганизовали внутри ISO/IEC JTC 1/SC 29, но название MPEG осталось в ходу). Патентные вопросы касаются в основном кодеков внутри контейнера (H.264, H.265), а не самого контейнера.

Что это такое

Главное, что нужно усвоить про MP4: контейнер и кодек — разные вещи. Это самый частый источник путаницы.

Масштаб сжатия стоит прочувствовать на цифрах. Видео 1080p с частотой 50 кадров в секунду в «сыром» виде (формат пикселей yuv420p, 1,5 байта на пиксель) — это 1920 × 1080 × 1,5 × 50 ≈ 155 МБ в секунду, около 9 ГБ в минуту. Тот же фрагмент в H.264 с разумным качеством — единицы мегабайт в минуту. Разницу в сотни раз делает кодек. Контейнер же добавляет к этому считанные килобайты-мегабайты служебных таблиц.

Поэтому фраза «видео в формате MP4» говорит почти ничего о качестве и совместимости. Внутри MP4 может быть H.264 (откроется везде), а может быть AV1 или HEVC (откроется не везде). Когда телефон пишет «формат не поддерживается», часто дело не в контейнере, а в кодеке внутри.

Явные пары для сравнения:

Аналогии из жизни

1. Посылочная коробка с описью. MP4 — коробка, в которой лежат завёрнутые предметы (сжатые кадры и звук), а сверху приклеена опись: что лежит, в каком порядке, по какому адресу внутри. Опись — это атом moov, содержимое — атом mdat.
Где работает: объясняет, почему контейнер не влияет на качество — коробка не делает вещи лучше или хуже. И почему можно «переупаковать» (remux) видео в другой контейнер без потери качества.
Где ломается: в настоящей коробке вещи самодостаточны, а в MP4 без описи содержимое почти бесполезно. Если опись потеряна (например, запись оборвалась из-за разряженной батареи), плеер не знает, где начинается какой кадр, и файл «не открывается», хотя все байты видео на месте. С посылкой такого не бывает.

2. Партитура оркестра. В партитуре несколько партий — скрипки, духовые, ударные — идут параллельно, а тактовые черты синхронизируют их во времени. Дорожки MP4 так же идут параллельно, а таблицы времени (timestamps) говорят, какой кусок звука играть вместе с каким кадром.
Где работает: хорошо объясняет дорожки (tracks) и синхронизацию, а также то, что звук и видео можно менять независимо.
Где ломается: партитура читается подряд, слева направо. В MP4 данные разных дорожек перемешаны кусками (chunks) в произвольном порядке, а в видео с B-кадрами порядок хранения кадров вообще не совпадает с порядком показа. Музыкант так играть не смог бы.

3. Книга с оглавлением в конце. Многие программы записи видео пишут опись (moov) в самый конец файла: пока идёт съёмка, они ещё не знают, сколько будет кадров. Это как книга, где оглавление напечатано на последней странице.
Где работает: объясняет проблему «видео не начинает играть, пока не скачается целиком»: браузеру нужно оглавление, а оно в конце. И объясняет лекарство — faststart, то есть перенос оглавления в начало.
Где ломается: по книге можно начать читать с первой страницы и без оглавления. Плеер MP4 без moov не может даже начать — он не знает размеров кадров и их позиций. Кроме того, современные браузеры умеют через HTTP Range-запросы (запрос куска файла по диапазону байтов) сходить в конец файла за описью, так что проблема смягчается — но это лишний круг и лишняя задержка.

Как это работает

Весь MP4-файл состоит из боксов (boxes; в терминологии QuickTime — атомов). Каждый бокс начинается одинаково:

[4 байта: размер бокса][4 байта: тип, четыре буквы][содержимое...]

Если размер больше 4 ГБ, используется расширенная 8-байтовая запись размера. Боксы вкладываются друг в друга, получается дерево. Упрощённо обычный файл выглядит так:

ftyp            — «паспорт»: какой это вариант формата (isom, mp42, M4A...)
moov            — опись (метаданные)
 ├─ mvhd        — общая длительность, масштаб времени
 ├─ trak        — дорожка видео
 │   └─ mdia → minf → stbl   — «таблица сэмплов»:
 │        ├─ stts  — длительности кадров (время)
 │        ├─ stsz  — размер каждого кадра в байтах
 │        ├─ stco  — смещения кусков в файле (co64 для больших файлов)
 │        ├─ stsc  — какие кадры в каком куске
 │        └─ stss  — какие кадры ключевые
 └─ trak        — дорожка аудио (такая же структура)
mdat            — сами сжатые данные, сплошной массой

Как плеер проигрывает файл, по шагам:

  1. Читает ftyp и понимает, что это ISOBMFF-совместимый файл и какие «бренды» (варианты) он поддерживает.
  2. Находит moov и загружает таблицы сэмплов (sample — единица данных: один кадр видео или один блок аудио). Из них он строит карту: «кадр № 1234 лежит по смещению X, размер Y байт, показать в момент T».
  3. Выбирает дорожки: какую видеодорожку и какую аудиодорожку играть (например, русскую озвучку из двух).
  4. Идёт в mdat по нужным смещениям, достаёт сжатые кадры и отдаёт их декодеру (часто аппаратному — в видеочипе телефона или компьютера).
  5. Синхронизирует звук и картинку по временным меткам. Для видео есть два времени: момент декодирования (DTS, decoding timestamp) и момент показа (PTS, presentation timestamp). Они расходятся, если есть B-кадры (кадры, которые ссылаются и на прошлые, и на будущие кадры).
  6. Перемотка: когда ты тянешь ползунок, плеер по таблице stss находит ближайший ключевой кадр (I-кадр, keyframe — кадр, который декодируется без опоры на соседей) и начинает декодирование с него. Отсюда эффект «перемотка прыгает не точно туда» — прыгает к ближайшему ключевому кадру.

Проблема moov в конце. Камера или программа записи не знает заранее, сколько будет кадров, поэтому сначала пишет mdat, а опись — в самом конце. Для локального файла это неважно. Для веба важно: браузер должен сначала добраться до moov. Решение — опция -movflags +faststart в ffmpeg: после кодирования ffmpeg делает второй проход и переносит moov в начало файла. Видео начинает играть почти сразу после начала загрузки.

Фрагментированный MP4 (fMP4). Для прямых эфиров и адаптивного стриминга одна большая опись неудобна. Поэтому файл режут на фрагменты: короткий moov с общими сведениями, а дальше пары moof (опись фрагмента) + mdat (данные фрагмента) по несколько секунд. Плеер может начать с любого фрагмента, а сервер — отдавать разные качества (360p, 720p, 1080p) одинаковыми нарезками. На этом стоят MPEG-DASH, современный HLS и CMAF.

Типичная команда ffmpeg «сделать MP4 для всех» выглядит так:

ffmpeg -i input.mov -c:v libx264 -crf 23 -preset slow \
       -pix_fmt yuv420p -c:a aac -b:a 128k \
       -movflags +faststart output.mp4

Разбор: libx264 — кодировщик H.264; -crf (Constant Rate Factor — «постоянное качество») задаёт качество по шкале 0–51, где меньше — лучше и тяжелее, 23 — значение по умолчанию, 18 — «почти без видимых потерь», 27–28 — заметно компактнее; -preset slow — тратить больше времени ради меньшего размера при том же качестве; yuv420p — самый совместимый формат пикселей (без него некоторые плееры, включая QuickTime, могут показать чёрный экран); faststart — опись в начало.

И обратный пример, без перекодирования: ffmpeg -i in.mkv -c copy out.mp4 — это remux (переупаковка): потоки переносятся в новую «коробку» как есть, за секунды и без потери качества. Работает, если кодеки внутри допустимы для MP4.

Контейнер и кодек — два независимых выбора

Когда видео «не открывается» или «весит слишком много», сначала выясни, что внутри: ffprobe file.mp4 покажет кодеки дорожек. Размер и качество — вопрос кодека и его настроек (CRF, битрейт, разрешение). Совместимость — вопрос пары «контейнер + кодек». Смена контейнера без перекодирования (remux) почти бесплатна; смена кодека — всегда перекодирование с потерями и временем.

Где встречается в обычной жизни

Где встречается в IT и бизнесе

Кто пользуется

Альтернативы и конкуренты

Когда НЕ стоит использовать

«Переименовать расширение» — не конвертация

Смена .mov на .mp4 или .mkv на .mp4 в имени файла ничего не меняет внутри. Иногда плеер всё равно откроет файл, потому что структура похожа или он смотрит на содержимое, а не на имя. Но загрузка на площадку, рекламный кабинет или в мессенджер может молча сломаться. Правильно — ffmpeg -c copy (remux) или полноценное перекодирование.

Связанные понятия

Литература и источники

Где встретилось у меня

Вчера в личном проекте разбирали запись любительского футбольного матча: нейросеть искала мяч и игроков по кадрам, на каждый гол собирался отдельный MP4-ролик со схемой расстановки, а потом ffmpeg склеивал их в общий ролик с libx264, -crf 27 и -movflags +faststart — так, чтобы итог уложился в лимит мессенджера по размеру и сразу играл при открытии.

Краткое резюме