رمزگذاری VP9 HDR

ویدئو با محدوده دینامیکی بالا (HDR) یک فناوری در حال بلوغ است. امروزه تعدادی استاندارد وجود دارد که به تدریج هماهنگ می شوند.

برای یک تصویر ثابت از تکامل ویدیوی HDR به مقاله ویکی‌پدیا با برد دینامیکی بالا مراجعه کنید .

از FFmpeg می‌توان به همراه VP9 برای (1) فشرده‌سازی منابع HDR به خروجی‌های محدوده دینامیکی استاندارد (SDR) یا (2) برای بسته‌بندی مجدد منبع HDR در قالب‌های سازگار با وب HDR استفاده کرد.

منابع ورودی

در حال حاضر، هنگام رمزگذاری HDR با VP9، هر کدک با عمق بیت بالا (10 بیتی) که توسط FFmpeg پشتیبانی می شود، می تواند به عنوان ورودی استفاده شود (به عنوان مثال، VP9 Profile 2 و 3، H.264 (10 بیت)، DNxHR، HEVC، ProRes ، و همکاران). همچنین مقاله پشتیبانی YouTube آپلود ویدیوهای محدوده دینامیکی بالا (HDR) را ببینید.

دسترسی خروجی رمزگذاری شده:

در حال حاضر و به طور کلی، دستگاه های هدف پشتیبانی شده شامل هر دستگاهی است که می تواند VP9 Profile 2 را رمزگشایی کند و به یک صفحه نمایش HDR خروجی دهد.

  • تلویزیون با قابلیت Chromecast Ultra + HDR
  • Chrome 64 Canary در Windows 10 Fall Creators Update، با پرچم HDR روشن است. (این یک ابزار اشکال زدایی خوب است).
  • هر تلویزیون HDR با نمایه VP9 2
    • همه مدل‌های سامسونگ 2017 HDR ( لیست flatpanelshd.com ) و مدل‌های 2016 که با «KS» شروع می‌شوند
    • همه مدل های HDR 2017 ال جی (همچنین برخی از مدل های LG G6 2016)
    • در تلفن همراه، دستگاه‌هایی که از رمزگشایی 10 بیتی HDR VP9 Profile 2 با شتاب سخت‌افزاری پشتیبانی می‌کنند ( Meizu Pro 7 )
    • UHD Bluray محصول 2017

تنظیمات خط فرمان FFmpeg برای فعال کردن VP9 Profile 2 و HDR EOTFs

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 نیاز به رمزگذاری ۲ پاس دارد. در این مثال، پاس اول به /dev/null خروجی می شود و در طول پاس دوم در حافظه پردازش می شود.
-pix_fmt yuv420p10le فرمت پیکسلی 10 بیتی YUV 4:2:0 را تنظیم می کند
-color_primaries 9 مجموعه BT2020 برای جزئیات بیشتر به صفحه 5 و 6 این سند مراجعه کنید.
-color_trc 16 16 مجموعه ویژگی های انتقال به SMPTE 2084. PQ 18 مجموعه ویژگی های انتقال SMPTE 2086 HLG
-colorspace 9 colorspace "ضریب_ماتریس" است. این باید مطابق با نحوه تسلط بر محتوا تنظیم شود. (به عنوان مثال، bt709، bt2020_ncl). در این مثال برای bt2020_ncl باید 9 باشد. برای ارجاع بیشتر به صفحه 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 مگابیت در ثانیه را هدف قرار می دهند. نتایج HDR خوبی را می توان با نرخ بیت 12 مگابیت در ثانیه با تنظیم بهینه به دست آورد.

کدها بر روی یک سیستم لینوکس اوبونتو با مشخصات زیر انجام شده است:

  • پردازنده: 4x Intel(R) Core(TM) i5-6500 CPU @ 3.20GHz
  • حافظه (رم): 8060 مگابایت (1492 مگابایت استفاده شده)
  • گرافیک: Intel HD Graphics 530 (Skylake GT2)
  • سیستم عامل: اوبونتو 16.04 LTS

تبدیل به YUV 4:2:0 10 بیتی PQ

مثال A: 6 مگابیت در ثانیه 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: 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
مثال 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 استفاده کردیم

مثال C: 18 مگابیت بر ثانیه 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

خلاصه

فایل های خروجی اندازه های متفاوتی دارند. ورودی 4.3 گیگابایت بود.

مثال خروجی هدف اندازه روی دیسک زمان را رمزگذاری کنید
آ 6Mbps 4k HDR بدون مقیاس 51.2 مگابایت 142 متر
B1 HDR بدون مقیاس 18 مگابیت بر ثانیه 4k 161 مگابایت 213 متر
B2 18 مگابیت در ثانیه 1080 HDR مقیاس شده 160 مگابایت 113 متر
سی 18 مگابیت بر ثانیه HDR تا SDR بدون مقیاس 165 مگابایت 124 متر
D تبدیل 18 مگابیت بر ثانیه HLG 165 مگابایت 168 متر

توجه داشته باشید که رمزگذاری 2-pass برای 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 ثانیه تولید می کند.