การเข้ารหัส 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
ตัวอย่าง 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
ตัวอย่าง 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

แปลง 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

สรุป

ไฟล์เอาต์พุตมีขนาดแตกต่างกันไป อินพุตคือ 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 วินาที