В эпоху, когда видео становится доминирующим форматом данных — от стриминговых сервисов и удаленных рабочих мест до генеративного ИИ и систем видеонаблюдения — требования к эффективности обработки медиа растут экспоненциально. Разработчики сталкиваются с дилеммой: как обеспечить высокое качество изображения при минимальных затратах вычислительных ресурсов и пропускной способности? Ответ на этот вопрос часто кроется в оптимизации видео-пайплайнов на уровне аппаратного обеспечения. NVIDIA, являясь лидером в области GPU-вычислений, продолжает совершенствовать свои инструменты для разработчиков. Свежее обновление, NVIDIA Video Codec SDK 13.1, представляет собой не просто набор мелких исправлений, а фундаментальный сдвиг в подходах к кодированию, декодированию и транскодированию видео. В этой статье мы подробно разберем, что нового предлагает SDK, как эти функции работают «под капотом» и почему они критически важны для современных AI-приложений и систем видеостриминга.
Особое внимание в этой версии уделено поддержке нового кодека AV1, который становится отраслевым стандартом благодаря своей эффективности. Но это лишь верхушка айсберга. SDK 13.1 вводит концепцию «zero-copy» транскодирования, что кардинально меняет архитектуру обработки видео, снижая нагрузку на GPU. Кроме того, появляются инструменты для точного доступа к кадрам, что открывает новые возможности для машинного обучения и видеомонтажа. Давайте погрузимся в детали этих инноваций.
01Кодирование: Эра AV1 и иерархические B-кадры
Одним из самых значимых нововведений в SDK 13.1 является полная поддержка Hierarchical Reference Mode для кодека AV1. Чтобы понять важность этого изменения, нужно вспомнить, как работают B-кадры (bidirectional frames). B-кадры используют информацию из предыдущих и последующих кадров для сжатия, что позволяет значительно уменьшить размер файла без потери качества. Однако традиционные реализации часто ограничивали использование B-кадров в качестве опорных (reference) кадров, что ограничивало потенциал сжатия.
Иерархический режим референса решает эту проблему, выстраивая B-кадры в древовидную структуру. В этой структуре листовые узлы — это обычные B-кадры, не используемые для референса, а корнем дерева выступает средний B-кадр, который служит опорным для других. Такая архитектура позволяет NVENC (NVIDIA Video Encoder) увеличивать максимальное количество B-кадров в группе кадров (GOP) с 7 до 31. Это дает кодировщику гораздо больше свободы для выявления временной избыточности в видео, что напрямую влияет на качество картинки при том же битрейте или, что более важно, снижает битрейт при сохранении качества.
Эффективность нового режима наглядно демонстрируется на графиках节省 битрейта. При использовании режима Constant Quality (CQ) с 15 B-кадрами и пресетом p7 (High Quality tuning), наблюдается существенное снижение необходимого битрейта по сравнению с предыдущими настройками. Аналогичная картина наблюдается и в режиме Variable Bitrate (VBR). Это означает, что разработчики стриминговых сервисов могут либо экономить трафик пользователей, либо значительно улучшать качество изображения при фиксированной пропускной способности канала.
UHQ Tuning и итеративное кодирование
Помимо AV1, NVIDIA объединила две мощные функции: UHQ (Ultra High Quality) Tuning Info и итеративное кодирование. Итеративное кодирование, введенное в предыдущих версиях, позволяет «заморозить» автоматическое продвижение состояния кодировщика. Это дает разработчику возможность перекодировать один и тот же кадр с разными параметрами, после чего NVENC может зафиксировать состояние на любом из этапов. Это полезно для тонкой настройки качества.
UHQ Tuning Info, в свою очередь, комбинирует уровень предварительного просмотра (lookahead) и временную фильтрацию. Временная фильтрация использует оценку движения для поиска похожих участков в соседних кадрах и применяет их для фильтрации текущего кадра, что снижает шум и дает прирост эффективности кодирования на 4–5% для натурального видео. Lookahead анализирует будущие кадры, используя блоки кодирования (CTU) и другую статистику, чтобы оптимально распределять биты для контроля скорости передачи данных.
В SDK 13.1 эти технологии работают вместе. Теперь предварительный просмотр и временная фильтрация доступны в рамках итеративного процесса. Это позволяет достигать компромисса между качеством и производительностью, который ранее был недостижим, особенно в сценариях, где есть задержка (latency-tolerant encoding), например, при записи игр или создании контента.

02Декодирование: Статистика на уровне макроблоков
Для разработчиков систем видеонаблюдения, аналитики видео и AI-моделей, работающих с видео, декодирование — это не просто превращение битов в пиксели. Это источник ценных метаданных. В SDK 13.1 API NVDECODE был расширен для предоставления детальной статистики декодирования на уровне макроблоков для форматов H.264 и HEVC (H.265).
Теперь, для каждого блока 16x16 декодированного кадра, приложение может получить доступ к следующим данным:
- Параметр квантования (QP) яркости: Показывает, насколько сильно был сжат данный блок. Высокий QP может указывать на области с потерей качества или сложным движением.
- Тип кодирования единицы: Является ли блок Intra (внутренний), Inter (межкадровый), Skip (пропущенный) или PCM (прямая передача кода). Это критически важно для анализа структуры видео.
- Векторы движения: До двух векторов (прямых и обратных), которые описывают, как блок переместился относительно других кадров.
Ключевое преимущество здесь — отсутствие дополнительной нагрузки на CPU. Эти данные извлекаются как побочный продукт аппаратного декодирования. Это открывает путь к GPU-ускоренной аналитике видео. Например, векторы движения можно использовать для обнаружения смены сцены, отслеживания объектов или анализа границ кадров. Значения QP позволяют проводить мониторинг качества в реальном времени и адаптировать битрейт. Типы макроблоков полезны для классификации контента и исследований в области сжатия.

cuvidGetDecoderCaps(), включают сбор статистики при создании декодера и получают буфер статистики, residing в GPU, с каждым декодированным кадром через cuvidMapVideoFrame(). Эти данные можно скопировать в память хоста или обработать напрямую на GPU с помощью CUDA-ядер для конвейеров реального времени. В SDK есть готовый пример AppDec -dumpstats.03Точный поиск кадров (Frame-Accurate Seek)
В традиционных видео-пайплайнах декодирование часто идет последовательно. Однако современные AI-пайплайны, такие как обнаружение объектов, модерация контента, суммаризация видео или подготовка обучающих выборок, часто нуждаются не в последовательном просмотре, а в случайном доступе к конкретным кадрам. То же самое касается систем нелинейного видеомонтажа.
SDK 13.1 представляет комплексный API для поиска и случайного доступа к кадрам через класс NvVideoDecoder. Теперь доступ к конкретному кадру так же прост, как индексация массива. За этим стоит архитектура, aware к GOP (Group of Pictures). Когда запрашивается кадр N, SDK находит ближайший кадр IDR (Instantaneous Decoder Refresh) перед ним, перемещает демуксер туда и сбрасывает состояние декодера через CUVID_PKT_DISCONTINUITY.
С этого момента IDR декодер обрабатывает только те кадры, которые необходимы для достижения кадра N. Парсер помечает и пропускает нереперные кадры, а реперные кадры декодируются, но пропускают этап маппинга и постобработки (конвертация формата, масштабирование, кадрирование) через фильтрацию на основе PTS (Presentation Time Stamp). Только целевой кадр N проходит полный конвейер декодирования, маппинга и постобработки.

Класс NvVideoDecoder оборачивает низкоуровневый движок SeekUtils и предоставляет чистый интерфейс на основе операторов. Это решение поддерживает кэширование декодеров для плейлистов, работу с потоками, не поддерживающими поиск (элементарные потоки, сетевые потоки), гибкое указание кадров (индексы, диапазоны, временные метки) и поддержку Open GOP (поиск к ближайшему IDR, а не просто к ключевому кадру).

04Стереоскопическое видео и MV-HEVC
Для разработчиков, работающих с 3D-видео и виртуальной реальностью, SDK 13.1 приносит улучшения в поддержку MV-HEVC (Multiview High Efficiency Video Coding). Теперь декодер выводит информацию о виде и слое, такую как nuh_layer_id, что позволяет приложениям идентифицировать и маршрутизировать кадры по видам для обработки стереоскопического видео.
Также расширена поддержка битстримов MV-HEVC, созданных сторонними кодировщиками, что обеспечивает корректное воспроизведение левого и правого видов. На стороне кодирования улучшена совместимость с FFmpeg: метаданные 3D-дисплея теперь корректно появляются в битстриме, что упрощает создание 3D-видео. Кроме того, добавлена поддержка Split Frame Encoding (SFE), позволяющая нескольким кодировщикам работать над одним кадром, что ускоряет обработку высококачественного 3D и XR-видео, превышающего возможности одного кодировщика.
05Транскодирование: Модульная архитектура и Zero-Copy
Самым архитектурным прорывом в SDK 13.1 является переработка конвейера транскодирования. Старые примеры были быстрыми, но монолитными, что затрудняло их модификацию. Новая версия строится на строго модульной, основанной на очередях архитектуре. Это гарантирует конкурентность, упрощает кастомизацию и максимизирует использование оборудования.
Новая архитектура выделяет выделенный поток CPU для каждого этапа конвейера, работая как система производитель-потребитель. Потоки общаются через явно заданные входные и выходные очереди. Основной конвейер AppTrans разбивается на четыре изолированных контекста выполнения:
- Decode Thread (NVDEC): Демуксинг и декодирование.
- Compute Thread (CUDA): Обработка и фильтрация.
- Encode Thread (NVENC): Кодирование.
- Output Thread: Сбор выходных данных и мультиплексирование.

Каждый поток изолирует один шаг, создавая развязанный дизайн, который обрабатывает синхронизацию нативно. Кадры проходят через очереди последовательно, обеспечивая безопасный поток данных. Это позволяет разработчикам копировать и настраивать только те шаги конвейера, которые им нужны. Например, если нужно только кодирование, можно удалить поток декодирования и напрямую подавать данные в очереди обработки и кодирования. Если нужна ультра-низкая задержка, можно уменьшить размеры очередей.
Zero-Copy Transcode с CUarray
Особого внимания заслуживает новый пример AppTransZeroCopy. В традиционном пайплайне декодированный кадр проходит через несколько внутренних конвертаций форматов и копий, прежде чем достичь кодировщика. Декодер преобразует вывод в поверхность, доступную приложению; приложение копирует ее в буфер ввода кодировщика; кодировщик снова преобразует этот ввод в требуемый формат. Эти шаги создают накладные расходы на использование SM (Streaming Multiprocessors) и пропускную способность памяти.
AppTransZeroCopy устраняет эту цепочку копий, заставляя NVDEC и NVENC работать напрямую с одной и той же памятью GPU в формате, который оба движка понимают нативно. Механизм состоит из четырех частей:
- Выделение пула общих буферов: Приложение выделяет пул CUDA-массивов (
CUarray) с флагомCUDA_ARRAY3D_VIDEO_ENCODE_DECODE, указывая драйверу, что эти поверхности будут использоваться обоими видео-кодеками. - Двойная регистрация: Один и тот же
CUarrayрегистрируется в обоих кодеках. Для декодера они предоставляются как внешние выходные поверхности, а для кодировщика — как входные ресурсы. - Конвейерное выполнение: Три потока (декодирование, кодирование, вывод) соединены через конкурентные очереди с управлением потоком на основе токенов.
- Синхронизация на основе потоков: NVDEC и NVENC используют один и тот же CUDA-поток, гарантируя правильный порядок между записями декодера и чтениями кодировщика без явной CPU-GPU синхронизации.
Преимущества очевидны: меньшее использование SM, снижение потребления видеопамяти и более высокая пропускная способность при одновременных сессиях. Графики использования SM и пропускной способности памяти показывают значительное улучшение по сравнению с традиционным пайплайном.
06Что это значит на практике
Для разработчиков, работающих с видео на базе NVIDIA GPU, SDK 13.1 открывает новые горизонты. Если вы строите сервис стриминга, поддержка AV1 с 31 B-кадром и UHQ-тюнингом позволит вам снизить затраты на пропускную способность, сохраняя высокое качество. Для AI-разработчиков возможность получать статистику макроблоков на GPU и выполнять точный поиск кадров по видеофайлам ускорит обучение моделей и инференс, так как отпадает необходимость в CPU-парсинге битстримов и последовательном декодировании.
Архитектурные изменения в транскодировании, особенно zero-copy режим, делают создание кастомных видео-пайплайнов с AI-фильтрами (например, апскейлинг или удаление фона в реальном времени) значительно более эффективным. Разработчики могут интегрировать свои CUDA-ядра в конвейер без страха, что они станут узким местом из-за лишних копий данных. Наконец, официальная Docker-среда разработки, упомянутая в обновлениях, упрощает развертывание и тестирование этих сложных пайплайнов в облачных и локальных средах.
В целом, NVIDIA Video Codec SDK 13.1 — это шаг в сторону более гибкой, эффективной и интеллектуальной обработки видео, где GPU становится не просто ускорителем, а полноценным процессором медиаданных.
Источник: NVIDIA Developer ↗
