Một video chưa nén thực chất chỉ là chuỗi các frame, mỗi frame là một ma trận pixel. Với video 1080p ở 60 FPS và mỗi pixel dùng 3 byte cho RGB, lượng dữ liệu thô lên tới khoảng 370 MB mỗi giây. Một video vài phút sẽ nhanh chóng trở thành hàng chục hoặc hàng trăm GB, chưa kể việc truyền qua mạng hay ghi trực tiếp xuống ổ đĩa.
H.264, còn được gọi là AVC, ra đời để giải quyết đúng bài toán đó: biểu diễn video bằng ít bit hơn nhưng vẫn giữ được chất lượng hình ảnh đủ tốt cho mắt người. Điểm thú vị là H.264 không dựa vào một “mẹo” duy nhất. Nó xếp chồng nhiều kỹ thuật nén khác nhau, trong đó có cả nén mất dữ liệu và nén không mất dữ liệu.
Từ bỏ những chi tiết mắt người khó nhận ra
PNG là định dạng lossless: sau khi giải nén, dữ liệu ảnh có thể khôi phục nguyên vẹn từng bit. H.264 chủ yếu là lossy codec, nghĩa là chấp nhận bỏ đi một phần thông tin để đổi lấy kích thước nhỏ hơn.
Điều này không có nghĩa codec tùy tiện xóa một vùng ảnh. Nó tận dụng đặc điểm của thị giác con người: chúng ta nhạy với các thay đổi lớn về độ sáng, nhưng thường kém nhạy hơn với những chi tiết màu sắc rất nhỏ hoặc hoa văn quá mịn.
Quantization và frequency domain
Một bức ảnh có thể được biểu diễn theo một cách khác, gọi là frequency domain. Ở đó, các thành phần tần số thấp biểu diễn những thay đổi chậm như vùng màu tương đối phẳng hoặc gradient. Thành phần tần số cao biểu diễn các đường nét, cạnh và chi tiết nhỏ.
H.264 áp dụng các phép biến đổi toán học để đưa dữ liệu vào dạng phù hợp hơn, sau đó dùng quantization để làm giảm độ chính xác của một số thành phần, đặc biệt là những thành phần ít quan trọng về mặt thị giác. Khi chuyển ngược về ảnh thông thường, ảnh vẫn trông gần giống bản gốc nhưng có thể mất các chi tiết rất nhỏ.
Mức quantization càng mạnh thì file càng nhỏ, nhưng hiện tượng mất chi tiết, block artifact hoặc ringing cũng dễ xuất hiện hơn. Đây là một trong những điểm mà encoder phải cân bằng giữa chất lượng, bitrate và thời gian xử lý.
Chroma subsampling: màu không cần độ phân giải cao như độ sáng
Dữ liệu RGB thường được chuyển sang hệ màu YCbCr. Y biểu diễn luminance, tức độ sáng; Cb và Cr biểu diễn chrominance, tức thông tin màu.
Mắt người thường nhận biết thay đổi về độ sáng tốt hơn thay đổi nhỏ về màu. Vì vậy, codec có thể giữ kênh Y ở độ phân giải đầy đủ nhưng giảm độ phân giải của Cb và Cr mà chất lượng cảm nhận vẫn khá tốt.
Các dạng như 4:2:0 rất phổ biến trong video. Đây là một lý do quan trọng khiến video màu có thể nhỏ hơn đáng kể so với việc lưu toàn bộ ba kênh màu ở cùng độ phân giải. Chroma subsampling không phải phát minh riêng của H.264, nhưng là kỹ thuật nền tảng được sử dụng rộng rãi trong hệ thống video.
Không lưu lại toàn bộ mỗi frame
Quantization và chroma subsampling mới chỉ xử lý không gian trong từng frame. Phần “ma thuật” lớn tiếp theo nằm ở chiều thời gian.
Trong nhiều video, phần lớn hình ảnh giữa hai frame liên tiếp không thay đổi. Một trận tennis có thể có camera cố định, sân và khán giả gần như đứng yên, chỉ có người chơi hoặc quả bóng chuyển động. Vì thế, việc lưu đầy đủ từng frame là lãng phí.
H.264 chia frame thành các block, thường được nhắc tới với kích thước macroblock 16×16 trong mô tả kinh điển. Codec tìm xem mỗi block ở frame hiện tại tương ứng với vùng nào ở frame trước hoặc frame tham chiếu. Thay vì lưu lại toàn bộ pixel, nó lưu một motion vector cho biết block cần được dịch chuyển bao nhiêu, cùng phần sai khác còn lại.
I-frame, P-frame và B-frame
- I-frame là frame độc lập, chứa đủ thông tin để dựng lại hình ảnh mà không cần frame khác.
- P-frame được dự đoán từ các frame trước đó, thường lưu motion vector và phần residual khác biệt.
- B-frame có thể dự đoán theo cả hướng trước và sau, nhờ đó thường đạt hiệu quả nén tốt hơn.
Một chuỗi video vì thế có thể gồm một số I-frame làm điểm bắt đầu, sau đó là nhiều P-frame và B-frame nhỏ hơn. Với một màn hình gần như tĩnh, hàng trăm frame không cần chứa hàng trăm bản sao hoàn chỉnh của cùng một ảnh; chúng chủ yếu mô tả những thay đổi nhỏ.
Đây cũng là lý do thao tác seek không phải lúc nào cũng phát ngay lập tức. Nếu người xem nhảy tới một frame bất kỳ, decoder có thể phải tìm I-frame gần nhất rồi lần lượt áp dụng các dự đoán và motion vector cho tới vị trí cần phát. Khoảng trễ ngắn đó là chi phí để đạt được bitrate thấp hơn.
Bước cuối: nén phần dữ liệu còn dư
Sau các bước lossy, dữ liệu vẫn còn nhiều mẫu lặp lại. Chẳng hạn, nhiều block có cùng motion vector, hoặc các giá trị transform xuất hiện với tần suất khác nhau.
H.264 tiếp tục dùng entropy coding, một dạng nén lossless để biểu diễn các mẫu thường gặp bằng mã ngắn hơn. Bước này không làm mất thêm thông tin; nó chỉ thay đổi cách biểu diễn để loại bỏ redundancy còn lại.
“Ma thuật” thực sự nằm ở sự đánh đổi
Một ví dụ trực quan trong bài viết nguồn cho thấy video quay màn hình một trang web trong vài giây có thể nhỏ hơn nhiều so với một ảnh PNG duy nhất, dù video chứa hàng trăm frame. Điều đó khả thi vì các frame gần như giống nhau, và codec chỉ cần lưu phần thay đổi.
Tuy nhiên, không nên hiểu rằng H.264 luôn đạt tỷ lệ nén cố định hoặc có thể biến mọi video thành kích thước cực nhỏ. Video nhiều chuyển động, nhiễu, hạt film hoặc cảnh thay đổi liên tục sẽ khó nén hơn. Chất lượng cuối cùng còn phụ thuộc vào bitrate, profile, preset của encoder, độ phân giải và cấu hình GOP.
Một chi tiết ít được biết đến là H.264 cũng có chế độ lossless trong một số profile và công cụ, dù khả năng tương thích và quy trình sử dụng không thuận tiện bằng các chế độ lossy thông thường. Trong thực tế phát video trên web, người dùng thường ưu tiên mức nén có tổn hao vì nó cho kích thước và băng thông hợp lý hơn.
Nhìn ở mức cao, H.264 kết hợp bốn ý tưởng: bỏ bớt chi tiết khó nhận ra, giảm thông tin màu, dự đoán thay đổi giữa các frame và mã hóa lossless phần dữ liệu lặp lại. Không có bước nào tự nó là phép màu. Nhưng khi ghép chúng thành một pipeline được tối ưu qua nhiều thập kỷ, kết quả đủ ấn tượng để khiến video độ phân giải cao có thể truyền qua Internet, lưu trên điện thoại và phát trực tiếp gần như ở mọi nơi.
Bài viết được AI của DevViet viết lại bằng tiếng Việt từ một bài viết/thảo luận tiếng Anh trên Hacker News, có thể chưa chính xác tuyệt đối. Nguồn: H.264 Is Magic (2016)