Mã hoá HDR VP9
Video có Dải động cao (HDR) là một công nghệ đang phát triển. Ngày nay, có một số tiêu chuẩn đang dần được hài hoà.
Để biết thông tin về sự phát triển của video HDR, hãy xem bài viết Video có dải động cao trên Wikipedia.
Bạn có thể sử dụng FFmpeg cùng với VP9 để (1) nén các nguồn HDR thành đầu ra Dải động tiêu chuẩn (SDR) hoặc (2) đóng gói lại một nguồn HDR thành các định dạng HDR thân thiện với web.
Nguồn đầu vào
Hiện tại, khi mã hoá HDR bằng VP9, bạn có thể dùng mọi bộ mã hoá và giải mã có độ sâu bit cao (10 bit) mà FFmpeg hỗ trợ làm dữ liệu đầu vào (ví dụ: VP9 Cấu hình 2 và 3, H.264 (10 bit), DNxHR, HEVC, ProRes, v.v.). Bạn cũng có thể xem bài viết Tải video có Dải động cao (HDR) lên trên trang hỗ trợ của YouTube.
Phạm vi tiếp cận của đầu ra được mã hoá:
Hiện tại và nói chung, các thiết bị mục tiêu được hỗ trợ bao gồm mọi thiết bị có thể giải mã VP9 Profile 2 và xuất ra màn hình HDR.
- Chromecast Ultra + TV có hỗ trợ HDR
- Chrome 64 Canary trên Windows 10 Fall Creators Update, với cờ HDR được bật. (Đây là một công cụ gỡ lỗi hiệu quả).
- Mọi TV HDR có Cấu hình VP9 2
- Tất cả các mẫu HDR của Samsung từ năm 2017 (danh sách trên flatpanelshd.com) và các mẫu từ năm 2016 bắt đầu bằng "KS"
- Tất cả các mẫu HDR của LG sản xuất năm 2017 (cũng như một số mẫu LG G6 sản xuất năm 2016)
- Trên thiết bị di động, những thiết bị hỗ trợ tính năng giải mã HDR 10 bit VP9 Cấu hình 2 được tăng tốc phần cứng (Meizu Pro 7)
- UHD Bluray từ năm 2017
Chế độ cài đặt dòng lệnh FFmpeg để bật VP9 Profile 2 và EOTF HDR
FFmpeg của bạn cần được tạo bằng chế độ hỗ trợ 10 bit (hoặc thậm chí là 12 bit).
Trong các ví dụ bên dưới, chúng ta sẽ sử dụng ffmpeg
được tạo tĩnh với khả năng hỗ trợ 10 bit.
Bạn có thể sử dụng tập lệnh xây dựng của chúng tôi để tạo tập lệnh của riêng mình hoặc làm theo hướng dẫn trên trang web FFmpeg.
Sau đây là một dòng lệnh FFmpeg có thể dùng để mã hoá HDR theo tiêu chuẩn SMPTE 2084 (PQ EOTF) bằng VP9:
ffmpeg -i strobe_scientist_18Mbps.webm -b:v 18000000 -pass 1 \
-pix_fmt yuv420p10le \
-color_primaries 9 -color_trc 16 -colorspace 9 -color_range 1 \
-maxrate 26800000 -minrate 8040000 -profile:v 2 -vcodec libvpx-vp9 /dev/null && \
ffmpeg -i strobe_scientist_18Mbps.webm -b:v 18000000 -pass 2 \
-pix_fmt yuv420p10le \
-color_primaries 9 -color_trc 16 -colorspace 9 -color_range 1 \
-maxrate 26800000 -minrate 8040000 -profile:v 2 -vcodec libvpx-vp9 \
strobe_scientist_18Mbps.webm
Sau đây là các tham số chính được giới thiệu ở đây:
ffmpeg | Bản dựng tĩnh có hỗ trợ 10 bit |
---|---|
-pass 1 |
HDR yêu cầu mã hoá 2 lượt. Trong ví dụ này, lượt truyền đầu tiên được xuất ra /dev/null và được xử lý trong bộ nhớ trong lượt truyền thứ hai. |
-pix_fmt yuv420p10le |
Đặt định dạng pixel YUV 4:2:0 10 bit |
-color_primaries 9 |
Bộ BT2020 Xem trang 5 và 6 của tài liệu này để biết thêm thông tin chi tiết. |
-color_trc 16 |
16 đặt Đặc tính truyền dữ liệu thành SMPTE 2084. PQ 18 đặt Đặc tính truyền dữ liệu SMPTE 2086 HLG |
-colorspace 9 |
colorspace là "matrix_coefficients". Bạn nên đặt giá trị này nhất quán với cách nội dung được tạo. (ví dụ: bt709, bt2020_ncl). Trong ví dụ này, giá trị phải là 9 cho bt2020_ncl. Để biết thêm thông tin tham khảo, hãy xem trang 12 của tài liệu này |
-color_range 1 |
Dải màu (0 = không xác định, 1 = mpeg/studio/tv, 2 = jpeg/full/pc) |
-profile:v 2 |
Đối với HDR, bạn phải có một hồ sơ hoặc 2 hoặc 3 . |
-vcodec libvpx-vp9 |
Sử dụng bộ mã hoá VP9. |
Ví dụ về mã hoá
Tất cả các ví dụ sau đây đều sử dụng tệp nguồn strobe_scientist.mkv
Lưu ý chung về tốc độ bit khi mã hoá HDR: bạn nên dùng tốc độ bit cao hơn 25-30% so với tốc độ bit tương đương khi mã hoá SDR 8 bit. Các ví dụ thường nhắm đến 18 Mbps. Bạn có thể đạt được kết quả HDR tốt với tốc độ bit 12 Mbps khi điều chỉnh tối ưu.
Các bản mã hoá được thực hiện trên hệ thống Ubuntu Linux với các thông số kỹ thuật sau:
- Bộ xử lý: 4x Intel(R) Core(TM) i5-6500 CPU @ 3,20 GHz
- Bộ nhớ (RAM): 8060 MB (đã dùng 1492 MB)
- Đồ hoạ: Intel HD Graphics 530 (Skylake GT2)
- Hệ điều hành: Ubuntu 16.04 LTS
Chuyển đổi thành YUV 4:2:0 10 bit PQ
Ví dụ A: 6 Mbps 4k 2 lượt
ffmpeg -y -report -i strobe_scientist.mkv -b:v 6000000 -speed 4 -pass 1 \
-pix_fmt yuv420p10le \
-color_primaries 9 -color_trc 16 -colorspace 9 -color_range 1 \
-maxrate 8000000 -minrate 4000000 \
-profile:v 2 -vcodec libvpx-vp9 -f webm /dev/null && \
ffmpeg -y -report -i strobe_scientist.mkv -b:v 6000000 -pass 2 \
-pix_fmt yuv420p10le \
-color_primaries 9 -color_trc 16 -colorspace 9 -color_range 1 \
-maxrate 8000000 -minrate 4000000 \
-profile:v 2 -vcodec libvpx-vp9 \
2pass_HDR_strobe_scientist_6Mbps-static.webm
- Tệp đầu ra: 2pass_HDR_strobe_scientist_6Mbps-static.webm
- Thời gian mã hoá: 142 phút 30 giây
- Kích thước tệp trên đĩa: 51,2 MB
Ví dụ B1: 18 Mbps 4k 2 lượt truyền
ffmpeg -y -report -i strobe_scientist.mkv -b:v **18000000** -speed 4 -pass 1 \
-pix_fmt yuv420p10le \
-color_primaries 9 -color_trc 16 -colorspace 9 -color_range 1 \
-maxrate **20800000** -minrate **15040000** \
-profile:v 2 -vcodec libvpx-vp9 -f webm /dev/null && \
ffmpeg -y -report -i strobe_scientist.mkv -b:v 18000000 -pass 2 \
-pix_fmt yuv420p10le \
-color_primaries 9 -color_trc 16 -colorspace 9 -color_range 1 \
-maxrate **20800000** -minrate **15040000** \
-profile:v 2 -vcodec libvpx-vp9 \
2pass_HDR_strobe_scientist_18Mbps-static.webm
- Tệp đầu ra: 2pass_HDR_strobe_scientist_18Mbps-static.webm
- Thời gian mã hoá: 213 phút 32 giây
- Kích thước tệp trên đĩa: 161 MB
Ví dụ B2: 18 Mbps 1080p 2 lượt truyền
ffmpeg -y -report -i strobe_scientist.mkv -b:v 18000000 -speed 4 -pass 1 \
-pix_fmt yuv420p10le \
-color_primaries 9 -color_trc 16 -colorspace 9 -color_range 1 \
-maxrate 20800000 -minrate 15040000 \
-profile:v 2 **-vf ****scale=-1:1080**** **-vcodec libvpx-vp9 \
-f webm /dev/null && \
ffmpeg -y -report -i strobe_scientist.mkv -b:v 18000000 -pass 2 \
-pix_fmt yuv420p10le \
-color_primaries 9 -color_trc 16 -colorspace 9 -color_range 1 \
-maxrate 20800000 -minrate 15040000 \
-profile:v 2 **-vf ****scale=-1:1080**** **-vcodec libvpx-vp9 \
1080_2pass_HDR_strobe_scientist_18Mbps-static.webm
- Tệp đầu ra: 1080_2pass_HDR_strobe_scientist_18Mbps-static.webm
- Thời gian mã hoá: 113 phút 9 giây
- Kích thước tệp trên đĩa: 160 MB
Chuyển đổi HDR sang SDR bằng bảng tra cứu (LUT)
Để chuyển đổi HDR sang SDR, bộ chuyển mã cần hiểu cách liên kết các mức độ sáng và màu sắc với hệ màu BT.709 nhỏ hơn và dải độ sáng không phải HDR. Để có kết quả tốt nhất, bạn có thể sử dụng một LUT mô tả cách thực hiện việc ánh xạ đó (thường dành riêng cho nội dung). Ví dụ C và D cho thấy cách sử dụng LUT. Chúng tôi đã sử dụng bt2020_to_bt709_example.cube
Ví dụ C: 18 Mbps 4K HDR sang SDR có LUT
ffmpeg -i strobe_scientist.mkv -y -b:v 18000000 -speed 4 -pass 1 \
-pix_fmt yuv420p \
-color_primaries 1 -color_trc 1 -colorspace 1 -color_range 1 \
-maxrate 26800000 -minrate 8040000 -profile:v 0 \
-vf scale=-1:-1:in_color_matrix=bt2020,format=rgb48,lut3d=bt2020_to_bt709_example.cube,scale=-1:-1:out_color_matrix=bt709 \
-vcodec libvpx-vp9 -f webm /dev/null && \
ffmpeg -i strobe_scientist.mkv -y -b:v 18000000 -pass 2 \
-pix_fmt yuv420p \
-color_primaries 1 -color_trc 1 -colorspace 1 -color_range 1 \
-maxrate 26800000 -minrate 8040000 -profile:v 0 \
-vf scale=-1:-1:in_color_matrix=bt2020,format=rgb48,lut3d=bt2020_to_bt709_example.cube,scale=-1:-1:out_color_matrix=bt709 \
-vcodec libvpx-vp9 -f webm SDR_strobe_scientist_18Mbps-static.webm
- Tệp đầu ra: SDR_strobe_scientist_18Mbps-static.webm
- Thời gian mã hoá: 124 phút 23 giây
- Kích thước tệp trên đĩa: 165 MB
Chuyển đổi HLG sang VP9 HLG10 10 bit PQ
Cần có nguồn HLG. Chúng tôi đã sử dụng tệp đầu vào strobe_scientist_hlg.mkv
Ví dụ D: 18 Mbps 4k 2-Pass HLG
ffmpeg -y -i strobe_scientist_hlg.mkv -b:v 18000000 -pass 1 -speed 4 \
-pix_fmt yuv420p10le \
-color_primaries 9 -color_trc 18 -colorspace 9 -color_range 1 \
-maxrate 26800000 -minrate 8040000 \
-profile:v 2 -vcodec libvpx-vp9 -f webm /dev/null && \
ffmpeg -y -i strobe_scientist_hlg.mkv -b:v 18000000 -pass 2 \
-pix_fmt yuv420p10le \
-color_primaries 9 -color_trc 18 -colorspace 9 -color_range 1 \
-maxrate 26800000 -minrate 8040000 \
-profile:v 2 -vcodec libvpx-vp9 \
HLG_HDR_strobe_scientist_18Mbps-static.webm
- Tệp đầu ra: HLG_HDR_strobe_scientist_18Mbps-static.webm
- Thời gian mã hoá: 186 phút 10 giây
- Kích thước tệp trên đĩa: 165 MB
Tóm tắt
Các tệp đầu ra có nhiều kích thước. Tệp đầu vào có dung lượng 4,3 GB.
Ví dụ: | Đầu ra mục tiêu | Dung lượng trên đĩa | Thời gian mã hoá |
---|---|---|---|
A | 6 Mb/giây 4K HDR chưa được điều chỉnh tỷ lệ | 51,2 MB | 142 triệu |
B1 | HDR 4K không được mở rộng 18 Mb/giây | 161MB | 213m |
B2 | HDR được điều chỉnh tỷ lệ 1080 18 Mb/giây | 160MB | 113m |
C | HDR 18 Mbps sang SDR không được chia tỷ lệ | 165MB | 124m |
D | Chuyển đổi HLG 18 Mbps | 165MB | 168 triệu |
Xin lưu ý rằng bạn nên dùng phương pháp mã hoá 2 lượt cho HDR, vì phương pháp 1 lượt có thể khác nhau trong một số cấu hình.
Các công cụ cần thiết để báo hiệu HDR trong đầu ra WebM và MP4 (các công cụ dòng lệnh Matroska)
Tại thời điểm viết bài này, FFmpeg không cung cấp cơ chế để chỉ định siêu dữ liệu tĩnh SMPTE 2086 trong WebM/MKV, mặc dù FFmpeg sẽ truyền siêu dữ liệu đó từ luồng đầu vào khi luồng chứa siêu dữ liệu đó.
Bạn có thể dùng công cụ mkvmerge (một phần của mkvtoolnix) để chèn hoặc sửa đổi siêu dữ liệu này nếu ứng dụng của bạn yêu cầu.
Sau đây là ví dụ về cách chèn siêu dữ liệu HDR vào một trong các tệp được tạo ở trên. Công cụ này đặc biệt phù hợp để chuẩn bị nội dung HDR để tải lên YouTube.
mkvmerge \
-o HDR_strobe_scientist_18Mbps.mkv\
--colour-matrix 0:9 \
--colour-range 0:1 \
--colour-transfer-characteristics 0:16 \
--colour-primaries 0:9 \
--max-content-light 0:1000 \
--max-frame-light 0:300 \
--max-luminance 0:1000 \
--min-luminance 0:0.01 \
--chromaticity-coordinates 0:0.68,0.32,0.265,0.690,0.15,0.06 \
--white-colour-coordinates 0:0.3127,0.3290 \
HDR_strobe_scientist_18Mbps.webm
Ví dụ này tạo ra tệp HDR_strobe_scientist_18Mbps.mkv trong 0,6 giây.