Перейти к основному содержимому

MP4

MP4 (MPEG-4 Part 14) – это формат мультимедийного контейнера, который используется для хранения видео, аудио, субтитров и других данных. Он основан на стандарте ISO/IEC 14496-12 (MPEG-4 Part 12), который определяет структуру контейнеров, используемых для цифрового мультимедиа. Формат MP4 широко применяется благодаря своей совместимости с различными устройствами и платформами, а также поддержке потоковой передачи через интернет.

Основные характеристики MP4

Структура файла MP4

Файл MP4 состоит из блоков, называемых атомами (atoms). Каждый атом имеет уникальный идентификатор (четырехбайтный код) и содержит определенный набор данных. Вот несколько ключевых атомов:

  • ftyp: Указывает тип файла и его совместимость с другими версиями стандарта.
  • moov: Содержит метаданные о файле, включая информацию о треках, их параметрах и времени воспроизведения.
  • mdat: Хранит медиаданные (видео, аудио).
  • trak: Описывает трек (например, видео или аудиодорожку).
  • mvhd: Заголовок фильма, содержащий общую информацию о файле.

::: warn При записи MP4 метаданные файла пишутся в конце. При аварийном обрыве записи до сохранения метаданных вся записанная информация становится нечитаемой!

:::

::: success Для записи используйте MKV, потом переносите без пережатия потоки в контейнер MP4 для большей совместимости с различным ПО. Так делает OBS, если установить формат записи MKV.

:::

Поддерживаемые кодеки

В MP4 могут использоваться различные кодеки для сжатия видео и аудио. Некоторые из наиболее распространенных:

Спецификация

Формат MP4 регламентируется стандартом ISO/IEC 14496-14, который описывает следующие аспекты:

  • Треки: Файлы MP4 могут содержать несколько треков, каждый из которых может включать видео, аудио, текстовые данные (субтитры) или другие типы информации.
  • Потоки: Внутри каждого трека могут находиться потоки, представляющие собой последовательности кадров (для видео) или пакетов (для аудио).
  • Синхронизация: Для синхронизации потоков используются временные метки (timestamps), чтобы обеспечить правильное воспроизведение мультимедиаконтента.

Использование FFmpeg

Конвертация файла в MP4

ffmpeg -i input.mov -c:v libx264 -crf 23 -pix_fmt yuv420p -c:a aac output.mp4

Здесь:

  • input.mov — исходный файл.
  • libx264 — кодек для сжатия видео (H.264).
  • crf 23 — параметр качества (чем меньше значение, тем выше качество).
  • yuv420p — цветовой формат.
  • aac — кодек для сжатия аудио.
  • output.mp4 — выходной файл.

Извлечение аудиодорожки из MP4

ffmpeg -i video.mp4 -vn -acodec copy audio.aac

Здесь:

  • video.mp4 — входной файл.
  • -vn — отключение видео.
  • -acodec copy — копирование аудиопотока без перекодирования.
  • audio.aac — выходной аудиофайл.

Использование GStreamer

GStreamer предоставляет гибкий фреймворк для создания графов обработки мультимедийных данных. Вот пример простого проигрывателя MP4-файла:

import gi
gi.require_version('Gst', '1.0')
from gi.repository import Gst

Gst.init(None)

pipeline = Gst.Pipeline.new("player")
source = Gst.ElementFactory.make("filesrc", None)
source.set_property("location", "video.mp4")
decoder = Gst.ElementFactory.make("decodebin", None)
sink = Gst.ElementFactory.make("autovideosink", None)

pipeline.add(source)
pipeline.add(decoder)
pipeline.add(sink)

source.link(decoder)
decoder.connect("pad-added", lambda d, p: decoder.link(sink))

pipeline.set_state(Gst.State.PLAYING)

bus = pipeline.get_bus()
msg = bus.timed_pop_filtered(Gst.CLOCK_TIME_NONE, Gst.MessageType.ERROR | Gst.MessageType.EOS)

if msg:
t = msg.type
if t == Gst.MessageType.ERROR:
err, debug = msg.parse_error()
print(f"Error: {err.message}")
elif t == Gst.MessageType.EOS:
print("End of stream reached.")
else:
print(f"Unexpected message received: {t}")

pipeline.set_state(Gst.State.NULL)

Этот скрипт воспроизводит файл video.mp4, используя элементы filesrc, decodebin и autovideosink.