การเข้ารหัส VP9 HDR
วิดีโอ High Dynamic Range (HDR) เป็นเทคโนโลยีที่เติบโตได้ ทุกวันนี้มีมาตรฐานต่างๆ ที่ค่อยๆ เป็นอันตราย
สําหรับภาพรวมวิวัฒนาการของวิดีโอ HDR ที่ยังคงอยู่ โปรดไปที่บทความ WikiPedia วิดีโอ High-dynamic-range
FFmpeg สามารถใช้ควบคู่กับ VP9 เพื่อบีบอัด (1) บีบอัดแหล่งที่มาของ HDR เป็นเอาต์พุตช่วงไดนามิกมาตรฐาน (SDR) หรือ (2) เพื่อจัดแพ็กเกจแหล่งที่มา HDR ใหม่เป็นรูปแบบที่เหมาะกับเว็บ HDR
แหล่งที่มาของอินพุต
ปัจจุบันเมื่อเข้ารหัส HDR ด้วย VP9 ตัวแปลงรหัสความลึกสูง (10 บิต) ที่รองรับโดย FFmpeg สามารถใช้เป็นอินพุต (เช่น VP9 Profile 2 และ 3, H.264 (10 บิต), DNxHR, HEVC, ProRes และ al) และอ่านบทความสนับสนุนของ YouTube อัปโหลดวิดีโอ High Dynamic Range (HDR)
การเข้าถึงเอาต์พุตที่เข้ารหัส:
ปัจจุบันอุปกรณ์เป้าหมายที่รองรับมีอุปกรณ์ที่ถอดรหัสโปรไฟล์ VP9 2 และเอาต์พุตเป็นจอแสดงผล HDR ได้
- Chromecast Ultra + ทีวีที่รองรับ HDR
- Chrome 64 Canary สําหรับการอัปเดต Windows 10 สําหรับครีเอเตอร์โดยเปิดใช้การติดธง HDR (นี่เป็นเครื่องมือแก้ไขข้อบกพร่องที่ดี)
- ทีวี HDR ที่มีโปรไฟล์ VP9 2
- Samsung 2017 HDR ทุกรุ่น (รายการ Flatpanelshd.com) และรุ่นปี 2016 ที่ขึ้นต้นด้วย "KS"
- LG 2017 HDR ทุกรุ่น (และ LG G6 บางรุ่นในปี 2016)
- บนอุปกรณ์เคลื่อนที่ อุปกรณ์ที่รองรับ VP9 Profile 2 แบบเร่งฮาร์ดแวร์ การถอดรหัส HDR 10 บิต (Meizu Pro 7)
- UHDเบลอ จากปี 2017
การตั้งค่าบรรทัดคําสั่ง FFmpeg เพื่อเปิดใช้ VP9 Profile 2 และ HDR EOTF
FFmpeg จะต้องสร้างขึ้นด้วยการรองรับแบบ 10 บิต (หรือ 12 บิต)
ในตัวอย่างด้านล่าง เราใช้ ffmpeg
ที่สร้างขึ้นแบบคงที่พร้อมการรองรับ 10 บิต
คุณอาจใช้สคริปต์การสร้างเพื่อสร้างเว็บของคุณเอง หรือปฏิบัติตามคําแนะนําในเว็บไซต์ FFmpeg
ต่อไปนี้เป็นบรรทัดคําสั่ง FFmpeg ที่ใช้งานได้สําหรับการเข้ารหัส HDR ให้เป็นมาตรฐาน SMPTE 2084 (PQ EOTF) ที่มี 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
รายละเอียดพารามิเตอร์สําคัญที่แนะนําที่นี่
ffmpeg | บิลด์แบบคงที่พร้อมการรองรับ 10 บิต |
---|---|
-pass 1 |
HDR ต้องมีการเข้ารหัส 2 ทาง ในตัวอย่างนี้ บัตรแรกจะเป็นเอาต์พุตไปยัง /dev/null และประมวลผลในหน่วยความจําระหว่างการส่งครั้งที่ 2 |
-pix_fmt yuv420p10le |
ตั้งค่ารูปแบบพิกเซล YUV 4:2:0 10 บิต |
-color_primaries 9 |
ตั้งค่า BT2020 ดูหน้า 5 และ 6 ของเอกสารนี้สําหรับรายละเอียดเพิ่มเติม |
-color_trc 16 |
16 กําหนดลักษณะการถ่ายโอนเป็น SMPTE 2084 PQ 18 กําหนดลักษณะการถ่ายโอน SMPTE 2086 HLG |
-colorspace 9 |
colorspace คือ "matrix_coefficiencys." ควรมีการตั้งค่าให้สอดคล้องกับเนื้อหาที่มีการมาสเตอร์ริ่ง (เช่น bt709, bt2020_ncl) ในตัวอย่างนี้ ควรเป็น 9 สําหรับ bt2020_ncl โปรดดูข้อมูลอ้างอิงเพิ่มเติมในหน้า 12 ของเอกสารนี้ |
-color_range 1 |
ช่วงสี (0 = ไม่ระบุ, 1 = mpeg/studio/tv, 2 = jpeg/full/pc) |
-profile:v 2 |
สําหรับ HDR จะต้องมีโปรไฟล์หรือ 2 หรือ 3 |
-vcodec libvpx-vp9 |
ใช้โปรแกรมเปลี่ยนไฟล์ VP9 |
ตัวอย่างการเข้ารหัส
ตัวอย่างต่อไปนี้ใช้ไฟล์แหล่งที่มา strobe_scientist.mkv
เราขอแนะนําว่าอัตราบิตทั่วไปที่มีการเข้ารหัส HDR นั้นแนะนําให้ใช้อัตราบิต 25-30% เมื่อเทียบกับการเข้ารหัส SDR แบบ 8 บิตที่เทียบเท่า ตัวอย่างนี้มักกําหนดเป้าหมาย 18 Mbps ผลลัพธ์ HDR ที่ดีจะต้องมีอัตราบิต 12 Mbps เพื่อปรับแต่งอย่างเหมาะสม
เข้ารหัสในระบบ Ubuntu Linux ที่มีข้อกําหนดเฉพาะดังนี้
- โปรเซสเซอร์: Intel(R) Core(TM) i5-6500 CPU 4 เท่า ที่ 3.20 GHz
- หน่วยความจํา (RAM): 8060 MB (ใช้แล้ว 1492 MB)
- กราฟิก: Intel HD Graphics 530 (Skylake GT2)
- OS: Ubuntu 16.04 LTS
แปลงเป็น YUV 4:2:0 PQ 10 บิต
ตัวอย่าง A: 6Mbps 4k 2-pass
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
- ไฟล์เอาต์พุต: 2pass_HDR_strobe_scientist_6Mbps-static.webm
- เวลาเข้ารหัส: 142 นาที 30 วินาที
- ขนาดไฟล์บนดิสก์: 51.2MB
ตัวอย่าง B1: 18 Mbps 4k 2-pass
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
- ไฟล์เอาต์พุต: 2pass_HDR_strobe_scientist_18Mbps-static.webm
- เวลาเข้ารหัส: 213 ม. 32
- ขนาดไฟล์บนดิสก์: 161 MB
ตัวอย่าง B2: 18 Mbps 1080p 2 ครั้ง
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
- ไฟล์เอาต์พุต: 1080_2pass_HDR_strobe_scientist_18Mbps-static.webm
- เวลาเข้ารหัส: 113 นาที 9 วินาที
- ขนาดไฟล์บนดิสก์: 160 MB
แปลง HDR เป็น SDR ด้วยตารางค้นหา (LUT)
การแปลง HDR เป็น SDR ต้องอาศัยการแปลงรหัสเพื่อทําความเข้าใจวิธีแมประดับความสว่างและสีกับพื้นที่สี BT.709 ที่เล็กกว่าและความสว่างที่ไม่ใช่ HDR เพื่อให้ได้ผลลัพธ์ที่ดีที่สุด LUT สามารถอธิบายวิธีการแมปข้อมูลดังกล่าว ซึ่งมักเป็นเนื้อหาที่เฉพาะเจาะจง ตัวอย่าง C และ D จะแสดงวิธีใช้ LUT เราใช้bt2020_to_bt709_example.cube
ตัวอย่าง C: 18Mbps 4k HDR เป็น SDR พร้อม 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
- ไฟล์เอาต์พุต: SDR_strobe_scientist_18Mbps-static.webm
- เวลาเข้ารหัส: 124 ม. 23 วินาที
- ขนาดไฟล์บนดิสก์: 165 MB
แปลง HLG เป็น VP9 HLG10 PQ แบบ 10 บิต
ต้องใช้แหล่งที่มา HLG เราใช้ไฟล์อินพุต strobe_scientist_hlg.mkv
ตัวอย่าง 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
- ไฟล์เอาต์พุต: HLG_HDR_strobe_scientist_18Mbps-static.webm
- เวลาเข้ารหัส: 186 ม. 10 วินาที
- ขนาดไฟล์บนดิสก์: 165 MB
สรุป
ไฟล์เอาต์พุตมีขนาดแตกต่างกันไป อินพุตคือ 4.3 GB
ตัวอย่าง | เอาต์พุตเป้าหมาย | ขนาดบนดิสก์ | เวลาเข้ารหัส |
---|---|---|---|
A | HDR ที่ไม่ได้ปรับสัดส่วนขนาด 6 Mbps | 51.2MB | 142 นาที |
วิตามินบี 1 | HDR ที่ไม่ได้ปรับสัดส่วนขนาด 18 Mbps | 161MB | 213 เมตร |
วิตามินบี 2 | 18Mbps 1080 HDR | 160MB | 113 นาที |
C | 18Mbps HDR เป็น SDR ที่ไม่มีการปรับสเกล | 165MB | 124 นาที |
วัน | Conversion ของ HLG ขนาด 18 Mbps | 165MB | 168 เมตร |
โปรดทราบว่าแนะนําให้ใช้การเข้ารหัส 2 บัตรผ่านสําหรับ HDR เนื่องจาก 1-Pass อาจแตกต่างกันไปในแต่ละการกําหนดค่า
เครื่องมือที่จําเป็นในการส่งสัญญาณ HDR ในเอาต์พุต WebM และ MP4 (เครื่องมือบรรทัดคําสั่ง Matroska)
ขณะเขียน FFmpeg ไม่มีกลไกสําหรับการระบุข้อมูลเมตาแบบคงที่ของ SMPTE 2086 ใน WebM/MKV แม้ว่าจะเผยแพร่จากสตรีมอินพุตเมื่อสตรีมมีก็ตาม
เครื่องมือ mkvmerge ซึ่งเป็นส่วนหนึ่งของ mkvtoolnix ใช้เพื่อแทรกหรือแก้ไขข้อมูลเมตานี้ได้หากแอปพลิเคชันจําเป็นต้องใช้
ตัวอย่างของการแทรกข้อมูลเมตา HDR ลงในไฟล์ที่สร้างขึ้นข้างต้นมีดังนี้ ซึ่งเหมาะสําหรับการเตรียมเนื้อหา HDR สําหรับอัปโหลดไปยัง 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
ตัวอย่างนี้จะสร้างไฟล์ HDR_strobe_scientist_18Mbps.mkv ภายใน 0.6 วินาที