B-frame คือเฟรมวิดีโอที่สามารถใช้ทั้งเฟรมก่อนหน้าและเฟรมถัดไปเพื่อสร้างภาพของตัวเอง ตัวอักษร B มาจากคำว่า bidirectional B-frame ให้การบีบอัดข้อมูลได้มากกว่าเฟรมประเภทอื่น ซึ่งช่วยให้ไฟล์วิดีโอมีขนาดเล็กลง
ในข้อมูลเมตาของไฟล์วิดีโอ คุณอาจเห็นฟิลด์ที่ชื่อ Has B Frames เขียนได้เป็น has_b_frames ชื่อนี้เหมือนจะตอบได้แค่ใช่หรือไม่ใช่ แต่ค่าที่ได้จริงเป็นตัวเลข ตัวเลขนี้บอกว่าตัวถอดรหัสวิดีโอต้องเก็บเฟรมไว้ในหน่วยความจำกี่เฟรมเพื่อแสดงวิดีโอในลำดับที่ถูกต้อง
ความแตกต่างระหว่าง B-frame กับ I-frame และ P-frame
การบีบอัดวิดีโอมักทำงานโดยการเปรียบเทียบเฟรมและบันทึกเฉพาะส่วนที่ต่างกัน วิดีโอ MPEG-2 กำหนดเฟรมไว้ 3 ประเภทดังนี้:
- I-frame: เข้ารหัสโดยไม่อ้างอิงจากเฟรมอื่น จึงสามารถเริ่มถอดรหัสจากเฟรมนี้ได้
- P-frame: สามารถอ้างอิงจาก I-frame หรือ P-frame ก่อนหน้าได้
- B-frame: สามารถอ้างอิงจาก I-frame หรือ P-frame ทั้งก่อนหน้าและถัดไปได้
B-frame อาจขึ้นอยู่กับเฟรมที่อยู่ถัดไปในเวลา ดังนั้นเฟรมถัดไปนั้นต้องถูกเก็บไว้ก่อน ทำให้ลำดับที่เก็บในไฟล์ต่างจากลำดับที่คุณเห็นบนหน้าจอ ลำดับ 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-frame และ P-frame1: วิดีโอที่มี I-frame, P-frame และ B-frame
ตัวเข้ารหัส H.264 และ HEVC สามารถเก็บ B-frame บางส่วนไว้เป็นเฟรมอ้างอิงสำหรับเฟรมอื่นได้ ไฟล์ทดสอบของ FFmpeg สำหรับ H.264 แสดงให้เห็นว่าการตั้งค่าแบบนี้เปลี่ยนค่าอย่างไร ชื่อไฟล์บอกการตั้งค่าของตัวเข้ารหัสไว้แล้ว:
- มี B-frame ต่อเนื่องกันได้สูงสุด 3 เฟรม โดยไม่มีเฟรมใดถูกเก็บไว้เป็นเฟรมอ้างอิง:
1 - มี B-frame ต่อเนื่องกันได้สูงสุด 3 เฟรม โดยมีบางเฟรมถูกเก็บไว้เป็นเฟรมอ้างอิง:
2 - มี B-frame ต่อเนื่องกันได้สูงสุด 4 เฟรม โดยมีบางเฟรมถูกเก็บไว้เป็นเฟรมอ้างอิง:
2
ดังนั้นค่านี้จึงไม่ใช่จำนวนของ B-frame โปรแกรม ffprobe แสดงประเภทของแต่ละเฟรมเป็นค่าของ pict_type ได้แก่ I, P หรือ B ฟิลด์ NB Frames ให้จำนวนเฟรมทั้งหมด แต่ไม่บอกประเภทของเฟรม
แหล่งที่มาของค่า
ชื่อนี้มาจาก FFmpeg ซึ่งโปรแกรม ffprobe จะพิมพ์ has_b_frames สำหรับสตรีมวิดีโอ สตรีม H.264 สามารถระบุจำนวนนี้ไว้ในส่วนหัวของตัวเองได้ หากส่วนหัวไม่ระบุตัวเลข FFmpeg จะคำนวณจากเฟรมและเวลาแสดงผล
การตั้งค่าตัวเข้ารหัสเป็นตัวกำหนดว่าวิดีโอจะใช้ B-frame หรือไม่ ใน FFmpeg และในตัวเข้ารหัส Microsoft H.264 หากตั้งค่าเป็น 0 จะเป็นการปิดการใช้ B-frame
ไฟล์ใดที่มีรายการนี้อยู่
ฟิลด์นี้มีเฉพาะในสตรีมวิดีโอเท่านั้น คุณสามารถดูฟิลด์นี้ได้สำหรับวิดีโอในไฟล์ MP4, MOV, MKV, WebM และ AVI ไฟล์ MOV ที่มีการจัดลำดับเฟรมใหม่จะเก็บตารางเวลาระหว่างการถอดรหัสและการแสดงผลของแต่ละเฟรมไว้ด้วย
ตัวแปลงรหัส (codec) เป็นตัวตัดสินว่าสามารถใช้ B-frame ได้หรือไม่ วิดีโอ MPEG-2 และ H.264 โปรไฟล์ Main สามารถใช้ B-frame ได้ แต่ H.264 โปรไฟล์ Baseline ไม่รองรับ VP8 ซึ่งเป็น codec ที่ใช้ในไฟล์ WebM ไม่มี B-frame เพราะเฟรมของมันจะไม่ถูกทำนายจากเฟรมถัดไป
ทำไมมันจึงสำคัญ
B-frame ช่วยให้ไฟล์วิดีโอมีขนาดเล็กลง แต่ทำให้เกิดความหน่วงเพิ่มขึ้น ตัวเข้ารหัสต้องจัดลำดับเฟรมใหม่ก่อนบันทึกลงไฟล์ และความหน่วงนี้ขึ้นอยู่กับจำนวน B-frame ที่ต่อเนื่องกัน
วิดีโอที่มีการจัดลำดับเฟรมใหม่จะมีเวลา 2 แบบสำหรับแต่ละเฟรม คือเวลาที่ต้องถอดรหัสเฟรมและเวลาที่ต้องแสดงผลเฟรมนั้น FFmpeg ให้เวลาทั้งสองแบบเป็น timestamp ในtime base ของสตรีม