Định dạng tệp và chất lượng, hay vì sao tệp của bạn nặng thế
Định dạng tệp và chất lượng
Cổng nộp bài nhận tối đa 25 MB, tệp của bạn 27,5 MiB. Câu hỏi không phải nén thế nào, mà là hạ tham số nào, xuống tới đâu, và mất gì khi hạ.
Ở bài sáng tạo nội dung số với công cụ AI bạn đã biết một tấm ảnh nặng bao nhiêu, và vì sao video thô không thể tồn tại nếu không nén. Ở bài mạng và Internet bạn đã biết thời gian tải bằng số byte chia cho tốc độ đường truyền. Bài này không lặp lại hai chuyện đó.
Nó trả lời câu hỏi đứng ngay sau chúng, câu mà sinh viên gặp vào đúng đêm trước hạn nộp: tệp vượt hạn rồi, phải hạ cái gì và hạ tới đâu. Câu trả lời không phải cảm giác. Nó là một phương trình một ẩn, và giải được.
Byte đến từ đâu, cho từng loại nội dung
Bốn loại nội dung, bốn chỗ byte sinh ra, và không chỗ nào có gì bí ẩn.
Ảnh là một lưới điểm. Số byte bằng số điểm nhân số bit mỗi điểm rồi chia 8. Một điểm ảnh không chỉ mang độ sáng: nó mang một mẫu sáng cộng hai mẫu màu, nên ở mức đủ màu, 8 bit mỗi mẫu cho 8 × (1 + 2) = 24 bit mỗi điểm ảnh.
Âm thanh là những lần đo tín hiệu. Số byte bằng tần số lấy mẫu nhân độ sâu bit nhân số kênh nhân số giây, chia 8. Chất lượng đĩa CD là 44.100 lần đo mỗi giây, mỗi lần 16 bit, hai kênh, tức 44.100 × 16 × 2 / 8 = 176.400 byte cho mỗi một giây tiếng.
Video có hai cách tính, và chúng cách nhau rất xa. Thô thì nó là một tấm ảnh lặp lại: khung nhân số khung mỗi giây nhân số giây. Đã nén thì nó là bit rate nhân thời lượng, hết, không phụ thuộc khung to hay nhỏ.
Tài liệu là hai phần cộng lại. Phần chữ bằng số trang nhân số ký tự mỗi trang nhân số byte mỗi ký tự. Phần ảnh nhúng thì đã nén sẵn từ trước, nên nó đi thẳng qua mọi lần nén sau đó.
Hãy tự đổi các con số trong khung dưới đây và xem chúng kéo kích thước đi tới đâu.
1 · Byte đến từ đâu: âm thanh ✎ sửa được
Thô: 44.100 × 16 × 2 × 1.800 / 8 = 317.520.000 byteTệp: 128 × 1.000 × 1.800 / 8 = 28.800.000 byteĐọc theo bit rate thì dòng thô chạy 1.411,2 kbps còn dòng đã nén chạy 128 kbps, cả hai trên thang 1000 vì đó là thang mọi bộ nén dùng. Thời lượng 30 phút.
2 · Hạn dung lượng, và phải hạ cái gì ✎ sửa được
- tần số lấy mẫu (Hz): Khi đã cố định bit rate thì kích thước tệp chỉ còn phụ thuộc bit rate và thời lượng. Tham số này vẫn đổi kích thước THÔ và tỉ lệ nén, nhưng không đổi kích thước tệp.
- độ sâu bit: Khi đã cố định bit rate thì kích thước tệp chỉ còn phụ thuộc bit rate và thời lượng. Tham số này vẫn đổi kích thước THÔ và tỉ lệ nén, nhưng không đổi kích thước tệp.
- số kênh: Khi đã cố định bit rate thì kích thước tệp chỉ còn phụ thuộc bit rate và thời lượng. Tham số này vẫn đổi kích thước THÔ và tỉ lệ nén, nhưng không đổi kích thước tệp.
3 · Tệp mang theo cái bạn không định gửi
Một tấm ảnh chụp bằng điện thoại thường mang thêm ngày giờ, tên máy, cài đặt máy, và toạ độ nơi bạn bấm máy. Toạ độ ghim chặt tới đâu thì tính được, không cần đoán: một độ kinh tuyến ở xích đạo dài khoảng 111,32 km, nên mỗi chữ số thập phân chia độ mịn cho 10. Càng đi xa xích đạo thì một độ càng ngắn, nên các con số dưới đây là chặn trên: thực tế vị trí bị ghim chặt hơn thế.
| số chữ số thập phân | một đơn vị cuối đáng bao nhiêu | tức là ghim tới mức |
|---|---|---|
| 2 chữ số | 1.113,2 m | một vùng rộng hơn một cây số, cỡ một phường |
| 4 chữ số | 11,132 m | hơn mười mét, tức đúng căn nhà bạn đứng |
| 6 chữ số | 11,132 cm | hơn mười xen ti mét, tức đúng cái bàn |
| 8 chữ số | 0,111 cm | hơn một milli mét, chặt hơn mọi máy dân dụng đo được |
Chữ cũng nặng hơn bạn tưởng, và đây là lý do ô "byte mỗi ký tự" ở tab tài liệu không phải luôn bằng 1. Chuỗi Đại học có 7 ký tự nhưng chiếm 12 byte theo UTF-8, tức 1,714 byte mỗi ký tự: chữ Đ tốn 2 byte, chữ ạ và ọ tốn 3 byte mỗi chữ, còn i, h, c và dấu cách mỗi cái 1 byte.
- Nó đếm mẫu. Nó không biết tệp của bạn nhìn ra sao. Một cấu hình bỏ ba phần tư mẫu màu hiện ra ở đây bình thản y như một cấu hình không bỏ gì.
- Tỉ lệ nén là con số bạn gõ vào, không phải con số khung này biết. Muốn chắc thì xuất thử một tệp rồi nhìn kích thước thật. Riêng chế độ bit rate thì số byte là phép nhân, nên nó chính xác.
- Hạn 25 MB trong preset là số tròn để tính, không phải hạn thật của một dịch vụ nào. Hạn thật đổi theo nơi và theo thời gian, nên hãy tự kiểm hạn của hệ thống bạn phải nộp.
- Mốc "hạ tới đâu thì vừa" là mốc của đúng một tham số, giữ nguyên mọi tham số khác. Hạ hai thứ cùng lúc thì mỗi mốc nới ra, và khung này không tính hộ bạn tổ hợp đó.
Trạng thái mở bài nói gì
Khung mở ra ở kịch bản bản ghi thảo luận 30 phút, chất lượng đĩa CD, nén xuống 128 kbps, và một hạn 25 MB.
Dòng thô: 44.100 × 16 × 2 × 1.800 / 8 = 317.520.000 byte, tức 302,8 MiB. Đó là con số không ai từng gửi đi, vì không ai lưu tiếng thô. Và đừng đọc nó thành "nặng hơn một bộ phim": chính khung này có phản ví dụ ngay ở kịch bản video, nơi 45 phút bài giảng đã nén là 804,7 MiB, tức lớn hơn.
Dòng đã nén: 128 × 1.000 × 1.800 / 8 = 28.800.000 byte, tức 27,5 MiB. Tỉ lệ nén 11,03 : 1. Đọc theo bit rate thì dòng thô chạy 1.411,2 kbps còn dòng đã nén chạy 128 kbps, và đúng tỉ lệ ấy hiện ra ở kích thước, vì thời lượng ở cả hai bên là như nhau.
Hạn 25 MB là 25.000.000 byte. Tệp 28.800.000 byte, nên nó vượt 3.800.000 byte, tức 3,6 MiB.
Tới đây khung không nói "hãy nén thêm". Nó nói hạ cái gì, xuống mức nào:
- bit rate: hạ từ 128 kbps xuống nhiều nhất 111 kbps, khi đó tệp còn 24.975.000 byte, tức 23,8 MiB;
- thời lượng: hạ từ 1.800 giây xuống nhiều nhất 1.562 giây, tức 26 phút 2 giây, khi đó tệp còn 24.992.000 byte.
Hai mốc đó không phải dò thử. Kích thước là bit rate × 1.000 × giây / 8, một đường thẳng qua gốc, nên đặt nó bằng hạn rồi giải là xong: 25.000.000 × 8 / (1.000 × 1.800) = 111,111, và vì bit rate là số nguyên nên mốc là 111.
Và khung nói thêm một điều dễ làm người ta mất cả buổi tối: ba tham số không giúp gì. Tần số lấy mẫu, độ sâu bit, số kênh, cả ba đổi kích thước thô nhưng không đổi một byte nào của tệp, vì tệp đang bị bit rate ghim cứng. Bấm sang đặt theo tỉ lệ nén thì cả ba sống lại ngay, vì lúc đó tệp là thô chia cho tỉ lệ.
Hai thang đơn vị, và vì sao 25 MB không phải 25 MiB
Chỗ này gây nhầm nhiều hơn mọi chỗ khác trong bài.
Một MB là 1.000.000 byte. Một MiB là 1.048.576 byte, tức 1024 × 1024. Ở bậc này hai thang lệch nhau 4,9%, và cách biệt lớn dần ở các bậc trên.
Nên hạn 25 MB, tức 25.000.000 byte, hiện ra trên thang 1024 là 23,8 MiB. Còn hạn 25 MiB là 26.214.400 byte. Cùng con số 25, hai hạn khác nhau 1.214.400 byte. Đúng cái tệp 28.800.000 byte đó vượt cả hai, nhưng khoảng vượt khác nhau, và đổi ô đơn vị của hạn trong khung là thấy ngay.
Khung này dùng thang 1024 cho mọi dung lượng, vì hệ điều hành đếm thế, và thang 1000 cho mọi bit rate, vì bộ nén nào cũng quote thế: 128 kbps là 128.000 bit mỗi giây, không phải 131.072.
Nén mất và nén không mất
Có hai họ nén, và chọn sai họ là lỗi tốn kém nhất trong cả bài.
Nén không mất đóng gói dữ liệu gọn hơn rồi lấy lại được đúng từng bit. PNG, ZIP, FLAC thuộc họ này. Nó không bao giờ làm tệp xấu đi, nhưng nó cũng không nén được nhiều: những gì nó ăn là phần lặp lại, ví dụ một vùng màu phẳng, một đường nét sắc, một khối chữ.
Nén mất bỏ hẳn một phần thông tin, chọn phần mà mắt người và tai người ít nhạy nhất. JPEG, MP3, H.264 thuộc họ này. Nó nén mạnh gấp nhiều lần, và cái nó bỏ thì không lấy lại được.
Phần lấy mẫu màu trong khung là chỗ đếm được chính xác của nén mất, nên đáng nhìn kỹ. Bấm sang tab ảnh, kịch bản 3.000 × 2.000 điểm:
| cách lấy mẫu màu | bit mỗi điểm ảnh | kích thước tệp ở 10 : 1 |
|---|---|---|
| 4:4:4, đủ màu | 24 | 1,7 MiB |
| 4:2:2, nửa màu ngang | 16 | 1,1 MiB |
| 4:2:0, một phần tư màu | 12 | 878,9 KiB |
Ảnh 3.000 × 2.000 có 6.000.000 điểm, nên ở mức đủ màu nó mang 12.000.000 mẫu màu. Mức 4:2:0 cho mỗi khối 2 × 2 điểm dùng chung một cặp mẫu màu, tức giữ lại một phần tư, nên số bit mỗi điểm tụt từ 24 xuống 8 × (1 + 2 × 0,25) = 12, đúng một nửa, trước khi bộ nén bắt đầu làm việc.
Đó là lần giảm rẻ nhất trong cả bảng, và nó không phải một thanh kéo nên rất dễ bị bỏ qua.
Lưu lại nhiều lần thì chất lượng tụt, nhưng tụt theo hình dạng nào
Câu "lưu lại nhiều lần bằng JPEG thì ảnh xấu dần" ai cũng nghe. Nó đúng, nhưng nói thế là chưa đủ chính xác, và mục 3 của khung cho thấy hình dạng thật.
Bỏ mẫu màu là một phép giao, không phải một phép cộng dồn. Lần lưu đầu ở 4:2:0 bỏ ba phần tư mẫu màu. Lần lưu thứ hai ở đúng 4:2:0 không bỏ thêm gì, vì những mẫu nó sẽ bỏ đã không còn ở đó nữa. Còn một lần lưu sau đó ở 4:4:4, hay ở PNG, thì giữ nguyên tất cả những gì nó nhận được, mà cái nó nhận được vẫn chỉ là một phần tư.
Chuỗi mặc định trong khung là JPEG 4:2:0, rồi JPEG 4:4:4, rồi PNG. Ba lần lưu, trong đó hai lần là nén mất. Kết quả: từ 12.000.000 mẫu màu còn 3.000.000, tức đã bỏ 9.000.000 mẫu. Và lần lưu thứ 1 là lần khắc nhất, nên hai lần lưu sau nó không bỏ thêm mẫu nào.
Nói gọn lại thành một câu dùng được: cái quyết định là lần lưu khắc nhất trong cả chuỗi, và không lần lưu nào sau đó trả lại được gì. Nên đổi định dạng cuối sang PNG để "cứu" một tấm ảnh đã qua JPEG là việc vô ích: khung vẫn in ra đúng 3.000.000 mẫu màu như trước. Ngoài ra PNG nén ảnh chụp kém hơn JPEG nên tệp thường phình lên, nhưng chuyện đó khung này không tính, nó chỉ đếm mẫu màu.
:::caution Chỗ mô hình này hẹp hơn thực tế Khung chỉ kế toán mẫu màu, phần đếm được chính xác của nén mất. Bộ nén thật còn lượng tử hoá hệ số biến đổi, và phần đó có hành vi cùng hình dạng: lưu lại ở đúng mức cũ thì gần như vô hại, lưu lại ở mức khắc hơn thì tệ thêm. Nên hãy đọc con số mẫu màu như một chặn dưới của thiệt hại, không phải toàn bộ thiệt hại. :::
Chọn định dạng theo việc, và hai cái bẫy quen
Quy tắc gọn: nội dung có chữ và đường nét thì chọn nén không mất, nội dung là ảnh chụp thì chọn nén mất. Lý do nằm ở chỗ mỗi họ nén ăn cái gì.
Ảnh chụp màn hình, biểu đồ, sơ đồ, ảnh có chữ đè lên: chúng gồm vùng màu phẳng và đường nét sắc. Nén không mất ăn rất tốt phần lặp lại đó, còn nén mất thì phá đúng chỗ nó không nên phá.
Ảnh chụp bằng máy ảnh: từng điểm mỗi điểm một màu hơi khác, gần như không có gì lặp lại. Nén không mất chẳng ăn được bao nhiêu, còn nén mất bỏ đi những khác biệt mắt không thấy.
Bẫy thứ nhất, chụp màn hình chứa chữ rồi lưu bằng nén mất. Chữ trên ảnh chụp màn hình là chỗ sáng và tối nằm sát nhau, thường lại có màu. Ở 4:2:0, mỗi khối 2 × 2 điểm dùng chung một cặp mẫu màu, nên viền chữ màu bị bôi ra và chữ đọc mỏi mắt. Bấm sang 4:2:0 trong khung để thấy con số: 12 bit mỗi điểm ảnh thay vì 24, tức ba phần tư mẫu màu đi mất, và đi mất ở đúng chỗ chữ. Khung chỉ đếm được số mẫu, nó không vẽ ra chỗ nhoè, nên phần "nhoè" ở đây là suy ra từ chỗ mẫu bị bỏ, không phải thứ khung đo.
Bẫy thứ hai, ảnh chụp mà lưu bằng nén không mất. Ngược lại hoàn toàn: tệp phình lên mà không đổi lấy gì. Đặt tỉ lệ nén về 1 : 1 trong khung, tức không nén gì cả, thì tệp là 17,2 MiB, còn ở 10 : 1 nó là 1,7 MiB. Mười lần, cho một khác biệt mà bạn phải phóng to mới thấy. Nói cho đúng: 1 : 1 là mức không nén, còn PNG thật thì vẫn nén được một phần, nên nó nằm đâu đó giữa hai con số ấy. Khung không biết chỗ đó ở đâu, vì nó phụ thuộc nội dung của chính tấm ảnh. Cách biết chắc là xuất thử cả hai rồi so kích thước thật.
Tệp mang theo cái bạn không định gửi
Một tệp không chỉ chứa nội dung. Nó chứa siêu dữ liệu, tức dữ liệu nói về dữ liệu, và phần này thường đi kèm mà bạn không biết.
Một tấm ảnh chụp bằng điện thoại thường mang: ngày giờ chính xác tới giây, tên máy và số hiệu máy, cài đặt lúc bấm, và toạ độ nơi bạn bấm máy. Một tệp văn bản thường mang: tên tác giả, tên tổ chức, và toàn bộ lịch sử sửa nếu bạn chưa tắt tính năng theo dõi.
Toạ độ ghim chặt tới đâu thì tính được, không cần đoán. Một độ kinh tuyến ở xích đạo dài khoảng 111,32 km, nên mỗi chữ số thập phân chia độ mịn cho 10:
- 2 chữ số thập phân ghim trong 1.113,2 m, tức một vùng cỡ một phường;
- 4 chữ số ghim trong 11,132 m, tức đúng căn nhà bạn đang đứng;
- 6 chữ số ghim trong 11,132 cm, tức đúng cái bàn;
- 8 chữ số ghim trong 0,111 cm, chặt hơn mọi máy dân dụng đo được.
Nếu tệp của bạn ghi 6 chữ số thập phân thì một tấm ảnh phòng trọ đăng lên mạng nói ra chỗ bạn ở chính xác tới cái bàn, dù trong ảnh không có gì nhận ra được. Đừng đoán tệp của mình ghi mấy chữ số: mở Thuộc tính của chính tệp đó ra đọc.
Việc phải làm rất ngắn: trước khi đăng công khai, xoá siêu dữ liệu. Trên Windows là chuột phải, Thuộc tính, Chi tiết, "Xoá thuộc tính và thông tin cá nhân". Trên điện thoại là tắt gắn vị trí trong cài đặt máy ảnh. Và đừng đoán ứng dụng nào xoá hộ bạn. Cách kiểm chắc chắn là tự gửi tệp cho chính mình qua đúng con đường bạn sắp dùng, tải lại về, rồi mở Thuộc tính ra đọc.
Chữ cũng nặng hơn bạn tưởng, và đây là lý do ô "byte mỗi ký tự" ở tab tài liệu không phải luôn bằng 1. Chuỗi Đại học có 7 ký tự nhưng chiếm 12 byte theo UTF-8, tức 1,714 byte mỗi ký tự: chữ Đ tốn 2 byte, ạ và ọ tốn 3 byte mỗi chữ, còn i, h, c và dấu cách mỗi cái 1 byte. Một trang tiếng Việt vì thế nặng hơn một trang tiếng Anh cùng số chữ.
Ngân sách dung lượng: khi hạ tới sàn vẫn không vừa
Phần hay nhất của khung là lúc câu trả lời là "không được".
Bấm kịch bản báo cáo 12 trang, hạn 2 MB. Phần chữ: 12 × 2.500 × 2 = 60.000 byte. Tám tấm ảnh nhúng: 8 × 1.800.000 = 14.400.000 byte. Tổng thô 14.460.000 byte, tức 13,8 MiB.
Nén phần chữ 3 : 1 còn 20.000 byte. Nhưng ảnh nhúng đã nén sẵn nên đi thẳng qua, thành ra cả tệp là 20.000 + 14.400.000 = 14.420.000 byte, vẫn 13,8 MiB. Tỉ lệ nén của cả tài liệu là 1,00 : 1. Nén một báo cáo đầy ảnh gần như không ăn gì, và bây giờ bạn thấy con số nói ra vì sao: 99,9% tệp này là dữ liệu ảnh.
Khung xếp sáu tham số thành hai nhóm, và bốn tham số nằm ở nhóm vô vọng:
- số trang: hạ hết xuống sàn 1 trang thì tệp vẫn còn 13,7 MiB. Riêng nó không cứu được, vì phần ảnh không phụ thuộc số trang;
- ký tự mỗi trang và byte mỗi ký tự: cùng lý do;
- tỉ lệ nén phần chữ: phần không nén được đã là 13,7 MiB, tức tự nó đã vượt hạn. Nén phần chữ mạnh tới đâu, kể cả về 0 byte, cũng không vừa.
Hai tham số còn lại thì cứu được, và mỗi cái có một mốc:
- số ảnh nhúng: hạ từ 8 xuống nhiều nhất 1 ảnh, khi đó tệp còn 1.820.000 byte, tức 1,7 MiB;
- byte mỗi ảnh nhúng: hạ từ 1.800.000 xuống nhiều nhất 247.500 byte, khi đó tệp đúng bằng 2.000.000 byte, tức khít hạn tới từng byte.
Mốc thứ hai đáng dừng lại một chút, vì nó cho thấy mốc là mốc thật. 8 × 247.500 + 20.000 = 2.000.000, vừa khít. Còn 8 × 247.501 + 20.000 = 2.000.008, vượt. Một byte thôi.
Video: chỗ nén không phải tuỳ chọn
Bấm kịch bản video bài giảng 45 phút để thấy con số làm người ta lặng đi.
Khung Full HD 1920 × 1080 ở 8 bit đủ màu là 1920 × 1080 × 24 / 8 = 6.220.800 byte, tức 5,9 MiB cho một khung hình. 45 phút ở 30 khung mỗi giây là 81.000 khung. Thô: 503.884.800.000 byte, tức 469,3 GiB.
Đã nén ở 2.500 kbps: 2.500 × 1.000 × 2.700 / 8 = 843.750.000 byte, tức 804,7 MiB. Tỉ lệ 597,20 : 1.
Với hạn 25 MB thì mốc thời lượng là 80 giây, tức 1 phút 20 giây, ở đó tệp đúng bằng 25.000.000 byte. Một bài giảng 45 phút không có cách nào đi qua cổng 25 MB. Đây là lúc câu trả lời đúng không phải "hạ tham số" mà là đổi cách làm: tải lên một nền tảng video rồi gửi đường dẫn.
Và để ý ba tham số ở nhóm vô ích: chiều rộng khung, chiều cao khung, số khung mỗi giây. Ở bit rate cố định, khung to hơn không làm tệp nặng hơn. Nó chỉ chia đúng số bit ấy cho nhiều điểm ảnh hơn, tức mỗi điểm ảnh được ít bit hơn. Khung không đo cái nhìn nên nó không nói video xấu hơn, nhưng ít bit cho cùng một nội dung thì bộ nén buộc phải bỏ đi nhiều hơn. Nên giữ khung 4K mà vẫn đặt bit rate của Full HD là một cách tự làm khó mình: ngân sách byte y nguyên, còn số điểm ảnh phải chia nhau ngân sách đó thì gấp bốn.
Kích thước thô là số học thuần: nó tính được chính xác tuyệt đối, và ba công thức trong bài này đủ dùng cho gần như mọi thứ bạn tạo ra. Kích thước sau nén thì có hai loại. Khi bit rate cố định thì nó cũng chính xác, vì số byte là một phép nhân không phụ thuộc nội dung. Khi bạn đặt một tỉ lệ nén thì đó là giả thuyết của bạn về nội dung của mình, không phải điều bộ nén nào bảo đảm: cùng một mức chất lượng, ảnh chụp bầu trời phẳng nén tốt hơn hẳn ảnh chụp bụi cây rậm lá. Nên khi cần biết chắc, hãy xuất thử một tệp rồi nhìn kích thước thật.
Còn khi tệp vượt hạn, đừng nén bừa. Hãy hỏi ba câu theo thứ tự: tham số nào thật sự đổi được kích thước tệp (ở bit rate cố định thì chỉ có hai), mốc của nó ở đâu (đặt kích thước bằng hạn rồi giải), và hạ tới sàn có vừa không (nếu không thì vấn đề nằm ở chỗ khác, không nằm ở mức nén).
Tự kiểm
- 1Bản ghi 30 phút của bạn nén ở 128 kbps ra 28.800.000 byte, vượt hạn 25 MB. Bạn nâng tần số lấy mẫu từ 44.100 Hz lên 96.000 Hz vì tưởng nó liên quan tới kích thước. Điều gì xảy ra với kích thước TỆP?
- 2Bạn lưu một tấm ảnh bằng JPEG 4:2:0, thấy nó nhoè, nên mở ra lưu lại thành PNG để cứu chất lượng. Kết quả là gì?
- 3Báo cáo của bạn có 60.000 byte chữ và 8 ảnh nhúng, mỗi ảnh 1.800.000 byte, tổng 14.420.000 byte, mà hạn nộp là 2 MB. Bạn nén phần chữ thật mạnh, từ 3 : 1 lên 20 : 1. Vì sao vẫn không vừa?