B-frame to klatka wideo, która może używać zarówno wcześniejszej, jak i późniejszej klatki do zbudowania obrazu. B oznacza bidirectional, czyli dwukierunkowy. B-frames zapewniają większą kompresję niż inne typy klatek, co pomaga zmniejszyć rozmiar wideo.
W metadanych pliku wideo możesz zobaczyć pole Has B Frames, zapisywane też jako has_b_frames. Nazwa sugeruje odpowiedź tak/nie, ale wartością jest liczba. Ta liczba mówi, ile klatek dekoder musi móc trzymać w pamięci, aby wyświetlić wideo we właściwej kolejności.
Czym B-ramki różnią się od I-ramek i P-ramek
Kompresja wideo zazwyczaj działa przez porównywanie klatek i zapisywanie różnic między nimi. Wideo MPEG-2 definiuje 3 typy klatek:
- I-frame: kodowana bez odwołań do innych klatek, więc dekodowanie może się tu rozpocząć
- P-frame: może używać poprzedniej I-frame lub P-frame
- B-frame: może używać poprzedniej i następnej I-frame lub P-frame
B-frame może zależeć od klatki, która pojawia się później w czasie, więc ta późniejsza klatka musi zostać zapisana jako pierwsza. Kolejność zapisu różni się więc od kolejności, którą widzisz na ekranie. Typowa sekwencja MPEG-2 wygląda tak:
- Kolejność wyświetlania:
B1 B2 I3 B4 B5 P6 B7 B8 P9 B10 B11 P12 - Kolejność zapisu:
I3 B1 B2 P6 B4 B5 P9 B7 B8 P12 B10 B11
Jak wyglądają wartości
Has B Frames jest liczbą całkowitą. FFmpeg opisuje tę wartość jako rozmiar bufora zmiany kolejności klatek w dekoderze. Dla wideo MPEG-2 FFmpeg podaje 2 wartości:
0: wideo o małym opóźnieniu, tylko z I-frames i P-frames1: wideo z I-frames, P-frames i B-frames
Enkodery H.264 i HEVC mogą też zachowywać niektóre B-frames jako odniesienia dla innych klatek. Pliki testowe FFmpeg dla H.264 pokazują, jak wpływa to na wartość. Nazwy plików wskazują ustawienia enkodera:
- Maksymalnie 3 B-frames z rzędu, żadna nie jest zachowana jako odniesienie:
1 - Maksymalnie 3 B-frames z rzędu, część zachowana jako odniesienia:
2 - Maksymalnie 4 B-frames z rzędu, część zachowana jako odniesienia:
2
Wartość nie jest więc liczbą B-frames. Program ffprobe pokazuje typ każdej klatki jako wartość pict_type: I, P lub B. Pole NB Frames podaje liczbę klatek, ale nie ich typy.
Skąd pochodzi wartość
Nazwa pola pochodzi z FFmpeg, którego program ffprobe wypisuje has_b_frames dla strumieni wideo. Strumień H.264 może podać tę liczbę w swoim nagłówku. Jeśli nagłówek jej nie podaje, FFmpeg wylicza ją na podstawie klatek i ich czasów.
Ustawienia enkodera decydują o tym, czy wideo używa B-frames. W FFmpeg i w enkoderze Microsoft H.264 ustawienie 0 wyłącza B-frames.
Które pliki to zawierają
Pole istnieje tylko dla strumieni wideo. Możesz zobaczyć to pole dla wideo w plikach MP4, MOV, MKV, WebM i AVI. Plik MOV z przestawioną kolejnością klatek zapisuje też tabelę z czasem między dekodowaniem a wyświetleniem każdej klatki.
Kodek decyduje, czy B-frames są możliwe. Wideo MPEG-2 i profil H.264 Main mogą ich używać, ale profil H.264 Baseline nie może. VP8, kodek używany w plikach WebM, nie ma B-frames, ponieważ jego klatki nigdy nie są przewidywane z późniejszych klatek.
Dlaczego ma to znaczenie
B-frames pomagają zmniejszyć rozmiar wideo, ale dodają opóźnienie. Enkoder musi przestawić kolejność klatek przed ich zapisaniem, a to opóźnienie zależy od liczby B-frames z rzędu.
Wideo z przestawioną kolejnością ma też 2 różne czasy dla każdej klatki: kiedy ją zdekodować i kiedy ją wyświetlić. FFmpeg podaje oba jako znaczniki czasu w bazie czasu strumienia.