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 надає обидві як часові позначки в часовій базі потоку.