MOV
MOV – это формат мультимедийного контейнера, разработанный компанией Apple Inc. в рамках технологии QuickTime. Он широко используется для хранения видео, аудио и других медиаданных, особенно в экосистемах MacOS и iOS. Формат поддерживает множество различных кодеков: H.264, HEVC, AAC и другие.
Структура файла MOV
Файл MOV состоит из серии атомов (atoms), каждый из которых содержит определённую информацию о содержимом файла. Атомы организованы иерархически, образуя древовидную структуру. Основные типы атомов:
- moov: Основной атом, содержащий метаданные о файле, такие как длительность, размеры кадра, количество треков и их характеристики.
- mdat: Содержит непосредственно данные (видео, аудио).
- trak: Атом-трек, который описывает поток медиа-данных (например, видео или аудио). Каждый трек может содержать свои собственные атомы, такие как:
- tkhd: Заголовок трека, включающий информацию о длительности, размерах кадра и других параметрах.
- edts: Информация о редактировании трека.
- mdia: Медиа-информация, которая включает в себя атомы
minf, содержащие конкретные параметры кодеков и медиа-данных.
Каждый атом имеет фиксированную длину заголовка (8 байт), первые 4 байта которого указывают размер атома (включая сам заголовок), а следующие 4 байта содержат идентификатор типа атома.
Специфические особенности MOV
- Интерливинг: MOV-файлы могут использовать интерливинг, когда аудиоданные чередуются с видеоданными внутри одного потока. Это позволяет синхронизировать звук и видео без необходимости внешнего тайм-кода.
- Мульти-треки: Файлы MOV поддерживают несколько потоков данных одновременно. Например, файл может содержать два разных видеопотока (для разных разрешений) или несколько аудиопотоов (разная языковая дорожка).
- Поддерживаемые кодеки: MOV поддерживает широкий спектр кодеков, включая MPEG-4 Part 10 (H.264/AVC), High Efficiency Video Coding (HEVC/H.265), Advanced Audio Coding (AAC), ProRes и многие другие.
Работа с MOV через ffmpeg
FFmpeg – это мощный инструмент для обработки медиафайлов, который отлично справляется с конвертацией, транскодированием и манипуляцией файлов MOV. Рассмотрим несколько примеров использования ffmpeg для работы с MOV.
Пример 1: Конвертация MOV в MP4
ffmpeg -i input.mov -c:v libx264 -crf 23 -pix_fmt yuv420p output.mp4
Здесь:
-i input.mov: Указывает входной файл.-c:v libx264: Использует кодек x264 для сжатия видео.-crf 23: Устанавливает параметр качества Constant Rate Factor (CRF) равным 23 (чем меньше значение, тем выше качество).-pix_fmt yuv420p: Преобразует пиксельный формат в YUV 4:2:0, совместимый с большинством устройств.output.mp4: Выходной файл.
Пример 2: Извлечение аудио из MOV
ffmpeg -i input.mov -vn -acodec copy audio.aac
Здесь:
-vn: Отключаем видео-потоки.-acodec copy: Копируем аудиопоток без перекодирования.audio.aac: Выходной аудиофайл.
Пример 3: Добавление субтитров к MOV
ffmpeg -i video.mov -i subtitles.srt -map 0:v -map 0:a -map 1:s -c copy -c:s mov_text output.mov
Здесь:
-i video.mov: Входной видеофайл.-i subtitles.srt: Входной файл с субтитрами.-map 0:v -map 0:a -map 1:s: Указываем, какие потоки нужно включить в выходной файл.-c copy -c:s mov_text: Копируем все потоки без изменения, кроме субтитров, которые конвертируем в форматmov_text.output.mov: Выходной файл с добавленными субтитрами.
Работа с MOV через GStreamer
GStreamer – это фреймворк для создания графов обработки медиапотоков. Он предоставляет богатый набор плагинов для работы с различными форматами, включая MOV.
Пример 1: Воспроизведение MOV
import gi
gi.require_version('Gst', '1.0')
from gi.repository import Gst
Gst.init(None)
pipeline = Gst.Pipeline.new("test-pipeline")
source = Gst.ElementFactory.make("filesrc", None)
source.set_property("location", "input.mov")
demuxer = Gst.ElementFactory.make("qtdemux", None)
decoder = Gst.ElementFactory.make("avdec_h264", None)
converter = Gst.ElementFactory.make("videoconvert", None)
sink = Gst.ElementFactory.make("autovideosink", None)
pipeline.add(source)
pipeline.add(demuxer)
pipeline.add(decoder)
pipeline.add(converter)
pipeline.add(sink)
source.link(demuxer)
pad = demuxer.get_static_pad("video_0")
pad.link(decoder.get_static_pad("sink"))
decoder.link(converter)
converter.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("Error: %s" % err, debug)
elif t == Gst.MessageType.EOS:
print("End of stream reached.")
else:
print("Unexpected message received.")
pipeline.set_state(Gst.State.NULL)
Этот пример демонстрирует создание графа для воспроизведения MOV-файла. Здесь используются элементы filesrc, qtdemux, avdec_h264, videoconvert и autovideosink. Граф обрабатывается пошагово, начиная от источника (filesrc) до вывода на экран (autovideosink).
Пример 2: Транскодирование MOV в WebM
import gi
gi.require_version('Gst', '1.0')
from gi.repository import Gst
Gst.init(None)
pipeline = Gst.Pipeline.new("transcode-pipeline")
source = Gst.ElementFactory.make("filesrc", None)
source.set_property("location", "input.mov")
demuxer = Gst.ElementFactory.make("qtdemux", None)
parser = Gst.ElementFactory.make("h264parse", None)
encoder = Gst.ElementFactory.make("vp8enc", None)
muxer = Gst.ElementFactory.make("webmmux", None)
sink = Gst.ElementFactory.make("filesink", None)
sink.set_property("location", "output.webm")
pipeline.add(source)
pipeline.add(demuxer)
pipeline.add(parser)
pipeline.add(encoder)
pipeline.add(muxer)
pipeline.add(sink)
source.link(demuxer)
pad = demuxer.get_static_pad("video_0")
pad.link(parser.get_static_pad("sink"))
parser.link(encoder)
encoder.link(muxer)
muxer.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("Error: %s" % err, debug)
elif t == Gst.MessageType.EOS:
print("Transcoding completed successfully.")
else:
print("Unexpected message received.")
pipeline.set_state(Gst.State.NULL)
Этот пример показывает процесс транскодирования MOV-файла в формат WebM. Для этого используются элементы h264parse, vp8enc и webmmux.