Ang B-frame ay isang video frame na maaaring gumamit ng parehong naunang frame at kasunod na frame para mabuo ang larawan nito. Ang B ay nangangahulugang bidirectional. Nagbibigay ang B-frames ng mas maraming compression kaysa sa ibang uri ng frame, na tumutulong para manatiling maliit ang video.
Sa metadata ng isang video file, maaari kang makakita ng field na tinatawag na Has B Frames, na isinusulat din bilang has_b_frames. Mukhang oo o hindi ang sagot, pero numero ang value nito. Sinasabi ng numerong ito kung ilang frame ang kailangang manatili sa memory ng decoder para maipakita ang video sa tamang pagkakasunod-sunod.
Paano naiiba ang B-frames sa I-frames at P-frames
Karaniwang gumagana ang video compression sa pamamagitan ng paghahambing ng mga frame at pagrekord ng mga pagkakaiba sa pagitan ng mga ito. Sa MPEG-2 video, mayroong 3 uri ng frame:
- I-frame: naka-encode na hindi umaasa sa ibang frame, kaya puwedeng magsimula ang decoding dito
- P-frame: maaaring gumamit ng naunang I-frame o P-frame
- B-frame: maaaring gumamit ng naunang at kasunod na I-frame o P-frame
Maaaring umasa ang isang B-frame sa frame na mas huli sa oras, kaya kailangang i-store muna ang frame na iyon. Dahil dito, naiiba ang pagkakasunod-sunod ng pag-store kumpara sa nakikita mo sa screen. Ganito ang isang tipikal na MPEG-2 sequence:
- Display order:
B1 B2 I3 B4 B5 P6 B7 B8 P9 B10 B11 P12 - Stored order:
I3 B1 B2 P6 B4 B5 P9 B7 B8 P12 B10 B11
Kung ano ang hitsura ng mga halaga
Ang Has B Frames ay isang buung-buong numero. Inilalarawan ito ng FFmpeg bilang laki ng frame reordering buffer sa decoder. Para sa MPEG-2 video, nagbibigay ang FFmpeg ng 2 value:
0: low delay na video na may I-frames at P-frames lang1: video na may I-frames, P-frames, at B-frames
Maaaring panatilihin din ng mga H.264 at HEVC encoder ang ilang B-frame bilang reference para sa ibang frame. Ipinapakita ng mga test file ng FFmpeg para sa H.264 kung paano nito binabago ang value. Ipinapakita ng mga filename ang encoder settings:
- Pinakamataas na 3 B-frame nang sunod-sunod, walang ginagamit bilang reference:
1 - Pinakamataas na 3 B-frame nang sunod-sunod, may ilang ginagamit bilang reference:
2 - Pinakamataas na 4 B-frame nang sunod-sunod, may ilang ginagamit bilang reference:
2
Ibig sabihin, hindi bilang ng B-frame ang value. Ipinapakita ng program na ffprobe ang uri ng bawat frame bilang value ng pict_type: I, P, o B. Ibinibigay ng field na NB Frames ang bilang ng mga frame, pero hindi ang mga uri nito.
Kung saan nagmumula ang halaga
Galing ang pangalan ng field sa FFmpeg, kung saan ang program na ffprobe ay nagpi-print ng has_b_frames para sa mga video stream. Maaaring ilagay mismo ng H.264 stream ang numerong ito sa header nito. Kung hindi ito nakasaad sa header, kinukuwenta ito ng FFmpeg mula sa mga frame at sa mga oras ng mga ito.
Ang encoder settings ang nagdedesisyon kung gagamit ang video ng B-frames. Sa FFmpeg at sa Microsoft H.264 encoder, ang setting na 0 ay nag-o-off ng B-frames.
Aling mga file ang may taglay nito
Umiiral lang ang field para sa mga video stream. Makikita mo ang field para sa video sa mga MP4, MOV, MKV, WebM, at AVI file. Ang isang MOV file na may reordered na mga frame ay nag-i-store din ng table na naglalaman ng oras sa pagitan ng decoding at display para sa bawat frame.
Ang codec ang nagdedesisyon kung posible ang B-frames. Maaaring gumamit ng B-frames ang MPEG-2 video at ang H.264 Main profile, pero hindi ang H.264 Baseline profile. Walang B-frames ang VP8, isang codec na ginagamit sa mga WebM file, dahil hindi kailanman ipinapredict ang mga frame nito mula sa mas huling mga frame.
Bakit ito mahalaga
Nakakatulong ang B-frames para manatiling maliit ang isang video, pero nagdaragdag ito ng delay. Kailangang i-reorder ng encoder ang mga frame bago i-store ang mga ito, at nakadepende ang delay na ito sa bilang ng magkakasunod na B-frame.
Ang reordered na video ay may 2 magkaibang oras para sa bawat frame: kung kailan ide-decode ang frame at kung kailan ito ipapakita. Ibinibigay ng FFmpeg ang pareho bilang mga timestamp sa time base ng stream.