VP9 एचडीआर एन्कोडिंग

हाई डाइनैमिक रेंज (एचडीआर) वीडियो, एक नई टेक्नोलॉजी है. आज कई ऐसे स्टैंडर्ड मौजूद हैं जो धीरे-धीरे एक जैसे हो रहे हैं.

एचडीआर वीडियो के बारे में ज़्यादा जानकारी के लिए, Wikipedia का यह लेख पढ़ें: हाई-डाइनैमिक-रेंज वीडियो.

FFmpeg का इस्तेमाल VP9 के साथ किया जा सकता है. इससे (1) एचडीआर सोर्स को स्टैंडर्ड डाइनैमिक रेंज (एसडीआर) आउटपुट में कंप्रेस किया जा सकता है या (2) एचडीआर सोर्स को वेब-फ़्रेंडली एचडीआर फ़ॉर्मैट में फिर से पैक किया जा सकता है.

इनपुट सोर्स

फ़िलहाल, VP9 की मदद से एचडीआर को एन्कोड करते समय, FFmpeg के साथ काम करने वाले किसी भी हाई बिट डेप्थ (10-बिट) कोडेक का इस्तेमाल इनपुट के तौर पर किया जा सकता है.उदाहरण के लिए, VP9 प्रोफ़ाइल 2 और 3, H.264 (10-बिट), DNxHR, HEVC, ProRes वगैरह. YouTube के सहायता लेख हाई डाइनैमिक रेंज (एचडीआर) वाले वीडियो अपलोड करना भी पढ़ें.

कोड में बदले गए आउटपुट की पहुंच:

फ़िलहाल, टारगेट किए जा सकने वाले डिवाइसों में ऐसे सभी डिवाइस शामिल हैं जो VP9 प्रोफ़ाइल 2 को डिकोड कर सकते हैं और एचडीआर डिसप्ले पर आउटपुट दे सकते हैं.

  • Chromecast Ultra + एचडीआर की सुविधा वाला टीवी
  • Windows 10 Fall Creators Update पर Chrome 64 Canary, जिसमें एचडीआर फ़्लैग चालू है. (यह डीबग करने का एक अच्छा टूल है).
  • VP9 Profile 2 वाला कोई भी एचडीआर टीवी
    • Samsung के साल 2017 के सभी एचडीआर मॉडल (flatpanelshd.com की सूची) और "KS" से शुरू होने वाले साल 2016 के मॉडल
    • LG के साल 2017 के सभी एचडीआर मॉडल. साथ ही, LG G6 के साल 2016 के कुछ मॉडल
    • मोबाइल पर, ऐसे डिवाइसों पर जो हार्डवेयर-ऐक्सलरेटेड VP9 प्रोफ़ाइल 2 10-बिट एचडीआर डिकोड करने की सुविधा के साथ काम करते हैं (Meizu Pro 7)
    • 2017 की यूएचडी ब्लूर-रे

VP9 Profile 2 और HDR EOTF चालू करने के लिए FFmpeg कमांड-लाइन सेटिंग

FFmpeg को 10-बिट (या 12-बिट) के साथ बनाया जाना चाहिए.

यहां दिए गए उदाहरणों में, हमने 10-बिट सपोर्ट वाले स्टैटिक तौर पर बनाए गए ffmpeg का इस्तेमाल किया है. अपनी स्क्रिप्ट बनाने के लिए, हमारी बिल्ड स्क्रिप्ट का इस्तेमाल करें या FFmpeg की साइट पर दिए गए निर्देशों का पालन करें.

VP9 के साथ SMPTE 2084 (PQ EOTF) स्टैंडर्ड के लिए, एचडीआर एन्कोडिंग के लिए इस्तेमाल की जा सकने वाली FFmpeg कमांड लाइन यहां दी गई है:

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 एचडीआर के लिए, दो बार एन्कोड करना ज़रूरी है. इस उदाहरण में, पहले पास का आउटपुट /dev/null को भेजा जाता है. इसके बाद, दूसरे पास के दौरान इसे मेमोरी में प्रोसेस किया जाता है.
-pix_fmt yuv420p10le यह YUV 4:2:0 10-बिट पिक्सल फ़ॉर्मैट सेट करता है
-color_primaries 9 BT2020 ज़्यादा जानकारी के लिए, इस दस्तावेज़ का पांचवां और छठा पेज देखें.
-color_trc 16 16, ट्रांसफ़र की विशेषताओं को SMPTE 2084 पर सेट करता है. PQ 18 से, ट्रांसफ़र की विशेषताएं SMPTE 2086 HLG पर सेट होती हैं
-colorspace 9 colorspace, "matrix_coefficients" है. इसे इस तरह सेट किया जाना चाहिए कि कॉन्टेंट को मास्टर कैसे किया गया था. (उदाहरण के लिए, bt709, bt2020_ncl). इस उदाहरण में, bt2020_ncl के लिए 9 होना चाहिए. ज़्यादा जानकारी के लिए, इस दस्तावेज़ का पेज 12 देखें
-color_range 1 कलर रेंज (0 = तय नहीं है, 1 = mpeg/studio/tv, 2 = jpeg/full/pc)
-profile:v 2 एचडीआर के लिए, प्रोफ़ाइल या 2 या 3 ज़रूरी है.
-vcodec libvpx-vp9 VP9 एन्कोडर का इस्तेमाल करें.

उदाहरण के तौर पर एन्कोड किए गए

नीचे दिए गए सभी उदाहरणों में, सोर्स फ़ाइल strobe_scientist.mkv का इस्तेमाल किया गया है

एचडीआर एन्कोडिंग के लिए बिटरेट के बारे में सामान्य जानकारी के तौर पर, हमारा सुझाव है कि 8-बिट एसडीआर एन्कोडिंग के मुकाबले, 25 से 30% ज़्यादा बिटरेट का इस्तेमाल करें. आम तौर पर, उदाहरणों में 18 एमबीपीएस को टारगेट किया जाता है. ऑप्टिमल ट्यूनिंग के साथ 12 एमबीपीएस बिटरेट पर, एचडीआर के अच्छे नतीजे पाए जा सकते हैं.

एनकोड, Ubuntu Linux सिस्टम पर किए गए थे. इसकी खास बातें यहां दी गई हैं:

  • प्रोसेसर: 4x Intel(R) Core(TM) i5-6500 CPU @ 3.20GHz
  • मेमोरी (रैम): 8060 एमबी (1492 एमबी इस्तेमाल की गई)
  • ग्राफ़िक्स: Intel HD Graphics 530 (Skylake GT2)
  • ओएस: Ubuntu 16.04 LTS

YUV 4:2:0 10-बिट PQ में बदलें

उदाहरण A: 6 एमबीपीएस 4K 2-पास
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 एमबी
उदाहरण B1: 18 एमबीपीएस 4K 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 -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 एमबी
उदाहरण B2: 18 एमबीपीएस 1080 पिक्सल 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 एमबी

लुक-अप टेबल (एलयूटी) की मदद से, एचडीआर को एसडीआर में बदलना

एचडीआर को एसडीआर में बदलने के लिए, ट्रांसकोडर को यह समझना होगा कि ब्राइटनेस लेवल और रंगों को छोटे BT.709 कलर स्पेस और नॉन-एचडीआर ब्राइटनेस रेंज में कैसे मैप किया जाए. बेहतर नतीजों के लिए, एलयूटी का इस्तेमाल किया जा सकता है. इसमें बताया जाता है कि मैपिंग कैसे की जाती है. आम तौर पर, यह कॉन्टेंट के हिसाब से तय होता है. उदाहरण C और D में, एलयूटी का इस्तेमाल करने का तरीका दिखाया गया है. हमने bt2020_to_bt709_example.cube का इस्तेमाल किया

तीसरा उदाहरण: एलयूटी के साथ 18 एमबीपीएस 4K एचडीआर से एसडीआर
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 एमबी

HLG को VP9 HLG10 10-बिट PQ में बदलें

इसके लिए, एचएलजी सोर्स की ज़रूरत होती है. हमने इनपुट फ़ाइल strobe_scientist_hlg.mkv का इस्तेमाल किया

चौथा उदाहरण: 18 एमबीपीएस 4K 2-पास एचएलजी
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 एमबी

खास जानकारी

आउटपुट फ़ाइलें अलग-अलग साइज़ की होती हैं. इनपुट 4.3 जीबी का था.

उदाहरण टारगेट आउटपुट डिस्क पर साइज़ कोड में बदलने में लगा समय
A 6 एमबीपीएस 4K अनस्केल्ड एचडीआर 51.2 एमबी 14.2 करोड़
B1 18 एमबीपीएस 4K अनस्केल्ड एचडीआर 161MB 213 मी
B2 18 एमबीपीएस 1080 पिक्सल स्केल किया गया एचडीआर 160 एमबी 113 मी
C एचडीआर से एसडीआर में बिना स्केल किए गए 18 एमबीपीएस 165 एमबी 124 मी
D 18 एमबीपीएस HLG कन्वर्ज़न 165 एमबी 168 मी

ध्यान दें कि एचडीआर के लिए, दो पास वाली एन्कोडिंग का इस्तेमाल करने का सुझाव दिया जाता है. ऐसा इसलिए, क्योंकि एक पास वाली एन्कोडिंग कुछ कॉन्फ़िगरेशन में अलग-अलग हो सकती है.

WebM और MP4 आउटपुट में एचडीआर सिग्नल देने के लिए ज़रूरी टूल (Matroska कमांड-लाइन टूल)

यह जानकारी लिखते समय, FFmpeg में WebM/MKV फ़ाइल में SMPTE 2086 स्टैटिक मेटाडेटा तय करने का कोई तरीका उपलब्ध नहीं है. हालांकि, अगर इनपुट स्ट्रीम में यह मेटाडेटा मौजूद है, तो FFmpeg इसे आगे बढ़ाएगा.

अगर आपके ऐप्लिकेशन को इस मेटाडेटा की ज़रूरत है, तो mkvmerge टूल का इस्तेमाल करके इसे डाला या बदला जा सकता है. यह टूल, mkvtoolnix का हिस्सा है.

यहां ऊपर बनाई गई फ़ाइलों में से किसी एक में एचडीआर मेटाडेटा डालने का उदाहरण दिया गया है. यह खास तौर पर, 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 सेकंड में बनाया गया है.