B-frame adalah frame video yang dapat menggunakan baik frame sebelumnya maupun frame sesudahnya untuk membentuk gambarnya. B adalah singkatan dari bidirectional. B-frame memberikan lebih banyak kompresi dibanding jenis frame lain, sehingga membantu menjaga ukuran video tetap kecil.
Dalam metadata file video, Anda mungkin melihat bidang bernama Has B Frames, juga ditulis has_b_frames. Namanya seolah meminta jawaban ya atau tidak, tetapi nilainya berupa angka. Angka tersebut memberi tahu berapa banyak frame yang harus dapat disimpan decoder di memori agar video ditampilkan dalam urutan yang benar.
Perbedaan B-frame dengan I-frame dan P-frame
Kompresi video umumnya bekerja dengan membandingkan frame dan mencatat perbedaan di antara frame tersebut. Video MPEG-2 mendefinisikan 3 jenis frame berikut:
- I-frame: dikodekan tanpa merujuk frame lain, sehingga decoding dapat dimulai di sini
- P-frame: dapat menggunakan I-frame atau P-frame sebelumnya
- B-frame: dapat menggunakan I-frame atau P-frame sebelumnya dan sesudahnya
B-frame dapat bergantung pada frame yang datang lebih belakangan dalam waktu, sehingga frame yang lebih belakangan itu harus disimpan terlebih dahulu. Oleh karena itu, urutan penyimpanan berbeda dari urutan yang Anda lihat di layar. Urutan MPEG-2 yang khas seperti ini:
- Urutan tampilan:
B1 B2 I3 B4 B5 P6 B7 B8 P9 B10 B11 P12 - Urutan penyimpanan:
I3 B1 B2 P6 B4 B5 P9 B7 B8 P12 B10 B11
Seperti apa bentuk nilainya
Has B Frames adalah bilangan bulat. FFmpeg menjelaskan nilai ini sebagai ukuran buffer pengurutan ulang frame di decoder. Untuk video MPEG-2, FFmpeg menyebutkan 2 nilai:
0: video dengan delay rendah yang hanya menggunakan I-frame dan P-frame1: video dengan I-frame, P-frame, dan B-frame
Encoder H.264 dan HEVC juga dapat menyimpan beberapa B-frame sebagai referensi bagi frame lain. File uji FFmpeg untuk H.264 menunjukkan bagaimana hal ini mengubah nilainya. Nama file mencantumkan pengaturan encoder:
- Maksimal 3 B-frame berturut-turut, tidak ada yang disimpan sebagai referensi:
1 - Maksimal 3 B-frame berturut-turut, beberapa disimpan sebagai referensi:
2 - Maksimal 4 B-frame berturut-turut, beberapa disimpan sebagai referensi:
2
Jadi nilainya bukan jumlah B-frame. Program ffprobe menampilkan jenis setiap frame sebagai nilai pict_type: I, P, atau B. Bidang NB Frames memberikan jumlah frame, tetapi tidak jenisnya.
Dari mana nilai berasal
Nama bidang ini berasal dari FFmpeg, yang program ffprobe-nya mencetak has_b_frames untuk stream video. Stream H.264 dapat mencantumkan angka ini di headernya sendiri. Jika header tidak mencantumkan angka tersebut, FFmpeg menghitungnya dari frame dan waktunya.
Pengaturan encoder menentukan apakah sebuah video menggunakan B-frame. Di FFmpeg dan di encoder Microsoft H.264, pengaturan 0 mematikan B-frame.
File mana yang membawanya
Bidang ini hanya ada untuk stream video. Anda dapat melihat bidang ini untuk video di file MP4, MOV, MKV, WebM, dan AVI. File MOV dengan frame yang diurutkan ulang juga menyimpan tabel berisi waktu antara decoding dan penayangan untuk setiap frame.
Codec menentukan apakah B-frame memungkinkan. Video MPEG-2 dan profil H.264 Main dapat menggunakannya, tetapi profil H.264 Baseline tidak. VP8, codec yang digunakan dalam file WebM, tidak memiliki B-frame, karena frame-nya tidak pernah diprediksi dari frame yang datang belakangan.
Mengapa ini penting
B-frame membantu menjaga ukuran video tetap kecil, tetapi menambah delay. Encoder harus mengurutkan ulang frame sebelum menyimpannya, dan delay ini bergantung pada jumlah B-frame yang berurutan.
Video dengan pengurutan ulang juga memiliki 2 waktu berbeda untuk setiap frame: kapan frame harus didekode dan kapan harus ditampilkan. FFmpeg memberikan keduanya sebagai timestamp dalam time base stream.