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

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 продолжает использоваться благодаря следующим причинам:

  1. Совместимость: Широкая поддержка среди устройств и программного обеспечения.
  2. Простота реализации: Легче реализовать и поддерживать, чем более сложные стандарты.
  3. Широкий спектр применения: Подходит для различных сценариев использования, включая интернет-видео, цифровое телевидение и мобильные устройства.

Сравнение с другими кодеками:

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 включает следующие этапы:

  1. Преобразование цвета: Из YCbCr в RGB.
  2. Разбиение на макроблоки: Кадр разбивается на блоки размером 16x16 пикселей.
  3. Внутрикадровая компрессия: Использование дискретного косинусного преобразования (DCT) для уменьшения избыточности внутри каждого блока.
  4. Межкадровое предсказание: Использование предыдущих кадров для предсказания текущего кадра.
  5. Квантование: Уменьшение количества уровней яркости и цвета для дальнейшего сжатия.
  6. Энтропийное кодирование: Использование Хаффмана или арифметического кодирования для минимизации размера данных.

Отличие от других кодеков:

  • 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)