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) | Макс. битрейт |
|---|---|---|---|
| 1 | 128x96 | 15 | 64 Кбит/с |
| 2 | 320x240 | 30 | 2 Мбит/с |
| 3 | 720x480 | 60 | 20 Мбит/с |
| 4 | 1920x1080 | 50 | 40 Мбит/с |
| 5 | 4096x2304 | 72 | 135 Мбит/с |
| 6 | 7680x4320 | 120 | 300 Мбит/с |
Таблица 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 продолжает оставаться популярным по нескольким причинам:
- Широкая поддержка: H.264 поддерживается практически всеми устройствами и платформами, начиная от смартфонов и заканчивая телевизорами и профессиональными камерами.
- Совместимость: Большинство существующих аппаратных решений оптимизировано под работу с H.264, что делает его удобным выбором для разработчиков.
- Производительность: Несмотря на то, что современные кодеки предлагают лучшее качество при меньшем битрейте, они требуют больше ресурсов для обработки, что может быть критично для старых устройств.
- Стоимость лицензий: Хотя использование 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), для дополнительной компрессии.
Недостатки:
- Проприетарный кодек: есть лицензионные ограничения, действующие до 2028 года.
- Ограниченная эффективность: По сравнению с новыми кодеками, такими как H.265 и AV1, H.264 менее эффективен в плане сжатия при высоком разрешении и битрейтах.
- Ресурсоемкость: Хотя 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.