Những gì bạn đã tính là bitrate cho một video thô, không nén. Bạn thường không tìm thấy những thứ này ngoại trừ trong nghiên cứu hoặc các ứng dụng chuyên dụng khác. Ngay cả các đài truyền hình cũng sử dụng video nén, mặc dù tốc độ bit cao hơn nhiều so với video YouTube thông thường của bạn.
Vì vậy, chất lượng video có liên quan nhiều đến cách nén video. Bạn càng nén nó, càng mất ít bit trên mỗi khung. Ngoài ra, bạn càng nén, chất lượng càng tệ. Bây giờ, một số video dễ nén hơn nhiều so với các video khác - về bản chất, đây là lý do tại sao chúng có tốc độ bit thấp hơn mặc dù chúng có cùng độ phân giải và tốc độ khung hình.
Để hiểu lý do tại sao, bạn cần lưu ý về hai nguyên tắc chính sử dụng nén video. Chúng được gọi là "không gian" và "dự phòng thời gian".
Dự phòng không gian
Sự dư thừa không gian tồn tại trong các hình ảnh hiển thị nội dung tự nhiên. Đây là lý do JPEG hoạt động rất tốt - nó nén dữ liệu hình ảnh vì các khối pixel có thể được mã hóa cùng nhau. Đây là 8 × 8 pixel, ví dụ. Chúng được gọi là "macroblocks".
Các codec video hiện đại cũng làm như vậy: Về cơ bản, chúng sử dụng các thuật toán tương tự JPEG để nén khung hình, từng khối. Vì vậy, bạn không lưu trữ bit trên mỗi pixel nữa, nhưng bit trên macroblock, vì bạn "tóm tắt" pixel thành các nhóm lớn hơn. Bằng cách tóm tắt chúng, thuật toán cũng sẽ loại bỏ thông tin không thể nhìn thấy bằng mắt người - đây là nơi bạn có thể giảm hầu hết tốc độ bit. Nó hoạt động bằng cách định lượng dữ liệu. Điều này sẽ giữ lại các tần số dễ nhận biết hơn và "vứt bỏ" những tần số chúng ta không thể nhìn thấy. Yếu tố lượng tử hóa được biểu thị là "QP" trong hầu hết các codec và đó là núm điều khiển chính cho chất lượng.
Bây giờ bạn thậm chí có thể tiếp tục và dự đoán các macroblocks từ các macroblocks đã được mã hóa trước đó trong cùng một hình ảnh. Điều này được gọi là dự đoán nội bộ . Ví dụ, một phần của bức tường màu xám đã được mã hóa ở góc trên bên trái của khung, vì vậy chúng ta có thể sử dụng macroblock đó trong cùng một khung một lần nữa, ví dụ cho macroblock ngay bên cạnh nó. Chúng tôi sẽ chỉ lưu trữ sự khác biệt so với trước đó và lưu dữ liệu. Theo cách này, chúng ta không phải mã hóa hai macroblocks rất giống nhau.
Tại sao bitrate thay đổi cho cùng kích thước hình ảnh? Vâng, một số hình ảnh dễ mã hóa hơn những hình ảnh khác. Hoạt động không gian càng cao, bạn càng phải thực sự mã hóa. Kết cấu mịn chiếm ít bit hơn so với chi tiết. Điều tương tự cũng xảy ra đối với dự đoán nội bộ: Một khung của một bức tường màu xám sẽ cho phép bạn sử dụng một macroblock để dự đoán tất cả những cái khác, trong khi một khung nước chảy có thể không hoạt động tốt.
Dự phòng tạm thời
Điều này tồn tại bởi vì một khung theo khung khác có lẽ rất giống với khung trước của nó. Hầu hết, chỉ cần một chút thay đổi nhỏ, và sẽ không có ý nghĩa gì khi mã hóa nó hoàn toàn. Những gì các bộ mã hóa video làm chỉ là mã hóa sự khác biệt giữa hai khung hình tiếp theo, giống như chúng có thể làm cho các macroblocks.
Lấy một ví dụ từ bài viết của Wikipedia về bù chuyển động , giả sử đây là khung ban đầu của bạn:
Sau đó, sự khác biệt cho khung hình tiếp theo chỉ là:
Bộ mã hóa bây giờ chỉ lưu trữ các khác biệt thực tế , không phải các giá trị pixel-by-pixel. Đây là lý do tại sao các bit được sử dụng cho mỗi khung hình không giống nhau mỗi lần. Các khung "khác biệt" này phụ thuộc vào khung được mã hóa hoàn toàn và đây là lý do tại sao có ít nhất hai loại khung cho codec hiện đại:
Thỉnh thoảng bạn cần chèn I-frames vào video. Tốc độ bit thực tế cũng phụ thuộc vào số lượng khung hình I được sử dụng. Hơn nữa, sự khác biệt về chuyển động giữa hai khung hình tiếp theo càng nhiều, bộ mã hóa càng phải lưu trữ. Một video "không có gì" di chuyển sẽ dễ mã hóa hơn một video thể thao và sử dụng ít bit hơn trên mỗi khung hình.