Словарь

Что такое b-кадры в видео?

B-кадр в видео это кадр, который может использовать как предыдущий, так и последующий кадр. Узнайте, как работают B-кадры и что означает значение Has B Frames в вашем файле.

b-frames

B-кадр - это видеокадр, который может использовать и более ранний, и более поздний кадр, чтобы построить свое изображение. B означает bidirectional (двунаправленный). B-кадры дают больше сжатия, чем другие типы кадров, что помогает уменьшить размер видео.

В метаданных видеофайла вы можете увидеть поле с названием Has B Frames, также записываемое как has_b_frames. Название предполагает ответ да или нет, но значением является число. Это число показывает, сколько кадров декодеру нужно уметь держать в памяти, чтобы показать видео в правильном порядке.

Чем b-кадры отличаются от I-кадров и P-кадров

Сжатие видео в общем случае работает за счет сравнения кадров и записи различий между ними. Видео MPEG-2 определяет 3 типа кадров:

  • I-кадр: кодируется без ссылки на другие кадры, поэтому декодирование может начинаться с него
  • P-кадр: может использовать предыдущий I-кадр или P-кадр
  • B-кадр: может использовать предыдущий и следующий I-кадр или P-кадр

B-кадр может зависеть от кадра, который идет позже по времени, поэтому этот более поздний кадр должен быть сохранен первым. Поэтому порядок хранения отличается от порядка, который вы видите на экране. Типичная последовательность MPEG-2 выглядит так:

  • Порядок отображения: B1 B2 I3 B4 B5 P6 B7 B8 P9 B10 B11 P12
  • Порядок хранения: I3 B1 B2 P6 B4 B5 P9 B7 B8 P12 B10 B11

Как выглядят значения

Has B Frames - это целое число. FFmpeg описывает это значение как размер буфера для переупорядочивания кадров в декодере. Для видео MPEG-2 FFmpeg приводит 2 значения:

  • 0: видео с малой задержкой только с I-кадрами и P-кадрами
  • 1: видео с I-кадрами, P-кадрами и B-кадрами

Кодеки H.264 и HEVC также могут сохранять некоторые B-кадры как опорные для других кадров. Тестовые файлы FFmpeg для H.264 показывают, как это меняет значение. Настройки кодера указаны в именах файлов:

  • Не более 3 B-кадров подряд, ни один не используется как опорный: 1
  • Не более 3 B-кадров подряд, некоторые используются как опорные: 2
  • Не более 4 B-кадров подряд, некоторые используются как опорные: 2

Таким образом, это значение не является количеством B-кадров. Программа ffprobe показывает тип каждого кадра как значение pict_type: I, P или B. Поле NB Frames дает количество кадров, но не их типы.

Откуда берется значение

Название поля взято из FFmpeg, где программа ffprobe выводит has_b_frames для видеопотоков. Поток H.264 может указать это число в собственном заголовке. Если в заголовке оно не указано, FFmpeg вычисляет его по самим кадрам и их временным меткам.

Настройки кодера определяют, использует ли видео B-кадры. В FFmpeg и в кодере Microsoft H.264 значение 0 выключает B-кадры.

Какие файлы его содержат

Поле существует только для видеопотоков. Вы можете увидеть его для видео в файлах MP4, MOV, MKV, WebM и AVI. Файл MOV с переупорядоченными кадрами также хранит таблицу с временем между декодированием и отображением для каждого кадра.

Возможность использования B-кадров определяется кодеком. Видео MPEG-2 и профиль H.264 Main могут использовать их, но профиль H.264 Baseline не может. В кодеке VP8, который используется в файлах WebM, нет B-кадров, так как его кадры никогда не предсказываются из более поздних кадров.

Почему это важно

B-кадры помогают уменьшить размер видео, но добавляют задержку. Кодер должен переупорядочить кадры перед сохранением, и эта задержка зависит от числа B-кадров подряд.

В переупорядоченном видео у каждого кадра есть 2 разных момента времени: когда его нужно декодировать и когда показать. FFmpeg задает оба в виде временных меток во временной базе потока.

Мета-ключи