MPEG 4
MPEG-4 – это стандарт видеокомпрессии, разработанный Moving Picture Experts Group (MPEG), который был впервые опубликован в 1998 году. Он стал значительным шагом вперед после предшественников, таких как MPEG-2, благодаря внедрению новых методов сжатия видео и поддержки различных типов мультимедийного контента.
Основные характеристики:
- Формат файла:
.mp4,.m4v - Тип компрессии: Гибридная компрессия, включающая межкадровое предсказание и внутрикадровую компрессию.
- Контейнеры: MP4, AVI, MOV, MKV
Применение:
- Цифровое телевидение: IPTV, кабельное ТВ, спутниковое вещание.
Почему MPEG-4 все еще используется?
Несмотря на появление более современных стандартов, таких как H.264 и HEVC, MPEG-4 продолжает использоваться благодаря следующим причинам:
- Совместимость: Широкая поддержка среди устройств и программного обеспечения.
- Простота реализации: Легче реализовать и поддерживать, чем более сложные стандарты.
- Широкий спектр применения: Подходит для различных сценариев использования, включая интернет-видео, цифровое телевидение и мобильные устройства.
Сравнение с другими кодеками:
MPEG-2 vs. MPEG-4:
- MPEG-2 использовался для DVD-дисков и цифрового телевидения. Он имеет меньшую эффективность сжатия по сравнению с MPEG-4.
- MPEG-4 предлагает лучшую производительность при низком битрейте и поддерживает больше форматов данных.
H.264 vs. MPEG-4:
- H.264 (также известный как AVC) является преемником MPEG-4 и обеспечивает значительно лучшее качество изображения при том же битрейте.
- MPEG-4 проще в реализации и лучше подходит для приложений с ограниченными ресурсами.
HEVC (H.265) vs. MPEG-4:
- HEVC представляет собой следующий шаг в развитии видеокомпрессии, предлагая вдвое большую эффективность сжатия по сравнению с H.264.
- MPEG-4 менее эффективен, но легче реализуется и поддерживается.
Совместимость с ПО:
- Операционные системы: Windows, macOS, Linux
- Программное обеспечение: VLC, QuickTime, Windows Media Player, FFmpeg, GStreamer
- SDK и библиотеки: libavcodec, x264, x265
Ограничения:
- Низкая эффективность при высоких разрешениях: По сравнению с современными кодеками, такими как H.264 и HEVC, MPEG-4 менее эффективен при работе с высоким разрешением.
- Отсутствие поддержки некоторых современных функций: Например, HDR, 10-битный цвет.
Уникальные особенности:
- Объектно-ориентированное кодирование: Позволяет кодировать отдельные объекты в кадре независимо друг от друга.
- Поддержка интерактивных мультимедийных приложений: Включает возможность взаимодействия с пользователем через меню и гиперссылки.
Алгоритм кодирования:
Алгоритм кодирования MPEG-4 включает следующие этапы:
- Преобразование цвета: Из YCbCr в RGB.
- Разбиение на макроблоки: Кадр разбивается на блоки размером 16x16 пикселей.
- Внутрикадровая компрессия: Использование дискретного косинусного преобразования (DCT) для уменьшения избыточности внутри каждого блока.
- Межкадровое предсказание: Использование предыдущих кадров для предсказания текущего кадра.
- Квантование: Уменьшение количества уровней яркости и цвета для дальнейшего сжатия.
- Энтропийное кодирование: Использование Хаффмана или арифметического кодирования для минимизации размера данных.
Отличие от других кодеков:
- MPEG-2: Меньшая эффективность сжатия, отсутствие объектно-ориентированного кодирования.
- H.264: Более сложная структура блоков, улучшенное предсказание движения, поддержка большего числа режимов квантования.
- HEVC: Еще более высокая эффективность сжатия за счет использования больших блоков и улучшенных методов предсказания.
Пример кодирования через FFmpeg:
ffmpeg -i input.mp4 -c:v mpeg4 -b:v 1M -c:a aac output.mpg
Пример кодирования через GStreamer:
#!/usr/bin/env python3
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", "source")
source.set_property("location", "input.mp4")
decoder = Gst.ElementFactory.make("decodebin", "decoder")
encoder = Gst.ElementFactory.make("mpeg4videoparse", "encoder")
encoder.set_property("bitrate", 1000000)
muxer = Gst.ElementFactory.make("matroskamux", "muxer")
sink = Gst.ElementFactory.make("filesink", "sink")
sink.set_property("location", "output.mkv")
pipeline.add(source, decoder, encoder, muxer, sink)
link_elements = [
source.link(decoder),
encoder.link(muxer),
muxer.link(sink)
]
if not all(link_elements):
print("Elements could not be linked.")
else:
pipeline.set_state(Gst.State.PLAYING)
Gst.debug_bin_to_dot_file(pipeline, Gst.DebugGraphDetails.ALL, "pipeline")
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}")
print(f"Debugging information: {debug}")
elif t == Gst.MessageType.EOS:
print("End of stream reached.")
else:
print(f"Unexpected message received: {msg}")
pipeline.set_state(Gst.State.NULL)