Vì vậy, làm thế nào nó hoạt động?
Để trả lời câu hỏi đó sẽ liên quan đến việc giải thích một số bài toán rất phức tạp, chắc chắn hơn chúng ta có thể đề cập đến trong bài viết này, nhưng bạn không cần phải hiểu chính xác cách hoạt động toán học để hiểu những điều cơ bản.
Các thư viện nén văn bản phổ biến nhất dựa trên hai thuật toán nén, sử dụng cả hai cùng một lúc để đạt được tỷ lệ nén rất cao. Hai thuật toán này là “LZ77” và “mã hóa Huffman.” Mã hóa Huffman khá phức tạp và chúng tôi sẽ không đi sâu vào chi tiết ở đây. Chủ yếu, nó sử dụng một số toán học ưa thích để gán ngắn hơnmã nhị phân cho từng chữ cái, thu nhỏ kích thước tệp trong quy trình. Nếu bạn muốn tìm hiểu thêm về nó, hãy xem bài viết này về cách mã hoạt động, hoặc giải thích này bởi Computerphile.
LZ77, mặt khác, là tương đối đơn giản và là những gì chúng ta sẽ nói về ở đây. Nó tìm cách loại bỏ các từ trùng lặp và thay thế chúng bằng một "khóa" nhỏ hơn đại diện cho từ đó.
Lấy đoạn văn bản ngắn này, ví dụ:
Chúng tôi gọi nén như thế này "lossless" - dữ liệu bạn đưa vào giống như dữ liệu bạn nhận được. Không có gì bị mất.
Trên thực tế, LZ77 không sử dụng danh sách khóa, mà thay vào đó thay thế lần xuất hiện thứ hai và thứ ba bằng một liên kết trong bộ nhớ:
Nếu bạn quan tâm đến một lời giải thích chi tiết hơn, video này từ Computerphile là khá hữu ích.
Bây giờ, đây là một ví dụ lý tưởng. Trong thực tế, hầu hết văn bản được nén bằng các phím nhỏ như chỉ một vài ký tự. Ví dụ, từ "the" sẽ được nén ngay cả khi nó xuất hiện trong các từ như "có", "của họ", và "sau đó." Với văn bản lặp đi lặp lại, bạn có thể nhận được một số tỷ lệ nén điên. Lấy tập tin văn bản này với từ "howtogeek" lặp đi lặp lại 100 lần. Tệp văn bản gốc có kích thước ba kilobyte. Khi nén, mặc dù, nó chỉ chiếm 158 byte. Đó là nén gần 95%.
Thuật toán LZ77 này áp dụng cho tất cả các dữ liệu nhị phân, bằng cách này, và không chỉ là văn bản, mặc dù văn bản nói chung là dễ dàng hơn để nén do có bao nhiêu từ lặp đi lặp lại hầu hết các ngôn ngữ sử dụng. Ví dụ, một ngôn ngữ như tiếng Trung có thể khó khăn hơn một chút so với tiếng Anh.
Nén hình ảnh và video hoạt động như thế nào?
Đây là những gì dẫn đến những ảnh JPEG khủng khiếp mà mọi người đã tải lên, chia sẻ và chia sẻ nhiều lần. Mỗi khi ảnh được nén, nó sẽ mất một số dữ liệu.
Đây là một ví dụ. Đây là một ảnh chụp màn hình tôi chụp mà chưa được nén ở tất cả.
Vâng, đây chỉ là trường hợp xấu nhất, xuất ra ở chất lượng JPEG 0% mỗi lần. Để so sánh, dưới đây là một JPEG chất lượng 50%, gần như không thể phân biệt được với hình ảnh PNG nguồn trừ khi bạn thổi nó lên và nhìn kỹ.
Vậy làm thế nào nó tiết kiệm được rất nhiều không gian? Vâng, thuật toán JPEG là một kỳ tích của kỹ thuật. Hầu hết các hình ảnh lưu trữ một danh sách các số, với mỗi số đại diện cho một điểm ảnh duy nhất.
JPEG không thực hiện điều này. Thay vào đó, nó lưu trữ hình ảnh bằng cách sử dụng một cái gì đó gọi là một biến đổi Cosin rời rạc, đó là một tập hợp các sóng sin được thêm vào với nhau ở cường độ khác nhau. Nó sử dụng 64 phương trình khác nhau, nhưng hầu hết các phương trình này không được sử dụng. Đây là những gì thanh trượt chất lượng cho JPEG trong Photoshop và các ứng dụng hình ảnh khác - chọn bao nhiêu phương trình để sử dụng. Các ứng dụng sau đó sử dụng mã hóa Huffman để giảm kích thước tệp hơn nữa.
Điều này cho phép JPEG có tỷ lệ nén cực cao, có thể giảm một tệp có thể là nhiều megabyte xuống còn vài kilobyte, tùy thuộc vào chất lượng. Tất nhiên, nếu bạn sử dụng nó quá nhiều, bạn kết thúc với điều này:
Nén video
Video hoạt động hơi khác so với hình ảnh. Bạn nghĩ rằng họ sẽ chỉ nén từng khung hình của video bằng cách sử dụng JPEG và chắc chắn họ sẽ làm điều đó, nhưng có một phương pháp tốt hơn cho video.
Chúng tôi sử dụng một cái gì đó gọi là "nén interframe", tính toán các thay đổi giữa mỗi khung và chỉ lưu trữ những thay đổi đó. Vì vậy, ví dụ: nếu bạn có cảnh quay tương đối tĩnh mất vài giây trong một video thì rất nhiều không gian được lưu vì thuật toán nén không cần lưu trữ tất cả nội dung trong cảnh không thay đổi. Nén interframe là lý do chính khiến chúng tôi có truyền hình kỹ thuật số và video trên web. Nếu không có nó, video sẽ có hàng trăm gigabyte, nhiều hơn kích thước ổ cứng trung bình trong năm 2005 khi YouTube ra mắt.
Ngoài ra, kể từ khi nén interframe hoạt động tốt nhất với hầu hết các video tĩnh, đây là lý do tại sao confetti hủy hoại chất lượng video.
Lưu ý: GIF không làm điều này, đó là lý do GIF động thường rất ngắn và nhỏ nhưng vẫn có kích thước tệp khá lớn.
Một điều khác cần lưu ý về video là tốc độ bit của nó - lượng dữ liệu được phép trong mỗi giây. Ví dụ: nếu tốc độ bit của bạn là 200 kb / s, video của bạn sẽ trông khá tệ. Chất lượng tăng lên khi tốc độ bit tăng lên, nhưng sau một vài megabyte mỗi giây, bạn nhận được lợi nhuận giảm dần.
Đây là một khung thu nhỏ được lấy từ video của một con sứa. Một bên trái là 3Mb / s, bên trái là 100Mb / s.
Bản trình diễn này hoạt động tốt hơn với video thực tế, vì vậy nếu bạn muốn tự mình kiểm tra, bạn có thể tải xuống các video thử nghiệm tốc độ bit giống nhau được sử dụng tại đây.
Nén âm thanh
MP3 cũng sử dụng tốc độ bit, từ mức thấp đến 48 và 96 kbps (mức thấp) đến 128 và 240kbps (khá tốt) đến 320kbps (âm thanh cao cấp) và bạn sẽ chỉ nghe thấy sự khác biệt với tai nghe đặc biệt tốt ( và tai).
Ngoài ra còn có codec nén lossless cho âm thanh - một trong những chính là FLAC-sử dụng mã hóa LZ77 để cung cấp âm thanh hoàn toàn lossless. Một số người thề bởi chất lượng âm thanh hoàn hảo của FLAC, nhưng với sự phổ biến của MP3, có vẻ như hầu hết mọi người không thể nói hoặc không nhớ sự khác biệt.