Clip-sub.com

Tản mạn về H264

Bài viết này không phải là bài viết hướng dẫn encode, cũng không nhằm mục đích hướng dẫn. Đây chỉ là một số thông tin lượm lặt và nhằm chia sẻ cho những ai đọc hiểu được. Mục đích chính tôi viết ở đây cũng chỉ là lưu trữ phòng khi tài liệu trong máy của tôi bị mất mà thôi.

Phần I: Tổng quan về video số

Như chúng ta đã biết, sự kết hợp giữa hình ảnh tĩnh và âm thanh theo trình tự thời gian phù hợp được gọi là video / phim (theo tiếng Việt). Và dần dần, video đã trở thành một nền tảng đa phương tiện hữu ích cho đời sống, đặc biệt là phân phối thông tin đại chúng.

Và dù ở dạng nào, video về bản chất vẫn là tập hợp những khung hình tĩnh được kết hợp theo khung thời gian phù hợp, sao cho người xem có cảm giác liền mạch như đang chứng kiến một sự việc động. Video trong máy tính và truyền thông cũng không ngoại lệ, dù ở dạng mã hóa nào (analog – tương tự / hay digital – kỹ thuật số).

Hiện nay, có rất nhiều định dạng mã hóa video kỹ thuật số được sử dụng, mỗi loại đều có ưu nhược điểm khác nhau, cho các thiết bị khác nhau và đối tượng sử dụng cũng khác nhau. Và chính vì sự khác nhau đó nên người ta cần xây dựng một số chuẩn chung để yêu cầu các phần cứng, phần mềm của các hãng sản xuất có thể tương tác nhằm tạo ra các sản phẩm có tính nhất quán.

Video trong máy tính ở dạng số được lưu trữ dưới các dạng các tập tin, và cũng theo các số 0 và 1.
Các video cũng có một số đặc điểm, trong đó phải kể đến:

+ Độ phân giải: Các video thể hiện là tập hợp các khung hình, mỗi khung hình là hình chữ nhật có độ dài (H) và độ rộng (W) thể hiện trên mỗi pixel màn hình. Vậy ta có độ phân giải là HxW. Giả sử, 1280×720.
+ Màu: Vậy mỗi pixel mang gì trong nó? Màu. Chỉ có màu. Và màu sắc như thế nào, có bao nhiêu màu cả thảy? Vấn đề này cần thêm một số đề cập khác về độ sâu màu (color depth – CD) như sau:
Các màn hình máy tính hiện đại hỗ trợ tới 32bit màu (hay một số thiết bị xử lý đồ họa của nVIDIA / AMD hỗ trợ lên tới 128bit hoặc hơn). Thông thường với đa số video và nguồn thu / thiết bị thu video hiện nay, độ sâu màu là 8-bit, và mã hóa theo hệ 3 màu cơ bản (RGB – Đỏ + Xanh Lá + Xanh Lam, với 3 màu này pha trộn, ta có thể cho ra tất cả các màu sắc khác). Vậy ta có 8×3 = 24 bit tổng cộng. Và vì là bit nên ta sẽ có 2^8 = 256 số, tương ứng với 256 bóng sắc của 3 màu R, G, B nói trên. Và kết hợp lại, lấy 256^3, ta sẽ có 16,777,216 -> hơn 16 triệu màu. Với hệ số bit cao hơn, sẽ hỗ trợ được nhiều màu hơn, và cũng đòi hỏi khả năng xử lý phải cao hơn.
+ Số khung hình trên giây (FPS – Frames Per Second).
+ Bitrate (BR – thường đo bằng Kbps – Kilobits per second): Số bit thể hiện trên một giây video.
Kết hợp những yếu tố trên vào một ví dụ cụ thể như sau: Một video có độ phân giải 1280×720, độ dài 30 phút, có độ sâu màu là 8bit và số khung hình trên giây là 25 sẽ có dung lượng như sau (giả sử không nén):

Số pixel trên mỗi khung hình: 1280 x 720 = 921600
Số bit trên mỗi khung hình: 8 x 921600 = 7372800 = 7.3728 x 10^6 = 7.3728 Megabits
Mỗi giây có 25 khung hình, vậy ta có Bitrate là 7.3728 x 25 = 184.32 Megabits / giây
30 phút là 1800 giây, vậy dung lượng video (Video Size – VS) là: 1800 * 184.32 = 331.776 Megabits = 41.472 Megabytes = 40.5 Gigabytes

Trên đây là phép tính cho video dạng không nén, và vốn thực tế không được sử dụng nhiều. Các video nén thường dựa trên thuật toán giảm số bit trên mỗi khung hình video. Cụ thể:

– Với video không nén (uncompressed), dung lượng được tính bằng công thức:

W x H x CD x FPS x T

– Thì video nén tính bằng công thức:

(W x H x CD x FPS x T) / CF

Với CF (Compression Factor) là một số được đưa ra bởi thuật toán nén. Trong thực tế không phải tất cả frame trong cùng một video đều sử dụng con số CF này. Và vì vậy sinh ra khái niệm Constant Bitrate (Bitrate hằng – CBR) và Variable Bitrate (Bitrate biến thiên – VBR). Điều này cũng áp dụng cho cả các thuật toán mã hóa âm thanh số. Bitrate là một thông số quan trọng, kể cả khi truyền (tính tương thích) lẫn khi lưu trữ (quyết định 1 phần dung lượng video).
Và chính vì video ở dạng kỹ thuật số, mọi hành động sao chép đều không hề làm giảm chất lượng video (giả sử không có tác động gì khác vào file, hư hại vật lý thiết bị lưu trữ).

Về quá trình nén thông tin trong video. Thực chất chỉ là sự loại bỏ thông tin dư thừa trong cấu trúc của các khung hình. Mọi khung hình trong video đều có một cấu trúc thông tin và nếu nắm bắt cũng như xử lý những phần thông tin dư thừa, ta sẽ được đầu ra là một video có độ nén tốt với chất lượng hầu như không thay đổi. Bản chất khác nhau giữa các chuẩn nén cũng nằm ở thuật toán phát hiện và xử lý này. Quá trình nén thực hiện sẽ lưu lại video dưới dạng tập tin lưu trữ mà vẫn đảm bảo chất lượng hình ảnh. Khi muốn xem, cần qua quá trình giải mã (decode), khôi phục hình ảnh, quá trình này được thiết kế ở các đầu phát video, máy tính, các gói codec, các thiết bị nghe nhìn, TV,…
Một số thông số khác cần quan tâm đến video số:

  1. Loại khung hình
  2. Kiểu quét dòng
  3. Không gian màu
  4. Các biến đổi toán học trong quá trình mã hóa

Phần II: H264 / AVC là gì?

H264 / MPEG4 Part 10 hay AVC (Advanced Video Coding) là một định dạng nén video, hay một chuẩn nén video (hay được biết dưới cái tên CODEC), và hiện đang là một trong những định dạng đang được dùng phổ biến nhất hiện nay trong công nghệ mã hóa, phân phối và xử lý video nói chung.

H264 được phát triển bởi ITU-T Video Coding Experts Group (VCEG) và ISO/IEC JTC1 Moving Picture Experts Group (MPEG), 2 nhóm thuộc tổ chức chuẩn hóa quốc tế.

Mục đích ra đời của H264 nhằm tạo ra một định dạng video chất lượng cao với chi phí lưu trữ và truyền phát thấp so với các định dạng trước đó (MPEG2, H263,…) mà không yêu cầu quá phức tạp về mặt thiết kế ứng dụng cũng như phần cứng. Cũng chính vì yêu cầu như vậy nên bản thân H264 cũng được chia làm nhiều “chuẩn” (profile level) để phù hợp với các thiết bị khác nhau.

Ví dụ, một chiếc điện thoại di động không có nhiều khả năng tính toán như máy tính hay một chiếc đầu phát Blu-ray có khả năng phát video độ phân giải cao sẽ có những mức khác nhau để định dạng này có thể làm việc (đề cập ở dưới).
Lịch sử ra đời của H264 có thể tóm tắt như sau:

  • Đầu năm 1998: Khởi động dự án ITU-T Q.6/SG16 (VCEG – Video Coding Expert Group) “H26L”
  • Tháng 8 năm 1999: Đưa ra bản nháp đầu tiên.
  • Tháng 7 năm 2001: MPEG đặt tên cho công nghệ AVC, H26L được chọn.
  • Tháng 12 năm 2001: Dự án H26L trở thành dự án hợp tác giữa Joint Video Team (JVT) và VCEG, tương tự như MPEG2/H262.
  • Tháng 3 năm 2003: Phê chuẩn.
  • Tháng 10 năm 2004: ITU-T và ISO phê duyệt.

MPEG4 bao gồm nhiều chuẩn, gọi là các “Parts” (phần). Trong đó H264 chúng ta đề cập tới là MPEG4 Part 10.
Có thể tóm tắt về cách gọi tên:

+ MPEG-4 Part 10 (Tên gọi chính thức của MPEG đưa ra)
+ ISO/IEC 14496-10 AVC
+ H.264 (Tên gọi chính thức của ITU đưa ra)

PHẦN III: H264 có ứng dụng gì?

3.1: Giới thiệu về ứng dụng

Là một định dạng video, tất nhiên nhiệm vụ chính của H264 là đóng vai trò chuẩn mã hóa và nén video. Hiện H264 được sử dụng trong rất nhiều thiết bị, dịch vụ. Đơn cử là các thiết bị đầu Blu-ray, các dịch vụ phát video trực tuyến qua internet như YouTube, iTunes Store, Vimeo,… các phần mềm như Adobe Flash Player, Silverlight, VLC, và các dịch vụ truyền hình HDTV, truyền hình vệ tinh.

Ngoài ra H264 còn được các hãng công nghệ phát triển để phục vụ cho các mục đích khác như:

– XAVC: Định dạng thu video có thể hỗ trợ độ phân giải lên tới 4K (4096×2160) và tốc độ khung hình lên tới 60 FPS.
– AVCHD: Được phát triển bởi Sony và Panasonic, dùng để thu video độ phân giải cao, được sử dụng trong nhiều đĩa Blu-ray và máy PlayStation 3. Về cơ bản là H264 nhưng được thêm một số tính năng đặc biệt phục vụ cho các thiết bị của hãng.

3.2: Các loại “hồ sơ” (profile) của H264

Profile là cách sắp lớp ứng dụng nhất định của H264, được quy định bởi MPEG-ITU-T. H:

  • Baseline Profile (BP): Dùng cho các ứng dụng/thiết bị giá rẻ với khả năng tính toán còn hạn chế. Loại này được sử dụng trong hội nghị video và các thiết bị di động.
  • Main Profile (MP): Sử dụng cho ứng dụng tầm trung, để phát hoặc lưu trữ. Thường được dùng cho định dạng phát sóng vô tuyến độ phân giải chuẩn trước đây.
  • Extended Profile (XP): Sử dụng cho các ứng dụng phát video, với độ nén cao, khả năng chịu lỗi tốt và tương thích khi chuyển dòng phát giữa các server với nhau.
  • High Profile (HiP): Loại sử dụng chính cho truyền hình độ phân giải cao và lưu trữ trên đĩa (HDTV, Bluray, HD DVD,…).
  • High 10bit Profile (Hi10P): Giống như HiP nhưng hiện nay các thiết bị cần được sửa đổi để tương thích với định dạng sử dụng 10bit mỗi mẫu màu.
  • High 4:2:2 Profile (Hi422P): Sử dụng cho các ứng dụng chuyên nghiệp với video interlaced và sử dụng video 10bit. Hỗ trợ lấy mẫu màu dạng 4:2:2.
  • High 4:4:4 Profile (Hi444P): Tương tự như trên nhưng lấy mẫu màu dạng 4:4:4, hỗ trợ lên tới 14bit mẫu màu. Hỗ trợ mã hóa không mất thông tin.

Ngoài ra, các hồ sơ này còn bao gồm một số loại con hỗ trợ cho all-intra, tức là một số thiết bị thu / ghi hình, chỉnh sửa chuyên nghiệp chỉ sử dụng Intra-Frame. Tương ứng với các loại profile đã liệt kê ở trên:

  • High 10 Intra Profile.
  • High 4:2:2 Intra Profile.
  • High 4:4:4 Intra Profile.
  • CAVLC 4:4:4 Intra Profile (chỉ sử dụng mã hóa entropy CAVLC).

Trên PC, Bluray, Mac, chủ yếu sử dụng Main Profile và High Profile.

Bảng so sánh các tính năng giữa các profile (nguồn: Wikipedia):

Baseline Extended Main High High 10 High 4:2:2 High 4:4:4
I / P Slice
B Slice Không
Đa khung hình tham chiếu
Bộ lọc khử khối vuông
CAVLC
CABAC Không Không
Mã hóa Interlace Không
Chuyển đổi 8×8 hoặc 4×4 Không Không Không
Lượng tử theo ma trận Không Không Không
Điều khiển Cr và Cb riêng Không Không Không
Mã hóa khuôn màu riêng Không Không Không Không Không Không
Mã hóa không mất TT Không Không Không Không Không Không

3.3: Các mức phân bậc (level) của H264:

Quy định khả năng giải mã dựa trên độ phân giải / số lượng khối, tốc độ truyền,… . Tóm tắt một số level ở bảng sau:

Level Tốc độ giải mã tối đa Kích thước khung hình tối đa Video bitrate tối đa Mẫu cho độ phân giải @ khung hình (số khung hình tối đa lưu trữ)
Mẫu luma / giây Macroblock / giây Mẫu luma / giây Macroblock Baseline / Extended / Main Profile High Profile High 10 Profile
1 380160 1485 25344 99 64 80 192 176×[email protected](4)
3.1 27648000 108000 921600 3600 14000 17500 4200 1280×[email protected](5)
4.1 62914560 245760 2097152 8192 50000 62500 150000 2048×[email protected](4)

Ngoài ra các lập trình viên hoặc các nhà phát triển phần cứng / ứng dụng cũng có thể dựa vào level để sản xuất sản phẩm dựa theo đặc tính trên dễ dàng hơn. Ví dụ như quy định cho chuẩn giải mã DXVA.

3.4: Cấu trúc của bộ quy chuẩn H264

Bao gồm 2 phần chính:

3.4.1: Network Abstraction Layer (NAL)

Được sử dụng nhằm tạo tính “thân thiện” với môi trường mạng cho định dạng H264. Cùng với nhiều hệ thống khác nhau như:

  • RTP/TP cho mọi loại giao tiếp có dây và không dây thời gian thực.
  • Các định dạng file (ISO MP4, MMS,…).
  • H.32x cho dịch vụ đàm thoại.
  • MPEG2 cho truyền hình.

Dữ liệu video được mã hóa, và chứa trong các đơn vị thuộc lớp NAL, gọi là các NAL Unit. Ngoài ra còn các gói NAL Unit chứa các thông tin khác, nên NAL Unit được chia làm 2 loại:

+ VCL NAL Unit: NAL unit chứa thông tin về video mã hóa.
+ Non-VCL NAL Unit: NAL unit chứa các thông tin khác.

Header Byte: Byte đầu tiên của mỗi đơn vị NAL, cho biết loại thông tin mà NAL này chứa.
Enumeration Prevention Bytes: Byte được chèn vào dữ liệu tải trọng nhằm ngăn việc tạo ra tiếp đầu mã (net code prefix ngoài ý muốn).

Giải thích: Net Code Prefix được sử dụng nhằm định danh định dạng file. Trong H264, code này được đưa vào giữa các lớp NAL, gồm 3 bytes, chứ không được đưa trực tiếp vào lớp NAL trong cấu trúc Byte Stream (dòng byte). Code được đặt cuối NAL unit này là tiếp đầu mã của NAL unit tiếp theo (EOF).

3.4.2: Video Coding Layer (VCL) trong NALU và phương thức đóng gói

Mỗi NAL Unit bao gồm 1 byte NALU Header, sau đó là dãy byte nội dung video mã hóa (VCL) hoặc thông tin điều khiển (Non-VCL).
Byte header chứa thông tin về loại NALU và tính “quan trọng” của NALU đó (NALU đó có chứa thông tin về slice sử dụng dụng để tham chiếu không – vì nếu không có các slice này sẽ gây khó khăn cho việc giải mã các nội dung cần tham chiếu).
NALU có thể được truyền phát (stream) dưới dạng các dòng bit hoặc đóng gói dưới dạng các file.

NALU

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.

Quy trinh

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ự.

(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ơ đồ:

So do

    1. 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

    1. 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.

    1. 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.

444

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.

422

– 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: Inter-Coding / Bù chuyển động

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

Macroblocks

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.

Motion vector

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.

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.

Slicing

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:
Anh nguon

Ảnh nguồn

 

Anh du doan

Ảnh dự đoán

 

Phan du

Phần dư

 

Anh dau ra

Ả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,…
  • CAVLC và CABAC 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

MPEG2 AVC/H264 VC-1 / WMV9
Intra Prediction Không: Chỉ mã hóa theo khối 4×4 theo không gian16x16 theo không gianI_PCM Frequency Domain Coefficient
Picture Coding Type FrameFieldPAFF FrameFieldPAFF / MBAFF FrameFieldProgressive

PAFF

Kích thước khối bù chuyển động 16×16 / 16×8 / 8×16 16×16 / 16×8 / 8×16 / 8×8 / 8×4 / 4×8 / 4×4 16×16 / 16×8 / 8×16 / 8×8 / 8×4 / 4×8 / 4×4
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ềuTrực tiếp / dùng kiểm định không gian Đơn tham chiếu mỗi chiều
Mã hóa entropy VLC CAVLC / CABAC Adaptive VLC
Bộ lọc lặp Không Khử khối Khử khốiChuyển đổi chồng chất

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

– MPEG4 Part 10 Video Encoding – Scientific Atlanta June 2005.
– Video Encoding in H26L – Kristofer Dovstam April 2000.
– H.264 and MPEG-4 Video Compression: Video Coding for Next-generation Multimedia 2nd Edition – Iain E. G. Richardson. The Robert Gordon University, Aberdeen, UK
– Motion Estimation and Intra Frame Prediction in H.264/AVC Encoder (Rahul Vanam – University of Washington).
– Infrastructure of audiovisual services – Coding of moving video (ITU-T 05/2003).
– DirectX Video Acceleration Specification for H.264/AVC Decoding (Gary Sullivan – Microsoft Corporation)
– H.264 Profiles and Levels (http://blog.mediacoderhq.com/h264-profiles-and-levels/)
– Adobe Media Server Developer: H264 Encoding Options (http://www.adobe.com/devnet/adobe-media-server/articles/h264_encoding.html)
– Color Subsampling (http://blogs.adobe.com/VideoRoad/2010/06/color_subsampling_or_what_is_4.html)

Thuật ngữ Tên đầy đủ / Giải thích
AVC Advanced Video Coding
NAL Network Abstraction Layer
VCL Video Coding Layer
I Frames Intra Frames
P Frames Predictive Frames
B Frames Bi-Directional Frames
MC Motion Compensation
ME Motion Estimation
FPS Frame-Per-Second
BR Bitrate
Kbps Kilobits per second
CABAC Context Adaptive Binary Arithmetic Coding
CAVLC Context Adaptive Variable Length Coding
DXVA DirectX Video Accelerator