Từ điển

B-Frame trong video là gì?

B-frame là một khung hình video có thể sử dụng cả một khung hình trước đó và một khung hình sau đó. Tìm hiểu cách B-frame hoạt động và ý nghĩa của giá trị Has B Frames trong tệp của bạn.

b-frames

B-frame là một khung hình video có thể dùng cả một khung hình trước đó và một khung hình sau đó để dựng ảnh. B là viết tắt của "bidirectional" (hai chiều). B-frame mang lại khả năng nén dữ liệu cao hơn so với các loại khung hình khác, giúp video nhỏ hơn.

Trong metadata của tệp video, bạn có thể thấy một trường tên là Has B Frames, cũng được ghi là has_b_frames. Tên trường gợi ý câu trả lời có hoặc không, nhưng giá trị thực tế là một con số. Con số này cho biết bộ giải mã phải giữ được bao nhiêu khung hình trong bộ nhớ để hiển thị video theo đúng thứ tự.

Sự khác nhau giữa B-frame, I-frame và P-frame

Việc nén video nói chung hoạt động bằng cách so sánh các khung hình và ghi lại sự khác biệt giữa chúng. Video MPEG-2 định nghĩa 3 loại khung hình sau:

  • I-frame: được mã hóa không tham chiếu các khung hình khác, nên có thể bắt đầu giải mã từ đây
  • P-frame: có thể dùng I-frame hoặc P-frame liền trước
  • B-frame: có thể dùng I-frame hoặc P-frame liền trước và liền sau

Một B-frame có thể phụ thuộc vào một khung hình xuất hiện muộn hơn về mặt thời gian, nên khung hình đến sau đó phải được lưu trữ trước. Vì vậy, thứ tự lưu trữ khác với thứ tự bạn thấy trên màn hình. Một chuỗi MPEG-2 điển hình trông như sau:

  • Thứ tự hiển thị: B1 B2 I3 B4 B5 P6 B7 B8 P9 B10 B11 P12
  • Thứ tự lưu trữ: I3 B1 B2 P6 B4 B5 P9 B7 B8 P12 B10 B11

Giá trị trông như thế nào

Has B Frames là một số nguyên. FFmpeg mô tả giá trị này là kích thước bộ đệm sắp xếp lại khung hình trong bộ giải mã. Với video MPEG-2, FFmpeg nêu 2 giá trị:

  • 0: video độ trễ thấp, chỉ có I-frame và P-frame
  • 1: video có I-frame, P-frame và B-frame

Bộ mã hóa H.264 và HEVC cũng có thể giữ một số B-frame làm khung hình tham chiếu cho các khung hình khác. Các tệp thử nghiệm H.264 của FFmpeg cho thấy điều này làm thay đổi giá trị như thế nào. Tên tệp thể hiện thiết lập của bộ mã hóa:

  • Tối đa 3 B-frame liên tiếp, không B-frame nào được giữ làm tham chiếu: 1
  • Tối đa 3 B-frame liên tiếp, một số được giữ làm tham chiếu: 2
  • Tối đa 4 B-frame liên tiếp, một số được giữ làm tham chiếu: 2

Vì vậy giá trị này không phải là số lượng B-frame. Chương trình ffprobe hiển thị loại của từng khung hình bằng giá trị pict_type: I, P hoặc B. Trường NB Frames cho biết số khung hình, nhưng không cho biết loại của chúng.

Giá trị đến từ đâu

Tên trường xuất phát từ FFmpeg, trong đó chương trình ffprobe in has_b_frames cho các luồng video. Một luồng H.264 có thể ghi trực tiếp con số này trong header của nó. Nếu header không ghi, FFmpeg sẽ suy ra từ các khung hình và thời điểm của chúng.

Thiết lập của bộ mã hóa quyết định video có dùng B-frame hay không. Trong FFmpeg và bộ mã hóa Microsoft H.264, thiết lập 0 sẽ tắt B-frame.

Những tệp nào chứa nó

Trường này chỉ tồn tại cho luồng video. Bạn có thể thấy trường này cho video trong các tệp MP4, MOV, MKV, WebM và AVI. Tệp MOV có sắp xếp lại khung hình cũng lưu một bảng chứa khoảng thời gian giữa giải mã và hiển thị cho từng khung hình.

Codec quyết định B-frame có được phép sử dụng hay không. Video MPEG-2 và H.264 profile Main có thể dùng B-frame, nhưng H.264 profile Baseline thì không. VP8, một codec dùng trong tệp WebM, không có B-frame vì khung hình của nó không bao giờ được dự đoán từ các khung hình đến sau.

Tại sao nó quan trọng

B-frame giúp video nhỏ hơn, nhưng cũng làm tăng độ trễ. Bộ mã hóa phải sắp xếp lại các khung hình trước khi lưu, và độ trễ này phụ thuộc vào số B-frame liên tiếp.

Video bị sắp xếp lại cũng có 2 mốc thời gian khác nhau cho mỗi khung hình: thời điểm giải mã và thời điểm hiển thị. FFmpeg cung cấp cả hai dưới dạng timestamp trong time base của luồng.