Từ điển

Pixel format là gì?

Định dạng pixel là cách video hoặc ảnh sắp xếp dữ liệu màu của từng pixel. Tìm hiểu các giá trị như yuv420p có ý nghĩa gì đối với tệp của bạn.

pixel-format

Định dạng pixel là cách bố trí từng pixel trong dữ liệu ảnh thô của hình ảnh hoặc video. Nó cho chương trình biết ảnh có những thành phần màu nào và mỗi thành phần dùng bao nhiêu bit.

Báo cáo video thường hiển thị trường này là pix_fmt, với giá trị như yuv420p. Một giá trị như vậy cho biết mô hình màu, chroma subsampling và độ sâu bit. Không gian màu là một trường riêng.

Những tệp nào chứa nó

Chương trình ffprobe của FFmpeg liệt kê pix_fmt cho từng luồng video. Điều này bao gồm các tệp MP4, MOV, MKV và WebM.

Hình ảnh cũng có giá trị này. FFmpeg gán yuvj420p cho JPEG lấy mẫu 4:2:0 và rgb24 cho PNG RGB 8 bit.

Một tệp âm thanh có ảnh bìa cũng có thể báo cáo định dạng pixel. FFmpeg xử lý bức ảnh đó như một luồng video.

ExifTool đọc một thẻ có tên PixelFormat từ các tệp Windows HD Photo (HDP và WDP). Nó hiển thị các giá trị như 24-bit RGB và 8-bit Gray.

Giá trị trông như thế nào

FFmpeg tạo tên từ các phần ngắn. Giá trị yuv420p10le có 5 phần:

  • yuv: mô hình màu. Y là độ sáng, còn U và V mang thông tin màu. U và V cũng được gọi là Cb và Cr, như trong YCbCr.
  • 420: lấy mẫu. Phần màu có nửa chiều rộng và nửa chiều cao so với dữ liệu độ sáng.
  • p: planar. Mỗi thành phần có một mặt phẳng riêng. Định dạng packed giữ các thành phần cùng nhau trong một mảng.
  • 10: số bit cho mỗi thành phần. Giá trị yuv420p không có số ở đây và dùng 8 bit.
  • le: thứ tự byte, little-endian. Hậu tố be có nghĩa là big-endian.

Các giá trị điển hình

Mỗi số bên dưới là số bit trung bình trên mỗi pixel trong dữ liệu ảnh thô:

  • yuv420p: 12 bit, màu có nửa chiều rộng và nửa chiều cao
  • yuv422p: 16 bit, màu có nửa chiều rộng
  • yuv444p: 24 bit, màu cho mọi pixel
  • yuvj420p: 12 bit, bố cục yuv420p với dải đầy đủ mà JPEG sử dụng
  • rgb24: 24 bit, red, green và blue dạng packed
  • rgba: 32 bit, có thêm giá trị alpha cho độ trong suốt
  • gray: 8 bit, chỉ độ sáng
  • pal8: 8 bit, mỗi giá trị trỏ đến một màu trong bảng màu

Ở dải đầy đủ, độ sáng 8 bit chạy từ 0 đến 255. Ở dải giới hạn, nó chạy từ 16 đến 235. FFmpeg khuyến nghị dùng một trường dải riêng thay cho các tên yuvj.

Giá trị đến từ đâu

Chương trình mã hóa luồng quyết định định dạng pixel. Trong FFmpeg, bạn chọn nó bằng tùy chọn -pix_fmt.

Tên này thường không được lưu trực tiếp trong tệp. Chương trình đọc tệp sẽ tạo tên dựa trên các chi tiết đã lưu.

Với H.264, FFmpeg dùng độ sâu bit và định dạng chroma trong header của luồng. Với PNG, FFmpeg dùng độ sâu bit và kiểu màu trong header của ảnh.

Tại sao điều này quan trọng đối với tệp của bạn

Định dạng pixel thiết lập kích thước dữ liệu ảnh thô. Một khung rgb24 có 24 bit trên mỗi pixel, và một khung yuv420p có 12. Sau đó codec sẽ nén dữ liệu này, nên các con số này không cho biết kích thước tệp cuối cùng.

Định dạng pixel cũng quyết định mức độ chi tiết màu mà tệp giữ lại. Mắt người nhìn thấy chi tiết độ sáng nhiều hơn rất nhiều so với chi tiết màu, nên 4:2:0 chỉ gây mất mát rất ít có thể nhìn thấy.

Nếu bạn chuyển từ 4:2:0 sang 4:4:4, chương trình sẽ tính các mẫu bị thiếu từ các mẫu lân cận. Chi tiết màu mà 4:2:0 đã loại bỏ vẫn bị mất.

Profile H.264 là một lý do khác để bạn kiểm tra giá trị này. Các profile Main và High hỗ trợ màu 8 bit với lấy mẫu 4:2:0.

Một luồng H.264 ở yuv444p hoặc yuv420p10le cần profile cao hơn. Quy định HLS của Apple yêu cầu H.264 ở profile High hoặc thấp hơn. YouTube khuyến nghị profile High với 4:2:0 cho video tải lên.

Meta Keys