Słownik

Czym są klatki B w wideo?

Klatka B to klatka wideo, która może wykorzystywać zarówno wcześniejszą, jak i późniejszą klatkę. Dowiedz się, jak działają klatki B i co oznacza wartość Has B Frames w Twoim pliku.

b-frames

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-frames
  • 1: 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.