Skip to main content

Tản mạn về H264 (2/2)

· 17 min read
Doko
Writer

PHẦN IV: MÃ HÓA VIDEO H264

Trước tiên ta cần hiểu quy trình xử lý video. Ở đây có 2 công đoạn chính là encode (mã hóa) và decode (giải mã) video. Được mô tả như sơ đồ dưới đây. Decoder là chương trình / thiết bị có nhiệm vụ giải nén / giải mã video về dạng chưa nén để có thể xem được (uncompressed). Như đã nói ở trên, H264 là một chuẩn nén, chuẩn những cú pháp để xử lý video cho cả 2 quá trình encode và decode. H264 được xây dựng trên nền tảng MPEG2 và MPEG4 trước nó và có nhiều cải tiến.

proc

Các công đoạn xử lý Encode gồm:

4.1: Prediction (phỏng đoán)

Các encoder xử lý video theo các khối 16×16 pixel. Và đó cũng là lý do tại sao các video hiện nay có chiều ngang và chiều dọc đều là các số chia hết cho 16 để đảm bảo độ nén cao nhất (VD 1280×720, 720×480,…). Vậy đối với những video có độ phân giải không chia hết cho 16? Dòng hoặc cột cuối cùng sẽ được làm giả (clone). Ví dụ video 1920×1080 sẽ được thêm 8 dòng cuối để trở thành 1920×1088, sau đó sẽ chỉ định cho decoder cắt bớt các dòng / cột giả này trong quá trình giải mã (decode). Tiếp theo, các encode xây dựng phỏng đoán (prediction) của các macroblock dựa trên các dữ liệu đã mã hóa trước đó. Có thể là từ frame hiện thời (Intra-prediction) hoặc từ các frame khác (Inter-prediction). Sau đó, encoder sẽ trừ phần phỏng đoán này từ macroblock hiện thời để tạo ra “phần dư” (residual).

Các phương thức phỏng đoán trong H264 linh hoạt hơn các định dạng trước đó, cho ra kết quả phỏng đoán tốt hơn cũng như khả năng nén cao hơn. Intra-prediction sử dụng các block 16×16 và 4×4 để dự đoán các macroblock từ các pixel đã mã hóa xung quanh nó, trong cùng 1 khung hình. Còn Inter-prediction sử dụng kích thước khối (block size) trong một khoảng (từ 16×16 đến 4×4) để dự đoán các pixel trong khung hình hiện thời từ các khung hình trước và cùng nằm trên một vùng tương tự.

macroblock

(Các phương thức phỏng đoán Intra dùng thông tin viền macroblock trong H264)

4.2: Mã hóa dòng bit và lượng tử hóa

Một khối phần dư mẫu được chuyển đổi bằng phương thức chuyển đổi số nguyên 4×4 hoặc 8×8 (một dạng chuyển đổi tương tự chuyển đổi cosin rời rạc) và cho ra một tập các hệ số. Những hệ số này là những định lượng cho một nền chuẩn. Khi kết hợp các khuôn nền chuẩn này sẽ tạo ra những mẫu khối phần dư (residual block).

Quá trình mã hóa video phải tạo ra một số các giá trị cần phải mã hóa để có được dòng bit nén. Các giá trị này bao gồm:

– Hằng số đã lượng tử hóa. – Thông tin cung cấp cho bộ giải mã (decoder) để tạo lại phỏng đoán. – Thông tin về cấu trúc của dữ liệu đã nén, và công cụ sử dụng để nén. – Thông tin về toàn bộ trình tự video. Các giá trị và tham số này được chuyển đổi được chuyển đổi sang dạng nhị phân nhằm phục vụ cho việc lưu trữ và truyền đi. Được thực hiện trong lớp Network Abstraction Layer.

Công đoạn giải mã (decode) video bao gồm các bước như trong sơ đồ:

decode

- Giải mã bitstream:

Bộ giải mã nhận được dòng bit H264, giải mã các thông số và tach ra các thông tin được liệt kê ở phần trên

- Chia lại tỉ lệ và chuyển đổi ngược:

Các hệ số lượng tử được chia lại tỉ lệ. Mỗi hệ số được nhân với một giá trị số nguyên để phục hồi lại kích thước ban đầu. Quá trình chuyển đổi ngược kết hợp các phần nền chuẩn, định lượng lại bằng các thông số đã được chia lại tỉ lệ ở trên, để tạo lại các khối dữ liệu phần dư. Các khối dữ liệu phần dư được kết hợp tiếp, tạo thành các macroblock phần dư. Do mỗi decoder có các cách định lượng và đưa ra giá trị khác nhau nên cùng 1 video, khi giải mã trên các hệ thống / phần mềm khác nhau sẽ cho ra chất lượng hình ảnh có sự khác biệt.

- Tái tạo:

Với mỗi Macroblock, decoder tạo một phần đoán giống như phần đoán tạo ra bởi encoder. Sau đó thêm phần đoán này vào phần dư đã được giải mã để tái tạo macroblock, sử dụng để hiển thị.

4.3: Các loại khung hình

Ở khung Frame Type, ta có các thông số I / B / P Frames, vậy đó là gì?

I Frames (Intra Frames hay Key Frames): Là khung hình lưu trữ toàn bộ hình ảnh “chính”. Giả sử một đoạn video ngắn 3 giây có một hình tròn màu xanh chuyển sang màu đỏ từ 0:00 đến 0:03 thì 2 hình tròn màu xanh và đỏ chính là 2 I-Frames. I Frames cho phép các khung hình khác tham chiếu đến nó.

  • Chỉ loại bỏ các thông tin dư thừa về mặt không gian qua mã hóa Intra-Coding.
  • Dùng các điểm trong cùng một frame để dự báo.
  • Không có bù chuyển động, vì là frame đầu được xử lý của mỗi Group of Pictures.
  • Số lượng bit yêu cầu lớn, vì được mã hóa rõ ràng nhất.

P Frames (Predictive Frames): Khung hình chỉ lưu giữ những gì khác biệt so với khung hình trước nó. Khung hình này có tham khảo (hay tham chiếu – reference) đến khung hình trước. Giả sử: Một cảnh máy quay cố định một trạm xăng, nhưng có một chiếc xe hơi chạy qua. Thì chỉ cần mã hóa chuyển động của chiếc xe, còn khung cảnh cây xăng vẫn giữ nguyên -> giảm được dung lượng. P Frames còn được gọi là Delta-Frames. Đặc biệt: P Frames cũng cho phép các frame khác tham khảo đến nó. Để làm được điều này thì P Frames cần chứa đủ lượng thông tin cần thiết (tuy nhiên không nhiều bằng I Frames). Tóm tắt:

  • Sử dụng khung hình trước để tham chiếu.
  • Có bù chuyển động.
  • Thông tin ước lượng của các khối nằm trong Motion Vector (Vector chuyển động). Vector này cho biết macroblock nào sử dụng ảnh trước đó.

B Frames (Bi-Directional Frames): Có thể tiết kiệm dung lượng hơn nữa bằng cách tham chiếu đến cả khung hình trước và sau nó.

  • Có bù chuyển động.
  • Sử dụng Macroblock của khung hình cả trước và sau nó.
  • Trên thực tế, x264 có tùy chọn cho phép sử dụng B-frame để các frame khác có thể tham chiếu vào nó, nếu có từ 2 B-frame trở lên (B-Pyramid). Các loại frame về khía cạnh mã hóa, chỉ khác nhau ở loại khung hình mà nó có thể tham chiếu tới. Tóm lại:
  • Frame I không cần tham chiếu.
  • Frame P chỉ tham chiếu tới frame I hoặc P trước nó.
  • Frame B tham chiếu được cả I, P, và thậm chí B frame cả trước lẫn sau nó (theo thời gian).

Trong H264, B-frame có thể tham chiếu hoặc được tham chiếu đến / từ các khung hình khác. Tương tự áp dụng cho B-slice.

Có 4 chế độ tất cả (dòng chữ nghiêng là chỉ có trong MPEG2):

  • Tham chiếu 1 chiều (khung hình trước hoặc sau nó).
  • Đa khung hình tham chiếu (nhiều khung hình trước + nhiều khung hình sau).
  • Lấy trung bình từ 2 khung hình tham chiếu: 1 trước và 1 sau.
  • Lấy luôn giá trị vừa xử lý của khung hình được xử lý trước nó.

4.4: Lấy mẫu màu

Mắt người cảm nhận sự khác biệt màu sắc kém hơn khả năng cảm nhận sự khác biệt về độ sang >> Lấy độ phân giải màu thấp hơn độ phân giải sáng. Và cùng một bitrate, những cảnh sáng sẽ bù lấp phần lỗi tốt hơn cho mắt người, về sinh học, hiện tượng này gọi là “tự kỷ ám thị” (Placebo effect).

Vì vậy, H264 với hệ màu YUV giữ nguyên tham số Y (độ chói – Luminance). Giảm 2 thông số CbCr (hay UV). H264 hỗ trợ cấu trúc lấy mẫu màu là 4:4:4.

matrix

Theo như hình trên. Lấy ma trận màu 4×4 pixel, lấy mẫu màu, ta có thể nhận thấy:

  • 4 Điểm đen (tương ứng 4 mẫu Y – độ đậm nhạt màu)
  • 4 Điểm xanh (tương ứng Cb)
  • 4 Điểm đỏ (tương ứng Cr)

Vậy hệ này là hệ màu 4:4:4, không mất thông tin về màu sắc trên bất kỳ điểm ảnh nào.

matrix2

  • 4 Điểm đen (tương ứng 4 mẫu Y – độ đậm nhạt màu)
  • 2 Điểm xanh (tương ứng Cb)
  • 2 Điểm đỏ (tương ứng Cr)

Vậy cách lấy mẫu màu này là 4:2:2 giảm 25% thông tin so với 4:4:4, tương tự với 4:2:0 giảm 50%.

4.5: Intra-Coding

Các bộ mã hóa (encoder) sử dụng kết hợp phương pháp Inter-frame Prediction (lấy phần đoán giữa các frame khác nhau). Sử dụng phương pháp Intra-encoding cho những phần ảnh cần thiết để tránh lỗi.

Tuy nhiên cần chú ý khi sử dụng Intra-encoding bởi tiêu tốn khá nhiều Bitrate. Trên thực tế, 80% bitrate được sử dụng cho mã hóa các I-frame. H264 tận dụng sự tương quan giữa các block gần block đang xử lý, để có thể cải thiện độ nén. (Xem lại ảnh minh họa phần 4.1 (Prediction)).

intra

(Ví dụ: Sử dụng chế độ 0, 4 pixel hàng dưới của block phía trên được sao chép xuống block phía dưới.)

Tăng khả năng nén lên đáng kể cho video. Khi chia làm các khối macroblock 4×4, sử dụng các chế độ phỏng đoán trên để thực hiện nén bằng cách tham chiếu các vùng hình đã mã hóa từ trước trong cùng một frame.

4.6: Xử lý sâu

4.6.1: Phân vùng Macroblock

Là công đoạn giảm thiểu dư thừa và tăng chất lượng nén về mặt không gian, bằng cách tham chiếu đến các khung hình / phần khung hình khác, với phương pháp bù chuyển động và đánh giá chuyển động qua các vector.

Các khung hình được chia thành các đơn vị là các khối (block) hoặc nhóm khối (macroblock). Các macroblock lại được chia vùng nhỏ hơn nữa để xử lý lấy mẫu và vector chuyển động. Bao gồm:

  • 16×16
  • 16×8
  • 8×16
  • 8×8 – Trong 8×8 lại bao gồm:
    • 8×8
    • 8×4
    • 4×8
    • 4×4

macro

Việc chia nhỏ hình ảnh thành các khối con nhỏ hơn sẽ làm tăng số bit cần có để thu được các vector chuyển động. Tuy nhiên thông tin về các phần dư giữa các khung hình sẽ được giảm.

Việc chọn tỉ lệ chia còn tùy thuộc vào tính chất của video. Ví dụ: Một video hành động thực có các khuôn màu và các cảnh chuyển động phức tạp cần để mức chia nhỏ để có thể tái tạo chi tiết chuyển động hơn. Ngược lại, các video hoạt hình, hoặc ảnh tĩnh chuyển đổi qua lại, hoặc video có nhiều cảnh tương tự nhau trong một thời gian cụ thể, sẽ không cần phân vùng nhỏ.

Các vector sau khi được qua xử lý đánh giá sẽ được truyền theo từng block, dựa trên các khung hình tham chiếu trước đó. Trong chuẩn MPEG nói chung, khung hình tham chiếu là khung hình trước gần khung hình đang xử lý nhất. Với chuẩn H264 nói riêng, một khung hình có thể tham chiếu nhiều khung hình trước, kỹ thuật này gọi là bù chuyển động đa khung hình tham chiếu. Cách làm việc có thể mô tả như sau:

  • Bộ mã hóa đưa các khung hình tham chiếu vào một bộ đệm đa khung hình.
  • Bộ giải mã tái tạo bộ đệm đa khung hình dựa trên loại bộ đệm khung hình tham chiếu và MMCO (Memory Management Control Options – Tùy chọn quản lý điều khiển bộ nhớ) quy định trong các bitstream. Trừ trường hợp trong bộ đệm gốc chỉ có 1 khung hình, còn lại phải có quy định thứ tự khung hình được tham chiếu tới, đi kèm mỗi block từ 16×16 đến 8×8.

Và vì sử dụng đa khung hình tham chiếu, nên việc lựa chọn khung hình nào để tham chiếu cho các block của khung hình đang xử lý cũng là một vấn đề cần tính toán. Hàm quản lý bộ nhớ trong mỗi bộ giải mã đảm nhiệm nhiệm vụ này, quyết định frame nào sẽ được tham chiếu và frame nào không cần thiết, loại bỏ khỏi bộ đệm.

4.6.2: Sub-Pixel Motion Vector

Qpel – Quarter Pixel Motion: Phương pháp sử dụng phần tư khoảng cách giữa các pixel (hoặc các mẫu độ chói điểm ảnh) làm vector chuyển động dùng trong đánh giá chuyển động của quá trình mã hóa video.

qpel

Việc sử dụng phần tư pixel (không phải số nguyên) sẽ tốn nhiều bit hơn để mã hóa, nhưng với video nhiều cảnh chuyển động, sẽ cho ra chất lượng nén tốt hơn nhờ vector dựng chiều chính xác hơn.

4.6.3: Phân vùng ảnh (Picture Partitioning) và Skip Mode

  • Các khối 16×16 điểm ảnh biểu diễn thông tin độ sáng màu (luma).
  • 2 khối 8×8 tiếp theo biểu diễn thông tin về 2 thành phần màu sắc.
  • Slice: Các chuỗi macroblock được xử lý theo kiểu liên tiếp xuống dòng (nếu không sử dụng Flexible Macroblock Ordering).
  • Trong H264, một ảnh là tập hợp của các slice. Có tính độc lập. Slice là mỗi chuỗi các macroblock.

partition

Các slice (lắt cắt) được phân thành các loại:

  • I slice: Tất cả các macroblock trong slice đều được mã hóa bằng phương pháp Intra-Prediction (phỏng đoán nội bộ). Tức là chỉ khai thác sự tương quan về mặt không gian.
  • P slice: Vừa được mã hóa bằng phỏng đoán nội bộ, vừa có thể tham chiếu đến các khung hình trước.
  • B slice: Tương tự như P slice, nhưng có thể tham chiếu đến cả các khung hình sau nó.

Ngoài ra trong H264 còn có 2 loại slice đặc biệt:

- SI (Switching I-slice): Slice được mã hóa để cho phép chuyển đổi giữa các ảnh. Chứa các SI macroblock. - SP (Switching P-slice): Tương tự SI, chứa các macroblock P hoặc I.

Tác dụng: Tăng khả năng chịu lỗi nhờ vào việc chuyển đổi giữa các phần hình, đặc biệt tốt khi sử dụng với các bộ giải mã thông minh.

Nếu một Macroblock có tính chất chuyển động đặc biệt, có thể tham chiếu từ các block xung quanh (Ví dụ: khói bốc lên từ ống khói). Trường hợp này, block đó sẽ được đánh dấu skip (bỏ qua), tức là không cần gửi kèm thông số tham chiếu.

4.6.4: Motion Vector Prediction

  • Sử dụng nhiều khung hình tham chiếu trước (P) và cả sau (B) để xây dựng vector chuyển động.
  • Sử dụng thông tin từ các macroblock khác trong cùng 1 frame để mã hóa macroblock khác.
  • Bộ giải mã lưu trữ các ảnh nhằm tái tạo các ảnh sau đó qua việc tìm và so sánh sự giống nhau nhất giữa các khung hình dùng để tham chiếu.
  • Những thông tin sai lệch (hay còn gọi là phần dư) sẽ được lưu lại để tạo ảnh kế tiếp:

source

(Ảnh nguồn)

prediction

(Ảnh dự đoán)

residual

(Phần dư)

output

(Ảnh đầu ra)

Có thể tóm tắt: Ảnh nguồn + Phần dư = Ảnh đầu ra, xử lý và phỏng đoán thông qua Ảnh dự đoán.

4.7: Mã hóa Entropy – CAVLC và CABAC

  • Là 2 dạng mã hóa entropy trong hô hình mã hóa entropy các cú pháp H264.
  • Được thực hiện ở bước cuối. Sau các bước lượng tử và đánh giá chuyển động.
  • File H264 hoặc dòng truyền H264 bao gồm một dãy các ký tự giá trị, tương ứng với các tham số lớp mã hóa video như kiểu phỏng đoán, vector chuyển động,…
  • CAVLCCABAC sử dụng để nén các thông số này và chuyển đổi sang dạng byte dữ liệu.
  • Cả 2 đều là thuật toán nén không mất thông tin.
  • CABAC cho chất lượng nén tốt hơn nhưng giải mã phức tạp hơn. Tuy nhiên, như đã nói ở trên, 2 thuật toán này là 2 thuật toán nén không mất thông tin nên sử dụng CABAC có thể giảm được bitrate so với CAVLC mà vẫn giữ được chất lượng. CABAC có thể cải thiện chất lượng nén khoảng 10-15% so với CAVLC.
  • Thông tin ngoài lề: 1920×1088 là độ phân giải mặc định khi thu hình định dạng MPEG2 Interlaced HDTV (với cơ chế bắn các dòng electron) hiện nay. Yêu cầu phải chia hết cho 16 (viết tắt là mod16) để hiển thị luma (độ chói) pixel đúng.

PHẦN V: SO SÁNH VỚI CÁC ĐỊNH DẠNG KHÁC

MPEG2AVC/H264VC-1 / WMV9
Intra PredictionKhông: Chỉ mã hóa theo khối4x4 theo không gian, 16x16 theo không gian, I_PCMFrequency Domain Coefficient
Picture Coding TypeFrame, Field, PAFFFrame, Field, PAFF / MBAFFFrame, Field, Progressive, PAFF
Kích thước khối bù chuyển động16x16 / 16x8 / 8x1616x16 / 16x8 / 8x16 / 8x8 / 8x4 / 4x8 / 4x416x16 / 16x8 / 8x16 / 8x8 / 8x4 / 4x8 / 4x4
P FrameĐơn tham chiếuĐa tham chiếuĐa tham chiếu
B FrameĐơn tham chiếu mỗi chiềuĐơn / đa tham chiếu mỗi chiều, Trực tiếp / dùng kiểm định không gianĐơn tham chiếu mỗi chiều
Mã hóa entropyVLCCAVLC / CABACAdaptive VLC
Bộ lọc lặpKhôngKhử khốiKhử khối, Chuyển đổi chồng chất

PHẦN VI: Tài liệu tham khảo và thuật ngữ viết tắt

Thuật ngữTên đầy đủ / Giải thích
AVCAdvanced Video Coding
NALNetwork Abstraction Layer
VCLVideo Coding Layer
I FramesIntra Frames
P FramesPredictive Frames
B FramesBi-Directional Frames
MCMotion Compensation
MEMotion Estimation
FPSFrame-Per-Second
BRBitrate
KbpsKilobits per second
CABACContext Adaptive Binary Arithmetic Coding
CAVLCContext Adaptive Variable Length Coding
DXVADirectX Video Accelerator