Trang chủ » làm thế nào để » Làm thế nào để nén tập tin làm việc?

    Làm thế nào để nén tập tin làm việc?

    Các kỹ sư phần mềm luôn phát triển những cách mới để lắp nhiều dữ liệu vào một không gian nhỏ. Đó là sự thật khi các ổ cứng của chúng ta còn nhỏ, và sự ra đời của Internet đã khiến nó trở nên quan trọng hơn. Nén tệp đóng vai trò lớn trong việc kết nối chúng tôi, cho phép chúng tôi gửi ít dữ liệu hơn xuống để chúng tôi có thể tải xuống nhanh hơn và phù hợp với nhiều kết nối hơn trên các mạng bận rộn.

    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ố phép toán rất phức tạp, chắc chắn nhiều hơn những gì chúng ta có thể trình bày 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 thức hoạt động của toán học để hiểu những điều cơ bản.

    Các thư viện phổ biến nhất để nén văn bản 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à mã hóa 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 về vấn đề này ở đây. Chủ yếu, nó sử dụng một số toán ưa thích để gán ngắn hơn mã nhị phân để các chữ cái riêng lẻ, thu nhỏ kích thước tập tin trong quá 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 trình giải thích này của Computerphile.

    LZ77, mặt khác, 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 phím nhỏ hơn, đại diện cho từ.

    Lấy đoạn văn bản ngắn này làm ví dụ:

    Thuật toán LZ77 sẽ xem xét văn bản này, nhận ra rằng nó lặp đi lặp lại ba lần howtogeek, và thay đổi nó thành:

    Sau đó, khi nó muốn đọc lại văn bản, nó sẽ thay thế mọi trường hợp của (h) bằng một cuốn sách howtogeek, Lọ đưa chúng ta trở lại cụm từ gốc.

    Chúng tôi gọi là nén như thế này, bộ dữ liệu không mất dữ liệu - dữ liệu bạn nhập vào giống như dữ liệu bạn nhận được. Không có gì là mất.

    Trong thực tế, LZ77 không sử dụng danh sách các 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 trở lại trong bộ nhớ:

    Vì vậy, bây giờ, khi đến (h), nó sẽ nhìn lại về how howogogeek và đọc nó thay vào đó.

    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 khá hữu ích.

    Bây giờ, đây là một ví dụ lý tưởng hóa. Trong thực tế, hầu hết các văn bản được nén với các phím nhỏ chỉ bằng một vài ký tự. Ví dụ, từ "the the the the" sẽ được nén ngay cả khi nó xuất hiện trong các từ như ở đó, có nghĩa là, đó là một phần của 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 rồ. Lấy tập tin văn bản này với từ "howtogeek" được lặp lại 100 lần. Tệp văn bản gốc có kích thước ba kilobyte. Tuy nhiên, khi nén, nó chỉ chiếm 158 byte. Đó là nén gần 95%.

    Bây giờ rõ ràng, đó là một ví dụ khá cực đoan vì chúng ta chỉ lặp đi lặp lại cùng một từ. Trong thực tế chung, có thể bạn sẽ có được khoảng 30-40% nén bằng định dạng nén như ZIP trên một tệp chủ yếu là văn bản.

    Tuy nhiên, thuật toán LZ77 này áp dụng cho tất cả dữ liệu nhị phân, và không chỉ văn bản, mặc dù văn bản nói chung dễ nén hơn do có bao nhiêu từ lặp đi lặp lại mà hầu hết các ngôn ngữ sử dụng. Ví dụ, một ngôn ngữ như tiếng Trung Quốc có thể khó nén hơn tiếng Anh.

    Nén hình ảnh và video như thế nào?

    Nén video và âm thanh hoạt động rất khác nhau. Không giống như văn bản nơi bạn có thể nén không mất dữ liệu và không có dữ liệu nào bị mất, với hình ảnh chúng tôi có cái được gọi là Nén mất dữ liệu, nơi bạn làm mất một số dữ liệu. Và bạn càng nén, bạn càng mất nhiều dữ liệu.

    Đây là những gì dẫn đến những JPEG trông khủng khiếp mà mọi người đã tải lên, chia sẻ và chụp màn hình nhiều lần. Mỗi lần hình ảnh bị 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.

    Sau đó tôi đã chụp ảnh màn hình đó và chạy nó qua Photoshop nhiều lần, mỗi lần xuất nó dưới dạng JPEG chất lượng thấp. Đây là kết quả.

    Trông khá tệ phải không??

    Chà, đây chỉ là một trường hợp xấu nhất, xuất ra với chất lượng JPEG 0% mỗi lần. Để so sánh, đây là 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ỹ.

    PNG cho hình ảnh này có kích thước 200 KB, nhưng JPEG chất lượng 50% này chỉ có 28 KB.

    Vậy làm thế nào để nó tiết kiệm rất nhiều không gian? Vâng, thuật toán JPEG là một kỳ công 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 pixel.

    JPEG không làm điều này. Thay vào đó, nó lưu trữ hình ảnh bằng cách sử dụng một thứ gọi là Biến đổi Cosine rời rạc, là tập hợp các sóng hình sin được cộng lại với nhau ở các cường độ khác nhau. Nó sử dụng 64 phương trình khác nhau, nhưng hầu hết trong số này không được sử dụng. Đây là 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 mang lại cho JPEG một tỷ lệ nén cực kỳ cao, có thể giảm một tệp có thể giảm nhiều megabyte xuống 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 sẽ kết thúc với điều này:

    Hình ảnh đó thật kinh khủng. Nhưng một lượng nhỏ nén JPEG có thể có tác động đáng kể đến kích thước tệp và điều này làm cho JPEG rất hữu ích để nén ảnh trên các trang web. Hầu hết các hình ảnh bạn thấy trực tuyến đều được nén để tiết kiệm thời gian tải xuống, đặc biệt là đối với người dùng di động có kết nối dữ liệu kém. Trên thực tế, tất cả các hình ảnh trên How-To Geek đã được nén để tải trang nhanh hơn và có thể bạn không bao giờ nhận thấy.

    Nén video

    Video hoạt động hơi khác so với hình ảnh. Bạn sẽ nghĩ rằng họ sẽ chỉ nén từng khung hình video bằng JPEG và họ chắc chắn 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ì đó được gọi là nén liên khung, mà tính toán các thay đổi giữa mỗi khung và chỉ lưu trữ các khung đó. Vì vậy, ví dụ, nếu bạn có một cảnh quay tương đối tĩnh chiếm vài giây trong video, rất nhiều không gian sẽ đượ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 liên khung 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ẽ là hàng trăm gigabyte, nhiều hơn kích thước ổ cứng trung bình vào năm 2005 khi YouTube ra mắt.

    Ngoài ra, vì nén liên khung hoạt động tốt nhất với video chủ yếu, đây là lý do tại sao confetti làm hỏng chất lượng video.

    Lưu ý: GIF không làm điều này, đó là lý do tại sao GIF hoạt hình 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 vài megabyte mỗi giây, bạn sẽ nhận được lợi nhuận giảm dần.

    Đây là một khung hình phóng to được lấy từ video của một con sứa. Cái bên trái là 3Mb / s, và cái bên phải là 100Mb / s.

    Tăng 30 lần kích thước tệp, nhưng chất lượng không tăng nhiều. Nói chung, video YouTube có tốc độ khoảng 2-10Mb / giây tùy thuộc vào kết nối của bạn, vì mọi thứ có thể sẽ không được chú ý nhiều hơn.

    Bản demo 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 kiểm tra bitrate tương tự được sử dụng tại đây.

    Nén âm thanh

    Nén âm thanh hoạt động rất giống với nén văn bản và hình ảnh. Trong đó JPEG loại bỏ chi tiết khỏi hình ảnh mà bạn sẽ không nhìn thấy, nén âm thanh cũng làm như vậy đối với âm thanh. Bạn có thể không cần nghe thấy tiếng kèn kẹt của dây đàn guitar nếu dây đàn thực sự to hơn, to hơn nhiều.

    MP3 cũng sử dụng bitrate, từ mức thấp 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 có thể sẽ chỉ nghe thấy sự khác biệt với tai nghe cực kỳ tốt ( và tai).

    Ngoài ra còn có các codec nén không mất dữ liệu cho âm thanh - cái chính là FLAC - sử dụng mã hóa LZ77 để cung cấp âm thanh hoàn toàn không bị mất. Một số người thề vớ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, dường như hầu hết mọi người không thể nói hoặc không quan tâm đến sự khác biệt.