การเข้ารหัส VP9 HDR

วิดีโอ High Dynamic Range (HDR) เป็นเทคโนโลยีที่กำลังพัฒนา ปัจจุบันมีมาตรฐานหลายอย่างที่ค่อยๆ ปรับให้สอดคล้องกัน

ดูภาพรวมของวิวัฒนาการของวิดีโอ HDR ได้ที่บทความใน Wikipedia เรื่อง High-dynamic-range video

คุณใช้ FFmpeg ร่วมกับ VP9 เพื่อ (1) บีบอัดแหล่งที่มาของ HDR เป็นเอาต์พุตช่วงไดนามิกมาตรฐาน (SDR) หรือ (2) เพื่อจัดแพ็กเกจแหล่งที่มาของ HDR ใหม่เป็นรูปแบบ HDR ที่เหมาะกับเว็บได้

แหล่งที่มาของอินพุต

ปัจจุบันเมื่อเข้ารหัส HDR ด้วย VP9 คุณจะใช้ตัวแปลงรหัสที่มีความลึกของบิตสูง (10 บิต) ใดก็ได้ ที่ FFmpeg รองรับเป็นอินพุต (เช่น VP9 โปรไฟล์ 2 และ 3, H.264 (10 บิต), DNxHR, HEVC, ProRes และอื่นๆ) โปรดดูบทความอัปโหลดวิดีโอ High Dynamic Range (HDR) ในศูนย์ช่วยเหลือของ YouTube ด้วย

การเข้าถึงเอาต์พุตที่เข้ารหัส:

ปัจจุบันและโดยทั่วไปแล้ว อุปกรณ์เป้าหมายที่รองรับรวมถึงอุปกรณ์ที่ ถอดรหัส VP9 โปรไฟล์ 2 และส่งออกไปยังจอแสดงผล HDR ได้

  • Chromecast Ultra + ทีวีที่รองรับ HDR
  • Chrome 64 Canary ใน Windows 10 Fall Creators Update โดยเปิดใช้แฟล็ก HDR (นี่เป็นเครื่องมือแก้ไขข้อบกพร่องที่ดี)
  • ทีวี HDR ที่มี VP9 โปรไฟล์ 2
    • รุ่น HDR ของ Samsung ปี 2017 ทั้งหมด (รายการ flatpanelshd.com) และรุ่นปี 2016 ที่ขึ้นต้นด้วย "KS"
    • รุ่น HDR ของ LG ปี 2017 ทั้งหมด (รวมถึงรุ่น LG G6 บางรุ่นในปี 2016)
    • ในอุปกรณ์เคลื่อนที่ อุปกรณ์ที่รองรับ VP9 โปรไฟล์ 2 ที่เร่งด้วยฮาร์ดแวร์ การถอดรหัส HDR 10 บิต (Meizu Pro 7)
    • UHD Bluray ตั้งแต่ปี 2017

การตั้งค่าบรรทัดคำสั่ง FFmpeg เพื่อเปิดใช้ VP9 โปรไฟล์ 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_coefficients" ควรตั้งค่าให้สอดคล้องกับวิธีมาสเตอร์เนื้อหา (เช่น 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 คือเราขอแนะนำให้ใช้อัตราบิตที่สูงกว่าการเข้ารหัส SDR 8 บิตที่เทียบเท่ากัน 25-30% โดยปกติแล้วตัวอย่างจะกำหนดเป้าหมายที่ 18 Mbps คุณจะได้ผลลัพธ์ HDR ที่ดีด้วยอัตราบิต 12 Mbps พร้อมการปรับแต่งที่เหมาะสม

การเข้ารหัสดำเนินการในระบบ Ubuntu Linux ที่มีข้อกำหนดต่อไปนี้

  • โปรเซสเซอร์: 4x Intel(R) Core(TM) i5-6500 CPU @ 3.20GHz
  • หน่วยความจำ (RAM): 8060MB (ใช้ไป 1492MB)
  • กราฟิก: Intel HD Graphics 530 (Skylake GT2)
  • ระบบปฏิบัติการ: Ubuntu 16.04 LTS

แปลงเป็น YUV 4:2:0 10 บิต PQ

ตัวอย่าง 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.2 MB
ตัวอย่าง B1: 18Mbps 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 วินาที
  • ขนาดไฟล์ในดิสก์: 161MB
ตัวอย่าง B2: 18Mbps 1080p 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 **-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

แปลง HDR เป็น SDR ด้วยตารางค้นหา (LUT)

การแปลง HDR เป็น SDR ต้องใช้ตัวแปลงรหัสเพื่อทำความเข้าใจวิธีแมป ระดับความสว่างและสีไปยังพื้นที่สี BT.709 ที่เล็กลงและช่วงความสว่างที่ไม่ใช่ HDR ขอแนะนำให้ใช้ LUT ที่อธิบายวิธีทำการ แมปดังกล่าว ซึ่งมักจะเฉพาะเจาะจงกับเนื้อหา เพื่อให้ได้ผลลัพธ์ที่ดีที่สุด ตัวอย่าง C และ D แสดง วิธีใช้ LUT เราใช้ bt2020_to_bt709_example.cube

ตัวอย่าง ค: 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

แปลง HLG เป็น VP9 HLG10 10 บิต PQ

ต้องใช้แหล่งที่มา HLG เราใช้ไฟล์อินพุต strobe_scientist_hlg.mkv

ตัวอย่าง D: 18Mbps 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 วินาที
  • ขนาดไฟล์ในดิสก์: 165MB

สรุป

ไฟล์เอาต์พุตมีขนาดแตกต่างกัน อินพุตมีขนาด 4.3 GB

ตัวอย่าง เอาต์พุตเป้าหมาย ขนาดบนดิสก์ เวลาในการเข้ารหัส
A 6 Mbps 4k HDR ที่ไม่มีการปรับขนาด 51.2MB 142 ล้าน
B1 18Mbps 4k HDR ที่ไม่ปรับขนาด 161MB 213 ล้าน
B2 18 Mbps 1080 HDR ที่ปรับขนาดแล้ว 160MB 113 ม.
C HDR 18 Mbps เป็น SDR แบบไม่ปรับขนาด 165MB 124 เมตร
D การแปลง HLG 18 Mbps 165MB 168 ม.

โปรดทราบว่าเราขอแนะนำให้ใช้การเข้ารหัสแบบ 2 รอบสำหรับ HDR เนื่องจากแบบ 1 รอบอาจแตกต่างกันไปใน การกำหนดค่าบางอย่าง

เครื่องมือที่จำเป็นในการส่งสัญญาณ 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 วินาที