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

H264

H.264, также известный как MPEG-4 Part 10 AVC (Advanced Video Coding), является одним из самых популярных стандартов сжатия видео. Он был стандартизирован ITU-T в 2003 году и стал основой для множества приложений, связанных со стримингом, хранением и передачей видео.

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

  • Профили: H.264 поддерживает несколько профилей, таких как Baseline, Main, Extended, High, High 10, High 4:2:2 и High 4:4:4. Каждый профиль предлагает разные уровни функциональных возможностей и требований к декодеру.
  • Контроль качества: Поддержка CBR (Constant Bit Rate), VBR (Variable Bit Rate) и ABR (Average Bit Rate).
  • Поддерживаемые разрешения: От QCIF (176x144) до 8K UHD (8192x4320).
  • Частота кадров: До 120 FPS.
  • Цветовые форматы: YUV 4:2:0, 4:2:2, 4:4:4.
  • Потоковая передача: Поддерживает потоковую передачу по HTTP, RTSP, RTP/RTCP и другим сетевым протоколам.

Уровни и профили H.264

Таблица 1. Уровни и профили H.264 с их основными характеристиками:

УровеньМакс. разрешениеЧастота кадров (FPS)Макс. битрейт
1128x961564 Кбит/с
2320x240302 Мбит/с
3720x4806020 Мбит/с
41920x10805040 Мбит/с
54096x230472135 Мбит/с
67680x4320120300 Мбит/с

Таблица 2. Профили H.264 с их основными характеристиками:

ПрофильОписание
Baseline ProfileПодходит для мобильных устройств и веб-камер. Поддерживает I и P кадры, без B-кадров.
Main ProfileРасширяет функционал Baseline, добавляя поддержку B-кадров. Часто используется в телевизионном вещании.
Extended ProfileВключает дополнительные функции для улучшения производительности при передаче по каналам с потерями.
High ProfileСамый распространенный профиль, используемый в большинстве приложений, включая Blu-ray и стриминговые сервисы. Поддерживает 8x8 трансформацию и расширенный диапазон квантования.
High 10 ProfileДобавляет поддержку 10-битной глубины цвета.
High 4:2:2 ProfileПоддерживает субдискретизацию 4:2:2, что важно для профессионального использования.
High 4:4:4 Predictive ProfileПолностью поддерживает субдискретизацию 4:4:4, обеспечивая наилучшее качество для профессиональных применений.

Применение:

  • Стриминг видео: CDN и видеоплатформы используют H.264 для передачи видео.
  • Видеоконференции: Cервисы видеосвязи часто применяют H.264.
  • Хранение видео: Используется для записи и хранения видео на DVD, Blu-ray и других носителях.
  • Телевидение: Применяется в цифровом телевидении, включая кабельное, спутниковое и эфирное вещание.

Почему H.264 все еще используется?

Несмотря на появление новых кодеков, таких как H.265 (HEVC), AV1 и VP9, H.264 продолжает оставаться популярным по нескольким причинам:

  1. Широкая поддержка: H.264 поддерживается практически всеми устройствами и платформами, начиная от смартфонов и заканчивая телевизорами и профессиональными камерами.
  2. Совместимость: Большинство существующих аппаратных решений оптимизировано под работу с H.264, что делает его удобным выбором для разработчиков.
  3. Производительность: Несмотря на то, что современные кодеки предлагают лучшее качество при меньшем битрейте, они требуют больше ресурсов для обработки, что может быть критично для старых устройств.
  4. Стоимость лицензий: Хотя использование H.264 требует лицензионных отчислений, многие компании уже привыкли работать с этим кодеком и готовы платить за лицензию ради стабильности и совместимости.

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

H.265 (HEVC)
  • Эффективность сжатия: HEVC обеспечивает примерно вдвое большую эффективность сжатия по сравнению с H.264 при том же качестве видео.
  • Требования к ресурсам: Требует значительно больше вычислительной мощности для кодирования и декодирования.
  • Применение: Используется в 4K-телевизорах, Ultra HD Blu-ray и некоторых сервисах стриминга.
AV1
  • Эффективность сжатия: Обеспечивает на 30% лучшую компрессию по сравнению с H.265 при схожем качестве.
  • Скорость работы: Медленнее H.265 и H.264 в плане кодирования, но быстрее в декодировании.
VP9
  • Эффективность сжатия: Лучше, чем у H.264, но уступает H.265 и AV1.

Алгоритм кодирования:

Алгоритм кодирования H.264 основан на блочном предсказании движения (motion estimation) и компенсации движения (motion compensation). Ключевыми элементами являются:

  • Макроблоки: Разделение кадра на блоки размером 16x16 пикселей для анализа движения.
  • Интрапредсказание: Использование информации внутри текущего кадра для предсказания значений пикселей.
  • Интерпредсказание: Использование информации из соседних кадров для предсказания движений объектов.
  • Трансформация: Преобразование блоков данных с использованием дискретного косинусного преобразования (DCT) для уменьшения избыточности.
  • Квантование: Квантизация коэффициентов DCT для дальнейшего сжатия.
  • Энтропийное кодирование: Использование методов энтропийного кодирования, таких как CABAC (Context-Adaptive Binary Arithmetic Coding) и CAVLC (Context-Adaptive Variable-Length Coding), для дополнительной компрессии.

Недостатки:

  1. Проприетарный кодек: есть лицензионные ограничения, действующие до 2028 года.
  2. Ограниченная эффективность: По сравнению с новыми кодеками, такими как H.265 и AV1, H.264 менее эффективен в плане сжатия при высоком разрешении и битрейтах.
  3. Ресурсоемкость: Хотя H.264 менее требователен к ресурсам, чем H.265, он все равно требует значительных вычислительных мощностей для кодирования и декодирования.

Пример кодирования через FFmpeg и GStreamer:

FFmpeg
ffmpeg -i input.mp4 -c:v libx264 -preset medium -crf 23 output.mp4

Здесь libx264 указывает на использование библиотеки x264 для кодирования видео в формат H.264, -preset medium устанавливает средний уровень предустановленных параметров, а -crf 23 определяет постоянный коэффициент качества (CRF).

GStreamer
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")
decoder = Gst.ElementFactory.make("decodebin", "decoder")
encoder = Gst.ElementFactory.make("x264enc", "encoder")
muxer = Gst.ElementFactory.make("mp4mux", "muxer")
sink = Gst.ElementFactory.make("filesink", "sink")

source.set_property("location", "input.mp4")
sink.set_property("location", "output.mp4")

pipeline.add(source, decoder, encoder, muxer, sink)

link_elements = [
source.link(decoder),
encoder.link(muxer),
muxer.link(sink)
]

if not all(link_elements):
print("Failed to link elements!")
else:
pipeline.set_state(Gst.State.PLAYING)
Gst.debug_bin_to_dot_file(pipeline, Gst.DebugGraphDetails.ALL, "h264_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}")
elif t == Gst.MessageType.EOS:
print("End of stream reached.")
else:
print(f"Unexpected message received: {msg.type}")

pipeline.set_state(Gst.State.NULL)

Этот скрипт использует библиотеку GStreamer для создания конвейера, который считывает файл input.mp4, декодирует его, перекодирует в H.264 с помощью элемента x264enc, мультиплексирует результат в контейнер MP4 и сохраняет его в файл output.mp4.