Skip to main content

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

· 15 min read
Doko
Writer

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ố).

Phần I: Tổng quan về video 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 sắc thái 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ố:

  • Loại khung hình
  • Kiểu quét dòng
  • Không gian màu
  • 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):

BaselineExtendedMainHighHigh 10High 4:2:2High 4:4:4
I / P Slice
B SliceKhông
Đa khung hình tham chiếu
Bộ lọc khử khối vuông
CAVLC
CABACKhôngKhông
Mã hóa InterlaceKhông
Chuyển đổi 8x8 hoặc 4x4KhôngKhôngKhông
Lượng tử theo ma trậnKhôngKhôngKhông
Điều khiển Cr và Cb riêngKhôngKhôngKhông
Mã hóa khuôn màu riêngKhôngKhôngKhôngKhôngKhôngKhông
Mã hóa không mất TTKhôngKhôngKhôngKhôngKhôngKhô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:

LevelMẫu luma / giâyMacroblock / giâyMẫu luma / giâyMacroblockBaseline / Extended / Main ProfileHigh ProfileHigh 10 ProfileMẫu cho độ phân giải @ khung hình (số khung hình tối đa lưu trữ)
1380160148525344996480192176x144@15(4)
3.1276480001080009216003600140001750042001280x720@30(5)
4.1629145602457602097152819250000625001500002048×1024 @ 30.0(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.

nal