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 могут использоваться различные кодеки для сжатия видео и аудио. Некоторые из наиболее распространенных:
- Видео: H.264 (AVC), H.265 (HEVC), VP9, AV1.
- Аудио: AAC, MP3, AC-3, Opus.
Спецификация
Формат 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.