ה-WebReceiver SDK תומכת בשלושה סוגים של פרוטוקולי הסטרימינג כיום:
DASH, HTTP פעיל סטרימינג, ו סטרימינג חלק.
במסמך הזה מפורטת התמיכה שלנו בכל אחד מהפרוטוקולים לסטרימינג. הערה ההסבר לגבי תגים נתמכים לכל פרוטוקול הוא די קצר. בהשוואה למפרט הפרוטוקול המפורט. המטרה היא לספק הצצה מהירה והבנה לגבי אופן השימוש בכל פרוטוקול, ואילו תכונות של הפרוטוקולים נתמכים במכשירים שתומכים ב-Cast כדי לספק של סטרימינג.
סטרימינג דינמי דינמי ב-HTTP (DASH)
של ISO המפרט המפורט של DASH.
DASH הוא פרוטוקול סטרימינג בקצב העברת נתונים דינמי שמאפשר לערוך וידאו באיכות גבוהה
סטרימינג דרך שרתי HTTP(S). מניפסט שמורכב ב-XML מכיל את רוב
של פרטי המטא-נתונים לצורך אתחול והורדה של הסרטון
תוכן. מושגי המפתח שנגן האינטרנט של מקלט האינטרנט תומך הם <Period>
,
<AdaptationSet>
, <Representation>
, <SegmentTemplate>
,
<SegmentList>
, <BaseUrl>
ו-<ContentProtection>
.
מניפסט DASH מתחיל בתג <MPD>
ברמה הבסיסית (root) ובתוכו כולל תג אחד או
יותר תגי <Period>
, שמייצגים תוכן סטרימינג אחד.
תגי <Period>
מאפשרים לסדר חלקים שונים של תוכן בסטרימינג
ולעיתים קרובות הם משמשים להפרדה בין תוכן ראשי למודעה או
תוכן וידאו רצופים.
<AdaptationSet>
מתחת ל-<MPD>
הוא קבוצת ייצוגים של
סוג אחד של שידור מדיה – ברוב המקרים, וידאו, אודיו או כתוביות. במידה הרבה ביותר
סוגי ה-mimetype הנתמכים הם "video/mp4", "audio/mp4" ו-"text/vtt".
אפשר לכלול את <ContentComponent contentType="$TYPE$">
האופציונליים
מתחת ל-<AdaptationSet>
.
בתוך כל <AdaptationSet>
צריכה להופיע רשימה של <Representation>
תגים
נוכחים והנגן של מקלט האינטרנט משתמש במידע של codecs
כדי
לאתחל את מאגר הנתונים הזמני של MSE ואת המידע של bandwidth
כדי
לבחור באופן אוטומטי את הייצוג/קצב העברת הנתונים המתאימים להפעלה.
עבור כל <Representation>
, אפשר לתאר קטעי מדיה באמצעות
<BaseURL>
לייצוג של קטע יחיד, <SegmentList>
בשביל
רשימת פלחים (דומה ל-HLS) או <SegmentTemplate>
.
עבור <SegmentTemplate>
, הוא מציין איך פלח האתחול וגם
אפשר לייצג קטעי מדיה באמצעות יצירת תבניות. בדוגמה הבאה
$Number$
מציין את מספר הפלח שזמין מה-CDN. אז אפשר
מתורגמת ל-seg1.m4s, ל-seg2.m4s וכו' ככל שההפעלה נמשכת.
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:ns2="http://www.w3.org/1999/xlink"
profiles="urn:mpeg:dash:profile:isoff-live:2011,http://dashif.org/guidelines/dash264" type="static"
publishTime="2016-10-05T22:07:14.859Z" mediaPresentationDuration="P1DT0H0M0.000S" minBufferTime="P0DT0H0M7.500S">
<Period id="P0">
<AdaptationSet lang="en" segmentAlignment="true">
<ContentComponent id="1" contentType="audio"/>
<SegmentTemplate media="seg$Number$.m4s" initialization="seginit.mp4"
duration="10000" startNumber="1" timescale="1000" presentationTimeOffset="0"/>
<Representation id="1" bandwidth="150123" audioSamplingRate="44100"
mimeType="audio/mp4" codecs="mp4a.40.2" startWithSAP="1">
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
<BaseURL>http://www.google.com/testVideo</BaseURL>
</Representation>
</AdaptationSet>
<AdaptationSet segmentAlignment="true">
<ContentComponent id="1" contentType="video"/>
<SegmentTemplate media="seg$Number$.m4s" initialization="seginit.mp4"
duration="10000" startNumber="1" timescale="1000" presentationTimeOffset="0"/>
<Representation id="1" bandwidth="212191" width="384" height="208" sar="26:27"
frameRate="25" mimeType="video/mp4" codecs="avc1.42c01f" startWithSAP="1">
<BaseURL>http://www.google.com/testVideo/bitrate1/</BaseURL>
</Representation>
<Representation id="1" bandwidth="366954" width="512" height="288" sar="1:1"
frameRate="25" mimeType="video/mp4" codecs="avc1.42c01f" startWithSAP="1">
<BaseURL>http://www.google.com/testVideo/bitrate2/</BaseURL>
</Representation>
<Representation id="1" bandwidth="673914" width="640" height="352" sar="44:45"
frameRate="25" mimeType="video/mp4" codecs="avc1.42c01f" startWithSAP="1">
<BaseURL>http://www.google.com/testVideo/bitrate3/</BaseURL>
</Representation>
</AdaptationSet>
</Period>
</MPD>
בשביל <SegmentTemplate>
, מקובל להשתמש בתג <SegmentTimeline>
כדי
לציין את האורך של כל קטע ואילו קטעים חוזרים על עצמו. timescale
(יחידות שמייצגת שנייה אחת) בדרך כלל נכללות
<SegmentTemplate>
, כך שנוכל לחשב את הזמן של הקטע על סמך
היחידה הזו. בדוגמה הבאה התג <S>
מציין תג פלח,
המאפיין d
מציין את אורך הקטע והמאפיין r
מציין כמה קטעים חוזרים על אותו משך זמן, כך ש-$Time$
יכול להיות מחושב כראוי להורדת קטע המדיה כפי שצוין
המאפיין media
.
<SegmentTemplate>
timescale="48000"
initialization="$RepresentationID$-init.dash"
media="$RepresentationID$-$Time$.dash"
startNumber="1">
<SegmentTimeline>
<S t="0" d="96256" r="2" />
<S d="95232" />
<S d="96256" r="2" />
<S d="95232" />
<S d="96256" r="2" />
</SegmentTimeline>
</SegmentTemplate>
דוגמה לייצוג באמצעות <SegmentList>
:
<Representation id="FirstRep" bandwidth="2000000" width="1280"
height="720">
<BaseURL>FirstRep/</BaseURL>
<SegmentList timescale="90000" duration="270000">
<RepresentationIndex sourceURL="representation-index.sidx"/>
<SegmentURL media="seg-1.ts"/>
<SegmentURL media="seg-2.ts"/>
<SegmentURL media="seg-3.ts"/>
</SegmentList>
</Representation>
בקובץ מקטע יחיד, בדרך כלל משתמשים ב-<SegmentBase>
עם בייט
בקשות טווח כדי לציין איזה חלק בקובץ <BaseURL>
מכיל את הפונקציה
של הסרטון, וניתן לאחזר את השאר לפי דרישה ככל שההפעלה נמשכת או
קורה. כאן הטווח Initialization
מציין את הטווח של תחילת המטא-נתונים
ו-indexRange
מציין את האינדקס של קטעי המדיה. שימו לב
כרגע אנחנו תומכים רק בטווחים של בייטים עוקבים.
<Representation bandwidth="4190760" codecs="avc1.640028"
height="1080" id="1" mimeType="video/mp4" width="1920">
<BaseURL>video.mp4<BaseURL>
<SegmentBase indexRange="674-1149">
<Initialization range="0-673" />
</SegmentBase>
</Representation>
בלי קשר לייצוג שבו ייעשה שימוש, אם הזרמים מוגנים,
הקטע <ContentProtection>
יכול להופיע בקטע <AdaptationSet>
,
schemeIdUri
משמש לזיהוי ייחודי של מערכת ה-DRM שבה צריך להשתמש.
אפשר לכלול מזהה מפתח אופציונלי להצפנה נפוצה.
<!-- Common Encryption -->
<ContentProtection
schemeIdUri="urn:mpeg:dash:mp4protection:2011"
value="cenc"
cenc:default_KID="7D2714D0-552D-41F5-AD56-8DD9592FF891">
</ContentProtection>
<!-- Widevine -->
<ContentProtection
schemeIdUri="urn:uuid:EDEF8BA9-79D6-4ACE-A3C8-27DCD51D21ED">
</ContentProtection>
דוגמאות ופרטים נוספים זמינים במפרט MPEG-DASH. בהמשך מופיעה רשימה של מאפייני DASH נוספים בתגים שלא צוינו למעלה שאנחנו תומכים בהם כרגע:
שם תכונה | פונקציה של מאפיין |
---|---|
mediaPresentationDuration | אורך תוכן הסרטון. |
minimumUpdatePeriod | מאפיין של התג <MPD> ; מציין באיזו תדירות אנחנו צריכים
כדי לטעון מחדש את המניפסט. |
סוג | מאפיין של התג <MPD> ; "דינמי" כדי לציין
זהו שידור חי. |
presentationTimeOffset | מאפיין של התג <SegmentBase> ; מציין את
הזמן שחלף מהקליק להמרה מתחילת התקופה. |
startNumber | מציינת את המספר של קטע המדיה הראשון במצגת של התקופה. ההגדרה הזו מופיעה לעיתים קרובות בשידורים חיים. |
אנחנו גם תומכים בזיהוי תיבת EMSG בתוך קטעי MP4 עבור DASH וכן
לספק
EmsgEvent
למפתחים.
בעוד שהנגן הנוכחי שלנו במקלט אינטרנט תומך בתרחישי השימוש העיקריים של DASH, כאן רשימה של מאפיינים נפוצים שההטמעה הנוכחית שלנו של DASH מתעלם או לא משתמש. כלומר, גם אם המניפסט מכיל להם אין השפעה על חוויית ההפעלה של התוכן.
- availabilityStartTime
- segmentAlignment
HTTP Live Streaming (HLS)
ניתן לקבל את הסקירה הכללית והמפרט המלא של סטרימינג בשידור חי ב-HTTP כאן.
אחת היתרונות העיקריים של הנגן של מקלט האינטרנט היא היכולת שלו לתמוך הפעלה של HLS ב-MSE. שונה מ-DASH, שבו מניפסט נכלל .HLS שולח את הפלייליסט הראשי המכיל רשימה של כל הווריאנטים בסטרימינג. בכתובת ה-URL המתאימה. הפלייליסט של הווריאנט הוא הפלייליסט של המדיה. שני הסוגים תגי HLS העיקריים שכרגע הנגן של מקלט האינטרנט תומך בהם פלייליסטים הם:
שם התג | פונקציונליות |
---|---|
#EXT-X-STREAM-INF | מציין קצב העברת נתונים או וריאנט של הווריאנט. המאפיין BANDWIDTH הוא
נדרש, שתומך בבחירת סטרימינג בקצב העברת נתונים מותאם.
מומלץ מאוד להשתמש במאפיין CODECS לאתחול MSE, כמו
בתור "avc1.42c01e,mp4a.40.2" . אם לא מציינים זאת, תרחיש ברירת המחדל הוא
מוגדר לווידאו בפרופיל הראשי H264 בגרסה 3.0 ולקידוד אודיו של "mp4a.40.2"
תוכן. |
#EXT-X-MEDIA | מציינת פלייליסט של מדיה נוספת (במאפיין URI )
שמייצג את התוכן. אלה בדרך כלל שידורי אודיו חלופיים
פורמט (צליל סראונד 5.1) או שפה. מאפיין של TYPE
שמכיל את VIDEO , AUDIO ,
מותר להשתמש ב-SUBTITLES או ב-CLOSED-CAPTIONS . ההגדרה
המאפיין DEFAULT של המאפיין YES מציין את הבחירה
השידור החלופי הזה כברירת מחדל. |
רשימה של תגי HLS שנתמכים כרגע ב-WebBard Player ב- הפלייליסט של המדיה:
שם התג | פונקציונליות |
---|---|
#EXTINF | מידע על מקורות הנתונים, בדרך כלל ואחריו משך הקטע ובשורה הבאה כתובת ה-URL של הקטע. |
#EXT-X-TARGETDURATION | האורך בשניות של כל קטע. זה גם קובע באיזו תדירות להוריד/לרענן את קובץ המניפסט של הפלייליסט של שידור חי. מכשיר האינטרנט הנגן לא תומך במשך זמן של פחות מ-0.1 שניות. |
#EXT-X-MEDIA-SEQUENCE | מספר הרצף (בדרך כלל בשידור חי) שבו הקטע הראשון שהפלייליסט הזה מייצג. |
#EXT-X-KEY | מידע על מפתח DRM. המאפיין METHOD מציין מהו המפתח
שבו צריך להשתמש. היום אנחנו תומכים ב-AES-128 וב-SAMPLE-AES
הקצר הזה. התשובות שלך יעזרו לנו להשתפר. |
#EXT-X-BYTERANGE | טווח הבייטים לאחזור עבור כתובת URL של מקטע. |
#EXT-X-DISCONTINUITY | מציינת אי-רציפות בין קטעים עוקבים. דבר כזה קורה לעיתים קרובות באמצעות הוספת מודעה בצד השרת, שבה פלח מודעות מופיע באמצע הראשי. |
#EXT-X-PROGRAM-DATE-TIME | הזמן האבסולוטי של הדגימה הראשונה של הפלח הבא, לדוגמה "2016-09-21T23:23:52.066Z". |
#EXT-X-ENDLIST | בין אם מדובר ב-VOD או בשידור חי. |
לשידור חי, אנחנו משתמשים ב-#EXT-X-PROGRAM-DATE-TIME
וב-#EXT-X-MEDIA-SEQUENCE
בתור הגורמים העיקריים כדי לקבוע איך למזג מניפסט שעבר רענון. אם המיקום
קיים, הפונקציה #EXT-X-PROGRAM-DATE-TIME
משמשת להתאמה של הקטעים המתעדכנים.
אחרת, ייעשה שימוש במספר של #EXT-X-MEDIA-SEQUENCE
. שימו לב שלפי ההוראות
מפרט HLS, אנחנו לא משתמשים בהשוואת שמות של קבצים לצורך התאמה.
בתהליך ההטמעה של פרוטוקול HLS אנחנו תומכים בבחירה של שידור אודיו חלופי, כמו
סראונד 5.1, להשמעת האודיו הראשית. כדי לעשות זאת, אפשר
תג #EXT-X-MEDIA
עם רכיבי קודק חלופיים, וגם לספק
פורמט הפלח בהגדרות של השידור.
הנגן של מקלט האינטרנט מצפה להתנהגות מסוימת בהתאם למפרט. לדוגמה, אחרי
#EXT-INF
, אנחנו מצפים ל-URI. אם זה לא URI, לדוגמה
#EXT-X-DISCOUNTINUITY
יגרום לניתוח להיכשל של הפלייליסט.
כל #EXT-X-TARGETDURATION
שניות, אנחנו טוענים מחדש את הפלייליסט/המניפסט כדי לקבל
רשימות חדשות של פלחים, ואנחנו מעדכנים את הייצוג הפנימי החדש של כל
לפלח החדש. בכל פעם שיש בקשה לדילוג, אנחנו מחפשים רק
טווח החיפוש. בזמן אמת, אנחנו מאפשרים לבצע חיפוש רק מתחילת
הרשימה החדשה ביותר עד למשך זמן יעד של שלושה יעדים. לדוגמה,
אם יש לכם רשימה של 10 פלחים ואתם נמצאים בפלח 6, תוכלו רק לחפש
ל-7, אבל לא ל-8.
תמיכה בפורמט הפלחים
CAF SDK תומך בהפעלת תוכן שמועבר בכמה פורמטים לפי הפניה
ב-HlsSegmentFormat
לאודיו ו-HlsVideoSegmentFormat
לסרטון. זה כולל תמיכה בתכונות
אודיו דחוס
כמו הפעלת AAC ו-AC3, גם בפורמט מוצפן וגם לא מוצפן. שדה חובה
כדי לציין את המידע הזה בMediaInformation
של LoadRequestData
כדי לתאר כראוי את התוכן שלך לנגן. אם לא צוין אחרת,
בהגדרת ברירת המחדל של הנגן יתבצע ניסיון להפעיל את התוכן בתור Transport
סטרימינג של תוכן ארוז. אפשר להגדיר את המאפיין הזה מכל אחד מהשולחים
נתוני בקשת טעינה (Android,
iOS
ואינטרנט)
או בתוך המקבל דרך מיירוט הודעות.
כדאי לבדוק את הקוד לדוגמה קטע הקוד שלמטה או טעינת מדיה באמצעות contentId, contentUrl ו-entity לקבלת מידע נוסף על הכנת תוכן במקלט האינטרנט.
playerManager.setMessageInterceptor(
cast.framework.messages.MessageType.LOAD, loadRequestData => {
...
// Specify segment format for an HLS stream playing CMAF packaged content.
loadRequestData.media.contentType = 'application/x-mpegurl';
loadRequestData.media.hlsSegmentFormat = cast.framework.messages.HlsSegmentFormat.FMP4;
loadRequestData.media.hlsVideoSegmentFormat = cast.framework.messages.HlsVideoSegmentFormat.FMP4;
...
return loadRequestData;
});
הגנה על תוכן
כפי שמצוין בקטע התגים #EXT-X-KEY
למעלה, ערכת ה-SDK של Cast תומכת
SAMPLE-AES
או SAMPLE-AES-CTR
כאשר URI למפתח הוא וקטור אתחול
אפשר לציין:
EXT-X-KEY: METHOD=SAMPLE-AES, \
URI="data:text/plain;base64,XXXXXX", \
IV=0x6df49213a781e338628d0e9c812d328e, \
KEYFORMAT="com.widevine", \
KEYFORMATVERSIONS="1"
השדה KEYFORMAT
שבו אנחנו תומכים עכשיו הוא Widevine, וה-URI מכיל
פרטי DRM בקידוד BASE64 XXXXXXX
, שכאשר הם מפוענחים, מכילים את מזהה המפתח:
{
"content_id": "MTQ1NjkzNzM1NDgxNA==",
"key_ids": [
"xxxxxxxxxxxxxxxx"
]
}
גרסה 1 מגדירה את המאפיינים הבאים:
מאפיין | דוגמה | תיאור |
---|---|---|
KEYFORMATVERSIONS |
"1" |
הצעה זו מגדירה את גרסה 1 של פורמט המפתח |
KEYFORMAT |
"urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed" |
UUID הוא ה-UUID של Widevine מ-DASH IF IOP. אותה מחרוזת מדויקת משמשת ב-MPD בשידורים שהוצפנו באמצעות Widevine. |
URI |
"data:text/plain;base64, <base64 encoded PSSH box>" |
ה-URI של מקור הנתונים שמכיל את סוג הנתונים ואת תיבת PSSH. |
METHOD |
SAMPLE-AES-CTR |
מציין את ההצפנה שבה נעשה שימוש להצפנת התוכן. דוגמה ל-AES מסמן שהתוכן מוצפן באמצעות 'cbcs'. דוגמה ל-AES-CTR על כך שהתוכן מוצפן באמצעות אחת משיטות ההגנות של AES-CTR, שנקראות cenc. |
מאפיינים שממופים ל-DASH MPD:
מאפיין | תיאור |
---|---|
KEYFORMAT |
מאפיין schemeIdUri של רכיב ContentProtection. |
URI |
התוכן של הרכיב cenc:pssh. |
KEYID |
מחרוזת הקסדצימלית בגודל 16 בייטים שמקודדת את מזהה המפתח שיש לו את אותו תפקיד כמו default_kid ב-MPEG DASH. אם משתמשים בסכימת מפתחות היררכית, זה יהיה 'הרמה הבסיסית' (root) מקש. |
דוגמה לפלייליסט HLS עם אות V2:
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:2
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-MAP:URI="init_segment.mp4"
#EXTINF:1.001,
output_video-1.mp4
#EXT-X-DISCONTINUITY
#EXT-X-KEY:METHOD=SAMPLE-AES,URI="data:text/plain;base64,AAAAPXBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAB0aDXdpZGV2aW5lX3Rlc3QiDHRlc3QgY29udGVudA==",KEYID=0x112233445566778899001122334455,KEYFORMAT="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed",KEYFORMATVERSION="1"
#EXTINF:1.001,
output_video-2.mp4
#EXTINF:0.734,
output_video-3.mp4
#EXT-X-ENDLIST
בהמשך מופיעה רשימה של תכונות ותגים ב-HLS שאנחנו לא משתמשים בהם כרגע או תמיכה. הנוכחות או אי-היעדרות שלהם לא משפיעים על התנהגות הסטרימינג.
- המערכת מתעלמת מהמאפיין
RESOLUTION=
ב-#EXT-X-STREAM-INF
. - המאפיין
AUTOSELECT=
ב-#EXT-X-MEDIA
לא בשימוש. במקום זאת, אנחנו מסתמכים עלDEFAULT=
- המערכת מתעלמת מ-
#EXT-X-I-FRAME-STREAM-INF
בפלייליסט הראשי. - המערכת מתעלמת מ-
#EXT-X-DISCONTINUITY-SEQUENCE
#EXT-X-PLAYLIST-TYPE:EVENT
יכול/ה להשתתף בשידור החי וגם#EXT-X-PLAYLIST-TYPE:VOD
יכול להופיע ב-VOD, אבל כרגע הנגן של מקלט האינטרנט מסתמך רק על קיומו של#EXT-X-ENDLIST
כדי לקבוע נגד 'שידורים חיים' VOD.
סטרימינג חלק
ההודעה הרשמית של Microsoft מפרט של סטרימינג חלק.
סטרימינג חלק מספק פרוטוקול סטרימינג אדפטיבי ומפרט XML ב-HTTP (בדומה ל-DASH). שונה מ-DASH, מומלץ להשתמש בתכונה 'סטרימינג חלקה' רק אריזת MPEG-4 עבור פלחי מדיה.
הנה טבלה של התגים והמאפיינים הנפוצים ביותר ב-Smooth Streaming הנגן של מקלט האינטרנט תומך כיום. הרבה מושגים כבר מוסברים במקטע DASH שלמעלה.
תג/מאפיין | שימוש |
---|---|
<SmoothStreamingMedia> | התג הראשי של המניפסט, מכיל מאפיינים של:
|
<StreamIndex> | קבוצה אחת של מקורות נתונים, בדומה ל-AdaptationSet של DASH. הסוג הוא בדרך כלל 'text', 'video' או 'audio'. המאפיין Url מכיל בדרך כלל תבנית כתובת URL עם פיצול במידע כמו קצב העברת נתונים או שעת התחלה. |
<QualityLevel> | כל תג QualityLevel מציין את קצב העברת הנתונים ו-codec של FinCC. ה-F4CC הקוד הוא בדרך כלל 'H264', 'AVC1', 'AACL' וכו'. בסרטונים מציינים רזולוציות דרך Maxwidth ו-MaxHeight. באודיו, הוא מציין בתדירות (למשל 44100) באמצעות SamplingRate ומספר הערוצים. |
<c> | רכיב מקטע בסטרימינג. מכיל:
|
<Protection> | תג עם מאפיין SystemID אופציונלי שבו מפורט מזהה המערכת ניהול זכויות דיגיטליות (DRM) לשימוש במסגרת <SmoothStreamingMedia> התיוג. |
<ProtectionHeader> | בקטע <Protection>, יכול להכיל מאפיין של SystemID ומאפיין מותאם אישית בדרך כלל בקידוד Base64. ב-Widevine, הוא יכיל את מזהה המפתח, המפתח length, את מזהה האלגוריתם, כמו AESCTR, LA_URL (כתובת האתר לרכישת רישיון), LUI_URL (כתובת ה-URL של ממשק המשתמש ברישיון) ו-DS_ID (מזהה שירות דומיין). |
הגנה על תוכן
כדי לקודד את המזהים של מערכת ההגנה בצורה תקינה, צריך להשתמש במיפוי הבא:
- WIDEVINE: 'EDEF8BA9-79D6-4ACE-A3C8-27DCD51D21ED',
- CLEARKEY: '1077EFEC-C0B2-4D02-ACE3-3C1E52E2FB4B',
- MPEG_DASH_MP4PROTECTION: 'URN:MPEG:DASH:MP4PROTECTION:2011'
למטה מוצגת דוגמה לנתונים בקידוד Base64 עבור <ProtectionHeader>
.
כאשר הנתונים מפוענחים, הם תואמים לאותו פורמט מפוענח שמתואר
למעלה יש תמיכה בהגנה על תוכן ב-DASH.
<Protection>
<ProtectionHeader SystemID="9a04f079-9840-4286-ab92-e65be0885f95">
$BASE64ENCODED_DATA
</ProtectionHeader>
</Protection>
בהמשך מוצגת דוגמה למניפסט של סטרימינג בשידור חי בצורה חלקה באורך 3,000 שניות משך התוכן:
<?xml version="1.0"?>
<SmoothStreamingMedia MajorVersion="2" MinorVersion="0" Duration="3000000000"
TimeScale="10000000" IsLive="TRUE" LookAheadFragmentCount="2" DVRWindowLength="600000000" CanSeek="TRUE" CanPause="TRUE">
<StreamIndex Type="text" Name="textstream301_swe" Language="swe" Subtype="CAPT" Chunks="0"
TimeScale="10000000" Url="QualityLevels({bitrate})/Fragments(textstream301_swe={start time})">
<QualityLevel Index="0" Bitrate="20000" CodecPrivateData="" FourCC="DFXP"/>
<c d="40000000" t="80649382288125"/>
<c d="39980000"/>
<c d="40020000"/>
</StreamIndex>
<Protection>
<ProtectionHeader> SystemID="$BASE64ENCODEDDRMDATA$"</ProtectionHeader>
</Protection>
<StreamIndex Type="audio" Name="audio101_eng" Language="eng" Subtype="AACL" Chunks="0"
TimeScale="10000000" Url="QualityLevels({bitrate})/Fragments(audio101_eng={start time})">
<QualityLevel Index="0" Bitrate="128000" CodecPrivateData="1290" FourCC="AACL" AudioTag="255"
Channels="2" SamplingRate="32000" BitsPerSample="16" PacketSize="4"/>
<c d="40000000" t="80649401327500"/>
<c d="40000000"/>
<c d="40000000"/>
</StreamIndex>
<StreamIndex Type="video" Name="video" Subtype="AVC1" Chunks="0" TimeScale="10000000"
Url="QualityLevels({bitrate})/Fragments(video={start time})">
<QualityLevel Index="0" Bitrate="400000" CodecPrivateData="000000016742E01596540C0EFCB808140000000168CE3880"
FourCC="AVC1" MaxWidth="384" MaxHeight="216"/>
<QualityLevel Index="1" Bitrate="800000" CodecPrivateData="00000001674D401E965281004B6020500000000168EF3880"
FourCC="AVC1" MaxWidth="512" MaxHeight="288"/>
<QualityLevel Index="2" Bitrate="1600000" CodecPrivateData="00000001674D401E965281B07BCDE020500000000168EF3880"
FourCC="AVC1" MaxWidth="854" MaxHeight="480"/>
<QualityLevel Index="3" Bitrate="2200000" CodecPrivateData="00000001674D401F96528080093602050000000168EF3880"
FourCC="AVC1" MaxWidth="1024" MaxHeight="576"/>
<c d="40000000" t="80649401378125"/>
<c d="40000000"/>
<c d="40000000"/>
</StreamIndex>
</SmoothStreamingMedia>
בדוגמה שלמעלה לשידור הווידאו, תבנית כתובת ה-URL היא:
QualityLevels({bitrate})/Fragments(video={start time})
לכן שני הפלחים הראשונים (בהנחה שאנחנו ברמת האיכות של אינדקס 2) יהיו הקטע הבא, עם הזמן הראשוני שחולץ מ-t="80649401378125" מתחת Video StreamIndex והפרש הזמן של 4 שניות * 10000000 לכל מקטע:
QualityLevels(2)/Fragments(video=80649401378125) QualityLevels(2)/Fragments(video=80649441378125) ...
הנה רשימה של מאפיינים מסוג 'סטרימינג חלק' (Smooth Streaming) שכרגע יש לנו להתעלם מהם אין השפעה על חוויות סטרימינג, גם אם הן סופקו:
- CanSeek, CanPause בתג
<SmoothStreamingMedia>
. - Chunks (צ'אטים), QualityLevels בתג
<StreamIndex>
. במקום זאת, אנחנו מחשבים מספר הפלחים ומספר רמות האיכות שמבוססים על מידע סופקו בתוך<StreamIndex>
, כמו התגQualityLevel
בפועל<c>
תגים. - BitsPerSample ו-PacketSize ב-
<QualityLevel>
לא בשימוש.
בדיקת סוג המסך
canDisplayType
בודקת את יכולות הווידאו והאודיו של המכשיר במקלט האינטרנט,
מוצג על ידי אימות הפרמטרים של המדיה שהועברו, החזרת ערך בוליאני. הכול
אבל הראשון הוא אופציונלי. ככל שתכללו יותר פרמטרים,
שהבדיקה תהיה מדויקת יותר.
החתימה שלו היא canDisplayType(<em>mimeType</em>,<em>codecs</em>,<em>width</em>,<em>height</em>,<em>framerate</em>)
לדוגמה:
הפונקציה בודקת אם המסך והמכשיר של מַקְלֵט האינטרנט תומכים בקובצי וידאו או ב-mp4 mimetype עם הקודק, המאפיינים וקצב הפריימים הספציפיים הבאים:
canDisplayType("video/mp4", "avc1.42e015,mp4a.40.5", 1920, 1080, 30)
בדיקה אם המכשיר והמסך של מקלט האינטרנט תומכים בפורמט וידאו 4K את הקודק הזה על ידי ציון הרוחב 3840 והגובה של 2160:
canDisplayType("video/mp4", "hev1.1.2.L150", 3840, 2160)
הפונקציה בודקת אם המסך והמכשיר של מַקְלֵט האינטרנט תומכים ב-HDR10 עבור הקודק הזה. מאפיינים וקצב פריימים:
canDisplayType("video/mp4", "hev1.2.6.L150", 3840, 2160, 30)
בדיקה אם המכשיר והמסך של מקלט האינטרנט תומכים ב-Dolby Vision (DV) עבור הקודק, המאפיינים וקצב הפריימים הבאים:
canDisplayType("video/mp4", "dvhe.04.06", 1920, 1080, 30)
ניהול זכויות דיגיטליות (DRM)
תכנים מסוימים של מדיה דורשים ניהול זכויות דיגיטלי (DRM). לתוכן מדיה
שרישיון ה-DRM (וכתובת ה-URL של המפתח) מאוחסנים במניפסט שלו (DASH או HLS),
מערכת Cast SDK מטפלת בפנייה הזו בשבילכם. קבוצת משנה של התוכן הזה דורשת
licenseUrl
שנדרש כדי לקבל את מפתח הפענוח. במקלט האינטרנט תוכלו להשתמש באפשרות
PlaybackConfig
כדי להגדיר את licenseUrl
לפי הצורך.
בקטע הקוד הבא מוסבר איך מגדירים פרטי בקשה לרישיון
בקשות כמו withCredentials
:
const context = cast.framework.CastReceiverContext.getInstance();
const playbackConfig = new cast.framework.PlaybackConfig();
// Customize the license url for playback
playbackConfig.licenseUrl = 'http://widevine/yourLicenseServer';
playbackConfig.protectionSystem = cast.framework.ContentProtection.WIDEVINE;
playbackConfig.licenseRequestHandler = requestInfo => {
requestInfo.withCredentials = true;
};
context.start({playbackConfig: playbackConfig});
// Update playback config licenseUrl according to provided value in load request.
context.getPlayerManager().setMediaPlaybackInfoHandler((loadRequest, playbackConfig) => {
if (loadRequest.media.customData && loadRequest.media.customData.licenseUrl) {
playbackConfig.licenseUrl = loadRequest.media.customData.licenseUrl;
}
return playbackConfig;
});
אם יש לכם שילוב עם Google Assistant, חלק מפרטי ה-DRM כמו
ייתכן שפרטי הכניסה הדרושים לתוכן יהיו מקושרים ישירות אל
חשבון Google באמצעות מנגנונים כגון OAuth/SSO. במקרים כאלה, אם
שתוכן מדיה נטען באמצעות הקול או מגיע מהענן,
setCredentials
מופעל מהענן למכשיר Cast כל עוד
פרטי הכניסה. לאחר מכן אפליקציות שכותבות אפליקציה של מקלט אינטרנט יכולות להשתמש
מידע על setCredentials
כדי להפעיל DRM לפי הצורך. כאן יש דוגמה
באמצעות פרטי הכניסה כדי ליצור את המדיה.
טיפ: כדאי לעיין גם במאמר טעינת מדיה באמצעות contentId, contentUrl ו-entity.
טיפול בערוצי אודיו
כשנגן Cast טוען מדיה, הוא מגדיר מאגר נתונים זמני של מקור אודיו יחיד. בשעה באותו זמן, הוא גם בוחר קודק מתאים שישמש את מאגר הנתונים, על סמך סוג ה-MIME של הטראק הראשי. הוגדרו מאגר נתונים זמני וקודק חדשים:
- כשההפעלה מתחילה,
- בכל הפסקה למודעות,
- בכל פעם שהתוכן העיקרי ממשיך לפעול.
מכיוון שהמאגר הזמני משתמש בקודק יחיד, ובגלל שהקודק נבחר בהתאם לטראק הראשי, יש מצבים שבהם טראקים משניים סוננו ולא נשמעו. הדבר יכול להתרחש כאשר הסרטון הראשי של תוכנית מדיה הטראק הוא בצליל סראונד, אבל בטראקים משניים של אודיו נעשה שימוש בצליל סטריאו. כי טראקים משניים משמשים לעיתים קרובות כדי להציע תוכן בערוצים אחרים שפות שונות, אם מספקים מדיה שכוללת מספרים שונים של טראקים השפעה משמעותית, כגון מספר רב של צופים שאינם מסוגלים לשמוע בשפת האם שלהם.
התרחישים הבאים ממחישים למה חשוב לספק תכנות שבהם טראקים ראשיים ומשניים מכילים אותו מספר של ערוצים:
תרחיש 1 – אין ערוץ בסטרימינג במדיה התאמה בין מסלולים ראשיים ומשניים:
- אנגלית – AC-3 ערוץ 5.1 (ראשי)
- שוודית – AAC 2 ערוצים
- צרפתית – AAC דו-ערוצי
- גרמנית – AAC דו-ערוצי
בתרחיש הזה, אם שפת השחקן מוגדרת לכל שפה שהיא באנגלית, המשתמש לא שומע את הטראק שהוא מצפה לשמוע, טראקים בשני ערוצים מסוננים במהלך ההפעלה. הטראק היחיד יכול להיות הערוץ הראשי AC-3 5.1, ואז רק כאשר מוגדרת לאנגלית.
תרחיש 2 – שידור מדיה עם ערוץ התאמה בין מסלולים ראשיים ומשניים:
- אנגלית – AC-3 ערוץ 5.1 (ראשי)
- שוודית – ערוץ AC-3 עם 5.1
- צרפתית – AC-3 עם ערוץ 5.1
- גרמנית – AC-3 עם ערוץ 5.1
בגלל שלכל הטראקים של השידור הזה יש מספר זהה של ערוצים, קהל שומעים טראק בלי קשר לשפה שנבחרה.
טיפול בערוצי אודיו של Shaka
ברירת המחדל של נגן Shaka (DASH) היא מספר הערוצים המועדף, אמצעים לצמצום הבעיה כש נתקלים במדיה שלא זהה לזו של מדיה משנית טראקים של אודיו.
אם הטראק הראשי הוא לא צליל סראונד (לדוגמה: סטריאו דו-ערוצי) טראק), נגן Shaka ישתמש בשני ערוצים כברירת מחדל לסנן באופן אוטומטי טראקים משניים של מדיה שיש בהם יותר משני טראקים הערוצים שלך.
אפשר גם להגדיר את המספר המועדף של ערוצי האודיו של Shaka באמצעות הגדרה
preferredAudioChannelCount
בנכס shakaConfig
ב-
cast.framework.PlaybackConfig.
לדוגמה:
shakaConfig = { "preferredAudioChannelCount": 6 };
כש-preferredAudioChannelCount
מוגדר ל-6, Shaka Player בודק אם
הוא יכול לתמוך בקודק של צליל סראונד (AC-3
או EC-3
), וגם
מסנן באופן אוטומטי את כל טראקים של מדיה שלא תואמים את
מספר הערוצים.