פרוטוקולי סטרימינג של נגן מקלט האינטרנט

ה-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 הזמן האבסולוטי של הדגימה הראשונה של הפלח הבא, לדוגמה &quot;2016-09-21T23:23:52.066Z&quot;.
#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 שלמעלה.

תג/מאפיין שימוש
&lt;SmoothStreamingMedia&gt; התג הראשי של המניפסט, מכיל מאפיינים של:
  • סולם זמן: מספר היחידות שמייצגות שנייה אחת, בדרך כלל במרווחים של 10,000,000.
  • משך: אורך התוכן בסולם הזמן. הנגן של מקלט האינטרנט עושה לא תומכים במשך זמן קצר מ-0.1 שניות.
  • IsLive: האם המניפסט הוא מדיה פעילה.
&lt;StreamIndex&gt; קבוצה אחת של מקורות נתונים, בדומה ל-AdaptationSet של DASH. הסוג הוא בדרך כלל 'text', 'video' או 'audio'. המאפיין Url מכיל בדרך כלל תבנית כתובת URL עם פיצול במידע כמו קצב העברת נתונים או שעת התחלה.
&lt;QualityLevel&gt; כל תג QualityLevel מציין את קצב העברת הנתונים ו-codec של FinCC. ה-F4CC הקוד הוא בדרך כלל 'H264', 'AVC1', 'AACL' וכו'. בסרטונים מציינים רזולוציות דרך Maxwidth ו-MaxHeight. באודיו, הוא מציין בתדירות (למשל 44100) באמצעות SamplingRate ומספר הערוצים.
&lt;c&gt; רכיב מקטע בסטרימינג. מכיל:
  • d: משך הזמן של מקטע.
  • t: זמן המדיה של המקטע.
&lt;Protection&gt; תג עם מאפיין SystemID אופציונלי שבו מפורט מזהה המערכת ניהול זכויות דיגיטליות (DRM) לשימוש במסגרת <SmoothStreamingMedia> התיוג.
&lt;ProtectionHeader&gt; בקטע <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), וגם מסנן באופן אוטומטי את כל טראקים של מדיה שלא תואמים את מספר הערוצים.