MP4
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 предложила в качестве базы. Вехи примерно такие:
- 2001 — первая версия формата файла MP4 внутри стандарта MPEG-4 Systems (ISO/IEC 14496-1).
- 2003–2004 — формат разделили на два уровня: общий ISO Base Media File Format (ISOBMFF, «Часть 12», ISO/IEC 14496-12) и собственно MP4 (ISO/IEC 14496-14, «Часть 14») как его конкретизацию. В 2003 же году был утверждён кодек H.264/AVC (MPEG-4 Part 10), который и сделал MP4 массовым.
- 2007–2010 — iPhone, YouTube и HTML5
<video>: связка «MP4 + H.264 + AAC» становится де-факто стандартом интернет-видео. - 2010-е — на базе того же ISOBMFF появляются фрагментированный MP4 для стриминга (MPEG-DASH, стандарт ISO 2012 года; HLS от Apple с 2016 года тоже поддерживает fMP4), а в 2016–2018 — CMAF (единый формат сегментов для DASH и HLS). Туда же — фото-форматы HEIF/HEIC (с 2017 года дефолт на iPhone) и AVIF: это тоже «коробки» ISOBMFF, только с картинками.
Сегодня MP4 — открытый международный стандарт ISO/IEC, у него нет единственного владельца. Спецификации развивает MPEG (в 2020 году группу реорганизовали внутри ISO/IEC JTC 1/SC 29, но название MPEG осталось в ходу). Патентные вопросы касаются в основном кодеков внутри контейнера (H.264, H.265), а не самого контейнера.
Что это такое
Главное, что нужно усвоить про MP4: контейнер и кодек — разные вещи. Это самый частый источник путаницы.
- Кодек (codec, от coder-decoder — «кодировщик-декодировщик») — алгоритм сжатия. Он превращает поток сырых кадров в компактный битовый поток и обратно. Примеры видеокодеков: H.264 (AVC), H.265 (HEVC), VP9, AV1. Аудиокодеки: AAC, MP3, Opus.
- Контейнер — формат файла, который хранит один или несколько таких потоков (их называют дорожками, tracks) плюс метаданные: длительность, частота кадров, какой кадр в какой момент показывать, где в файле лежит каждый кусок, язык аудиодорожки, обложка, название.
Масштаб сжатия стоит прочувствовать на цифрах. Видео 1080p с частотой 50 кадров в секунду в «сыром» виде (формат пикселей yuv420p, 1,5 байта на пиксель) — это 1920 × 1080 × 1,5 × 50 ≈ 155 МБ в секунду, около 9 ГБ в минуту. Тот же фрагмент в H.264 с разумным качеством — единицы мегабайт в минуту. Разницу в сотни раз делает кодек. Контейнер же добавляет к этому считанные килобайты-мегабайты служебных таблиц.
Поэтому фраза «видео в формате MP4» говорит почти ничего о качестве и совместимости. Внутри MP4 может быть H.264 (откроется везде), а может быть AV1 или HEVC (откроется не везде). Когда телефон пишет «формат не поддерживается», часто дело не в контейнере, а в кодеке внутри.
Явные пары для сравнения:
- MP4 vs MOV. Почти родственники: MOV — предок, MP4 — стандартизованный потомок. Структура одинаковая (атомы/боксы), различаются набором допустимых кодеков и деталями. Поэтому переименование
.movв.mp4иногда «работает» — но это везение, а не правило. - MP4 vs MKV (Matroska). Matroska — открытый контейнер 2002 года, построенный на EBML (двоичный аналог XML). Гибче: вмещает почти любые кодеки, много аудиодорожек и субтитров. Зато хуже поддерживается «из коробки» на телефонах, телевизорах и в браузерах.
- MP4 vs WebM. WebM (Google, 2010) — урезанная Matroska с кодеками VP8/VP9/AV1 и Vorbis/Opus, без патентных отчислений. Хорош для веба, записей экрана и видеозвонков (например, так пишут многие браузерные рекордеры), но на старых устройствах Apple поддержка появилась поздно.
- MP4 vs MPEG-TS (.ts). Транспортный поток из телевещания: данные нарезаны пакетами по 188 байт, каждый можно декодировать почти независимо. Устойчив к потерям в эфире, но с большими накладными расходами. Долго был основой HLS-стриминга.
- MP4 vs M4A/M4V/3GP. Это тот же ISOBMFF с другим расширением: M4A — только аудио (часто AAC), M4V — видео от Apple (иногда с DRM), 3GP — облегчённый вариант для старых мобильных телефонов.
Аналогии из жизни
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 — сами сжатые данные, сплошной массой
Как плеер проигрывает файл, по шагам:
- Читает
ftypи понимает, что это ISOBMFF-совместимый файл и какие «бренды» (варианты) он поддерживает. - Находит
moovи загружает таблицы сэмплов (sample — единица данных: один кадр видео или один блок аудио). Из них он строит карту: «кадр № 1234 лежит по смещению X, размер Y байт, показать в момент T». - Выбирает дорожки: какую видеодорожку и какую аудиодорожку играть (например, русскую озвучку из двух).
- Идёт в
mdatпо нужным смещениям, достаёт сжатые кадры и отдаёт их декодеру (часто аппаратному — в видеочипе телефона или компьютера). - Синхронизирует звук и картинку по временным меткам. Для видео есть два времени: момент декодирования (DTS, decoding timestamp) и момент показа (PTS, presentation timestamp). Они расходятся, если есть B-кадры (кадры, которые ссылаются и на прошлые, и на будущие кадры).
- Перемотка: когда ты тянешь ползунок, плеер по таблице
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) почти бесплатна; смена кодека — всегда перекодирование с потерями и временем.
Где встречается в обычной жизни
- Съёмка на телефон. iPhone по умолчанию пишет
.movс HEVC (или H.264 в режиме «наиболее совместимый»), Android — чаще.mp4. Внутри это одна и та же боксовая структура. Когда ты отправляешь ролик и мессенджер «обрабатывает видео», он обычно перекодирует его в MP4 с H.264 меньшего размера. - Фото на iPhone (HEIC). Файл
.heic— это тоже ISOBMFF-контейнер, дальний родственник MP4, только внутри не видео, а картинки, сжатые кодеком HEVC. Поэтому «Live Photo» так естественно совмещает фото и короткое видео. - Видео в соцсетях и мессенджерах. «Гифки» в большинстве мессенджеров и соцсетей давно не GIF, а короткие беззвучные MP4: они в разы легче при лучшем качестве.
- Музыка из iTunes/Apple Music и аудиокниги.
.m4aи.m4b— это MP4-контейнер с одной аудиодорожкой (AAC или ALAC). Главы в аудиокниге — тоже бокс с метаданными. - Запись разговора на телефон или созвона. Сломанный файл после того, как приложение «вылетело» во время записи, — классика:
mdatзаписан, аmoovне успел. Специальные утилиты восстанавливают опись по «эталонному» файлу с того же устройства.
Где встречается в IT и бизнесе
- Веб-видео и лендинги. Фоновое видео на сайте, промо-ролик в карточке товара — почти всегда MP4 (H.264 + AAC) с
faststart. Нужно, когда видео должно играть в любом браузере без плагинов. - Стриминговые платформы. YouTube, Netflix и онлайн-кинотеатры хранят и раздают видео фрагментированными MP4-сегментами (DASH/HLS/CMAF), подстраивая качество под скорость сети. Нужно, когда аудитория на разных каналах связи и устройствах.
- Видеореклама. Рекламные сети и площадки обычно требуют креативы в MP4 с H.264 и ограничениями по размеру, длительности и битрейту. Нужно, когда один креатив крутится на десятках площадок.
- Компьютерное зрение и аналитика видео. Нейросети детекции и трекинга (отслеживания объектов по кадрам) читают кадры из MP4 через ffmpeg или OpenCV, а результат — видео с разметкой — снова пишут в MP4. Нужно, когда разбирают записи с камер, спортивные матчи, поток на производстве.
- Автоматизация контента. Нарезка роликов, склейка (
ffmpeg -f concat), наложение подписей, генерация превью — всё это пайплайны вокруг MP4. Нужно, когда видео делают десятками, а не руками по одному.
Кто пользуется
- YouTube в рекомендациях по загрузке прямо называет предпочтительный вариант: контейнер MP4, видео H.264, аудио AAC-LC,
moovв начале файла (fast start). По данным самого YouTube, ежеминутно на платформу загружаются сотни часов видео — примерно 500 часов в минуту по публичным цифрам конца 2010-х. - Apple — прародитель формата и главный его популяризатор: весь медиастек (QuickTime, AVFoundation, iPhone-камера, HEIC, Apple Music) построен на ISOBMFF.
- Netflix и другие стриминговые сервисы используют фрагментированный MP4 и адаптивный битрейт; Netflix публично рассказывал, что кодирует каждый тайтл во множестве вариантов разрешения и битрейта (точные цифры для текущего момента не знаю — ищи в Netflix Tech Blog).
- Браузеры — Chrome, Safari, Firefox, Edge — все поддерживают MP4 с H.264 в теге
<video>; это наименьший общий знаменатель веб-видео. - Мессенджеры (Telegram, WhatsApp и другие) перекодируют пользовательские ролики в MP4 для экономии трафика и совместимости.
Альтернативы и конкуренты
- MKV (Matroska). Плюсы: открытый, гибкий, любые кодеки, много дорожек и субтитров, хорошо переживает обрыв записи. Минусы: слабая нативная поддержка в браузерах, на iPhone и многих телевизорах.
- WebM. Плюсы: без патентных отчислений, отличная поддержка в Chrome/Firefox, кодеки VP9/AV1 дают хорошее сжатие. Минусы: в экосистеме Apple поддержка пришла поздно и неполно; в монтажных программах бывает неудобен.
- MOV (QuickTime). Плюсы: родной для Apple и профессионального монтажа (ProRes и другие «монтажные» кодеки), богатые метаданные. Минусы: в вебе и на Android хуже совместимость, файлы с ProRes огромные.
- MPEG-TS. Плюсы: устойчив к потерям, можно начать с любого места потока, стандарт телевещания. Минусы: большие накладные расходы на заголовки пакетов; для хранения и раздачи файлов в вебе уступает fMP4.
Когда НЕ стоит использовать
- Для записи, которая может оборваться, — например, долгая запись экрана или камеры на нестабильной машине. Обычный MP4 пишет опись в конце, и при сбое файл окажется «битым». Потому что лучше писать в MKV или фрагментированный MP4 (где опись идёт кусками), а потом при необходимости сделать remux в MP4.
- Как промежуточный формат для монтажа и многократной переработки. Если ролик будут резать, красить и перекодировать несколько раз, H.264 в MP4 с каждым проходом теряет качество. Потому что для промежуточных шагов нужны «мезонинные» кодеки (ProRes, DNxHD) или хотя бы высокий битрейт, а финальный MP4 делают один раз в конце.
- Когда критична бесплатность лицензий и нужна только веб-аудитория на Chrome/Firefox. Потому что WebM с VP9/AV1 закрывает задачу без патентных вопросов вокруг H.264/H.265 (хотя AV1 можно класть и в MP4 — снова вопрос кодека, а не контейнера).
«Переименовать расширение» — не конвертация
Смена .mov на .mp4 или .mkv на .mp4 в имени файла ничего не меняет внутри. Иногда плеер всё равно откроет файл, потому что структура похожа или он смотрит на содержимое, а не на имя. Но загрузка на площадку, рекламный кабинет или в мессенджер может молча сломаться. Правильно — ffmpeg -c copy (remux) или полноценное перекодирование.
Связанные понятия
- Кодек (H.264/AVC, H.265/HEVC, AV1) — алгоритм сжатия видео; именно он определяет размер и качество файла.
- ffmpeg — открытый консольный «швейцарский нож» для видео и аудио: конвертация, нарезка, склейка, перекодирование.
- Битрейт и CRF — сколько бит в секунду тратится на видео; CRF — режим «держи постоянное качество», битрейт — «держи постоянный объём».
- Ключевой кадр (I-frame) и GOP — кадр, декодируемый без соседей, и группа кадров между ключевыми; определяют точность перемотки и нарезки.
- Адаптивный стриминг (HLS, MPEG-DASH, CMAF) — раздача видео короткими сегментами в нескольких качествах с переключением на лету.
- ISOBMFF — общий «родительский» формат боксов, на котором построены MP4, M4A, HEIC, AVIF и 3GP.
Литература и источники
- Wikipedia: «MP4» — https://en.wikipedia.org/wiki/MP4_file_format и русская статья «MPEG-4 Part 14» — https://ru.wikipedia.org/wiki/MPEG-4_Part_14
- Wikipedia: «ISO base media file format» — https://en.wikipedia.org/wiki/ISO_base_media_file_format
- Спецификация ISO/IEC 14496-12 (ISOBMFF) — платная на iso.org, но ранние редакции свободно доступны в каталоге «Publicly Available Standards» ISO; искать «ISO/IEC 14496-12 publicly available».
- Документация ffmpeg — https://ffmpeg.org/documentation.html, особенно разделы про muxer
mp4/mov(опцияmovflags) и руководство по H.264 в вики ffmpeg (искать «FFmpeg H.264 Video Encoding Guide»). - Apple «QuickTime File Format Specification» — на developer.apple.com, искать по названию; первоисточник понятий «атом» и
moov. - Iain E. G. Richardson, «The H.264 Advanced Video Compression Standard» (2-е изд., 2010, en) — если захочется понять, что лежит внутри
mdat.
Где встретилось у меня
Вчера в личном проекте разбирали запись любительского футбольного матча: нейросеть искала мяч и игроков по кадрам, на каждый гол собирался отдельный MP4-ролик со схемой расстановки, а потом ffmpeg склеивал их в общий ролик с libx264, -crf 27 и -movflags +faststart — так, чтобы итог уложился в лимит мессенджера по размеру и сразу играл при открытии.
Краткое резюме
- MP4 — это контейнер, а не кодек: «коробка» с дорожками видео, аудио, субтитров и описью, как их играть. Качество и размер определяет кодек внутри (чаще всего H.264 или HEVC).
- Формат вырос из QuickTime от Apple (1991) и стандартизован MPEG как ISO/IEC 14496-14 в начале 2000-х; его основа ISOBMFF используется также в M4A, HEIC, AVIF.
- Файл состоит из боксов:
ftyp(паспорт),moov(опись, таблицы кадров),mdat(данные). Безmoovданные бесполезны — поэтому оборванные записи «не открываются». - Для веба нужен
faststart(опись в начале), а для стриминга — фрагментированный MP4 с короткими сегментами. - Remux (
-c copy) меняет «коробку» без потерь и за секунды; перекодирование меняет содержимое, тратит время и качество.