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

हाई डाइनैमिक रेंज (एचडीआर) वीडियो एक परिपक्व तकनीक है. आज कई तरह के नुकसान पहुंचाने वाले मानक बन रहे हैं.

एचडीआर वीडियो में समय-समय पर होते बदलाव के बारे में जानने के लिए, WikiPedia से जुड़ा लेख देखें ज़्यादा डाइनैमिक रेंज वाले वीडियो.

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

इनपुट स्रोत

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

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

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

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

VP9 प्रोफ़ाइल 2 और एचडीआर EOTF को चालू करने के लिए, FFmpeg कमांड-लाइन सेटिंग

आपका FFmpeg, 10-बिट (या 12-बिट) के साथ भी बनाया जाना चाहिए.

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

एचडीआर एन्कोडिंग के लिए, SMPTE 2084 (PQ EOTF) के स्टैंडर्ड के हिसाब से एक FFmpeg कमांड लाइन है. इस मानक का इस्तेमाल 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

यहां दिए गए मुख्य पैरामीटर को अलग-अलग करें:

आमने-सामने 10-बिट की सुविधा वाले स्टैटिक बिल्ड
-pass 1 एचडीआर के लिए दो पास की एन्कोडिंग ज़रूरी है. इस उदाहरण में, पहला पास /dev/null का आउटपुट है और दूसरे पास के दौरान मेमोरी में प्रोसेस होता है.
-pix_fmt yuv420p10le YUA 4:2:0 10-बिट पिक्सल फ़ॉर्मैट सेट करता है
-color_primaries 9 BT2020 ज़्यादा जानकारी के लिए, इस दस्तावेज़ का पांचवां और छठा पेज देखें
-color_trc 16 16, SMPTE 2084 में ट्रांसफ़र की विशेषताएं सेट करता है. PQ 18 सेट विशेषताएं ट्रांसफ़र करें SMPTE 2086 HLG
-colorspace 9 colorspace &kot;matics_coefficiencys.&कोटेशन; इसे कॉन्टेंट में मास्टर करने के तरीके के हिसाब से सेट किया जाना चाहिए. (उदाहरण के लिए, bt709, bt2020_ncl). इस उदाहरण में, 9 को bt2020_ncl के लिए होना चाहिए. ज़्यादा जानकारी के लिए इस दस्तावेज़ का 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% ज़्यादा बिटरेट का सुझाव दिया जाता है. आम तौर पर, उदाहरण 18Mbps को टारगेट करते हैं. अच्छे एचडीआर नतीजे पाने के लिए, 12 एमबीपीएस बिटरेट के साथ सबसे बेहतर ट्यूनिंग की जा सकती है.

एन्कोड करने के लिए, Ubuntu Linux सिस्टम पर इन विशेषताओं का इस्तेमाल किया गया था:

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

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

उदाहरण A: 6Mbps 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: 18Mbps का 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
उदाहरण B2: 18Mbps 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

लुक-अप टेबल (LUT) के साथ एचडीआर को एसडीआर में बदलें

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

उदाहरण C: LUT के साथ 18Mbps 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

उदाहरण 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 सेकंड
  • डिस्क पर फ़ाइल का साइज़: 165 एमबी

खास जानकारी

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

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

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

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

लिखने के दौरान, FFmpeg, WebM/MKV में SMPTE 2086 स्टैटिक मेटाडेटा के बारे में बताने का काम नहीं करता. हालांकि, यह स्ट्रीम किसी स्ट्रीम स्ट्रीम में शामिल होने पर, इसे इनपुट स्ट्रीम से लागू कर देगा.

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

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

इस उदाहरण में, 0.6 सेकंड में HDR_strobe_scientist_18Mbps.mkv फ़ाइल बनाई गई है.