קידוד VP9 HDR
סרטונים עם טווח דינמי גבוה (HDR) הם טכנולוגיה מתפתחת. כיום יש מספר סטנדרטים שמתואמים בהדרגה.
כדי לקבל תמונה עדכנית של התפתחות סרטוני HDR, אפשר לעיין במאמר High-dynamic-range video בוויקיפדיה.
אפשר להשתמש ב-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 Profile 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 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 |
הגדרת פורמט פיקסלים YUV 4:2:0 10-bit |
-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: מומלץ להשתמש בקצב העברת נתונים גבוה ב-25-30% מקידוד SDR שווה ערך של 8 ביט. הדוגמאות בדרך כלל מכוונות למהירות של 18Mbps. אפשר להשיג תוצאות טובות של HDR עם קצב העברת נתונים של 12Mbps בעזרת כוונון אופטימלי.
הקידודים בוצעו במערכת 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-bit PQ
דוגמה א': 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.2MB
דוגמה 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
- קובץ פלט: 1080_2pass_HDR_strobe_scientist_18Mbps-static.webm
- זמן הקידוד: 113 דקות ו-9 שניות
- גודל הקובץ בדיסק: 160MB
המרת HDR ל-SDR באמצעות טבלת חיפוש מידע (LUT)
כדי להמיר HDR ל-SDR, המקודד צריך להבין איך למפות את רמות הבהירות והצבעים למרחב הצבעים הקטן יותר BT.709 ולטווח הבהירות שאינו HDR. כדי לקבל את התוצאות הטובות ביותר, אפשר להשתמש בטבלת בדיקת מידע שמתארת איך לבצע את המיפוי הזה – בדרך כלל ספציפית לתוכן. בדוגמאות ג' ו-ד' מוצג אופן השימוש בטבלת LUT. השתמשנו ב-bt2020_to_bt709_example.cube
דוגמה ג': 18Mbps 4k HDR to SDR with 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 שניות
- גודל הקובץ בדיסק: 165MB
המרת HLG ל-VP9 HLG10 10-bit PQ
נדרש מקור HLG. השתמשנו בקובץ הקלט strobe_scientist_hlg.mkv
דוגמה ד': 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.3GB.
דוגמה | פלט היעד | גודל בדיסק | זמן הקידוד |
---|---|---|---|
A | 6Mbps 4k Unscaled HDR | 51.2MB | 142 מ' |
B1 | HDR באיכות 4k ללא שינוי גודל, 18Mbps | 161MB | 213 מ' |
B2 | 18Mbps 1080 HDR עם שינוי גודל | 160MB | 113 מ' |
C | 18Mbps HDR to SDR unscaled | 165MB | 124m |
D | המרת HLG בקצב העברה של 18Mbps | 165MB | 168 מ' |
שימו לב: מומלץ להשתמש בקידוד דו-שלבי ל-HDR, כי קידוד חד-שלבי יכול להשתנות בהגדרות מסוימות.
כלים שנדרשים כדי לסמן 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 שניות.