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

כיום, ב-Web Receiver SDK יש תמיכה בשלושה סוגים של פרוטוקולים של סטרימינג:

DASH, HTTP Live Streaming ו- Smooth Streaming.

במסמך הזה אנחנו מפרטים את התמיכה שלנו בכל אחד מהפרוטוקולים של הסטרימינג. שימו לב שההסבר על התגים הנתמכים בכל פרוטוקול הוא קצר יחסית בהשוואה למפרט הפרוטוקול. המטרה היא לספק הצצה מהירה ולהבין איך להשתמש בכל פרוטוקול, ואילו תכונות של הפרוטוקול נתמכות במכשירים שתומכים ב-Cast כדי לספק חוויית סטרימינג.

סטרימינג דינמי שניתן להתאמה באמצעות HTTP (DASH)

המפרט המפורט של DASH של ISO.

DASH הוא פרוטוקול סטרימינג בקצב דינמי שמאפשר סטרימינג של וידאו באיכות גבוהה דרך שרתי HTTP(S). מניפסט בפורמט XML מכיל את רוב פרטי המטא-נתונים להפעלה ולהורדה של תוכן הסרטון. הקונספטים העיקריים שנתמכים בנגן Web Receiver הם <Period>, <AdaptationSet>, <Representation>, <SegmentTemplate>, <SegmentList>, <BaseUrl> ו-<ContentProtection>.

מניפסט DASH מתחיל בתג <MPD> ברמה הבסיסית, ובתוכו כולל תג <Period> אחד או יותר, שמייצגים תוכן סטרימינג אחד. תגי <Period> מאפשרים לסדר קטעים שונים של תוכן סטרימינג, ומשמשים לעיתים קרובות להפרדה בין התוכן הראשי לבין הפרסומת או כמה תכני וידאו ברצף.

השדה <AdaptationSet> מתחת ל-<MPD> הוא קבוצה של ייצוגים לסוג אחד של שידור מדיה, ברוב המקרים וידאו, אודיו או כתוביות. ה-mimetypes הנפוץ ביותר שנתמך הוא "video/mp4", "audio/mp4" ו-"text/vtt". אפשר לכלול שדה <ContentComponent contentType="$TYPE$"> אופציונלי במסגרת <AdaptationSet>.

בכל <AdaptationSet> יש רשימה של תגי <Representation>, וה-Web Receiver Player משתמש במידע של 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 למפתחים.

בעוד שה-Web Receiver Player הנוכחי שלנו תומך בתרחישי השימוש העיקריים ב-DASH, הנה רשימה של מאפיינים נפוצים שההטמעה הנוכחית של DASH לא משתמשת בהם או מתעלמת מהם. כלומר, בין שהמניפסט מכיל אותם ובין שלא, אין להם השפעה על חוויית ההפעלה של התוכן.

  • availabilityStartTime
  • segmentAlignment

HTTP Live Streaming ‏(HLS)

סקירה כללית והמפרט המלא של סטרימינג בשידור חי ב-HTTP זמינים כאן.

אחת מנקודות החוזקה של Web Receiver Player היא היכולת לתמוך בהפעלה של HLS ב-MSE. בשונה מ-DASH, שבו מניפסט מצורף בקובץ יחיד, מערכת HLS שולחת את הפלייליסט הראשי שמכיל רשימה של כל גרסאות הסטרימינג עם כתובת ה-URL המתאימה. הפלייליסט של הווריאנטים הוא פלייליסט של מדיה. שני תגי ה-HLS העיקריים שנגן Web Receiver Player תומך בהם כרגע בפלייליסט המאסטר:

שם התג פונקציונליות
#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 שבהם תומך בשלב זה נגן Web Receiver 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 עם רכיבי ה-Codec החלופיים, וגם לספק את פורמט הפלח בהגדרות של מקור הנתונים.

Web Receiver Player מצפה להתנהגות מסוימת לפי מפרט. לדוגמה, אחרי תג #EXT-INF, אנחנו מצפים לקבל URI. אם זה לא URI, למשל #EXT-X-DISCOUNTINUITY יגרום לכשל בניתוח הפלייליסט.

מדי #EXT-X-TARGETDURATION שניות אנחנו טוענים מחדש את הפלייליסט/המניפסט כדי לקבל רשימות פלחים חדשות, ואנחנו מעדכנים את הייצוג הפנימי החדש של כל הפלחים בקטע החדש. בכל פעם שנשלחת בקשה, אנחנו מחפשים רק בטווח של החיפוש. בשידור חי, אנחנו מאפשרים דילוג רק מההתחלה של הרשימה החדשה ביותר, עד למשך הזמן שהוגדר לשלושה יעד מהסוף. לדוגמה, אם יש לכם רשימה של 10 פלחים, ואתם בפלח 6, תוכלו לחפש רק עד 7, ולא 8.

תמיכה בפורמט הפלחים

ב-CAF SDK יש תמיכה בהפעלת תוכן שמועבר במספר פורמטים, כפי שמוסבר ב-HlsSegmentFormat לאודיו וב-HlsVideoSegmentFormat לווידאו. זה כולל תמיכה באודיו ארוז, כמו הפעלה של AAC ו-AC3, גם מוצפן וגם לא מוצפן. חובה לציין את המידע הזה ב-MediaInformation של LoadRequestData כדי לתאר כראוי את התוכן לנגן. אם לא מציינים שום אפשרות, הגדרת ברירת המחדל של הנגן תנסה להפעיל את התוכן כתוכן ארוז של Transport Stream. אפשר להגדיר את הנכס הזה מכל השולחים בנתונים של בקשת הטעינה (Android, iOS ו-Web) או מתוך הנמען באמצעות כלי יירוט של הודעות.

למידע נוסף על אופן הכנת תוכן ב-Web Receiver, אפשר לעיין בקטע הקוד לדוגמה שבהמשך או במדריך Loading media using contentId , contentUrl and 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 שלמעלה, ב-Cast SDK יש תמיכה ב-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 מציין את צופן ההצפנה המשמש להצפנת התוכן. Sample-AES מסמן שהתוכן מוצפן באמצעות 'cbcs'. דוגמה-AES-CTR מציינת שהתוכן מוצפן באמצעות אחת מתוכנות ההגנה של AES-CTR, כלומר 'cenc'.

מאפיינים שממופים ל-DASH MPD:

מאפיין התיאור
KEYFORMAT מאפיין schemeIdUri של הרכיב ContentProtection.
URI תוכן הרכיב cenc:pssh.
KEYID מחרוזת הקסדצימלית באורך 16 בייטים שמקודדת את מזהה המפתח, שתפקידו זהה לזה של default_kid ב-MPEG DASH. אם משתמשים בסכמה של מפתחות היררכיים, משתמשים במפתח ה "שורש".

דוגמה לפלייליסט בפורמט 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, אבל בשלב הזה נגן Web Receiver Player מסתמך רק על הקיום של #EXT-X-ENDLIST כדי לקבוע אם הסרטון מתאים ל-VOD.

סטרימינג חלק

המפרט הרשמי של Microsoft Smooth Streaming.

'העברה חלקה' מספקת פרוטוקול סטרימינג דינמי ומפרט XML ב-HTTP (בדומה ל-DASH). בשונה מ-DASH, ב-Smooth Streaming אנחנו ממליצים רק על אריזת MPEG-4 עבור קטעי המדיה.

לפניכם טבלה של התגים והמאפיינים הנפוצים ביותר ב-Smooth Streaming ש-Web Receiver Player תומך בהם כיום. מושגים רבים כבר מוסברים בקטע DASH שלמעלה.

תג/מאפיין Usage
<SmoothStreamingMedia> התג הראשי של המניפסט מכיל מאפיינים של:
  • TimeScale: מספר היחידות שמייצגות שנייה אחת, בדרך כלל במרווחים של 10,000,000.
  • משך זמן: אורך התוכן בסולם זמן. Web Receiver Player לא תומך באורך של פחות מ-0.1 שניות.
  • IsLive: האם המניפסט הוא מדיה בשידור חי.
<StreamIndex> קבוצת שידורים אחת, בדומה ל-AdaptationSet של DASH. הסוג הוא בדרך כלל 'טקסט', 'וידאו' או 'אודיו'. המאפיין Url מכיל בדרך כלל כתובת URL עם קטע בתבנית שמבוססת על מידע כמו קצב העברת נתונים או שעת התחלה.
<QualityLevel> כל תג QualityLevel מציין את קצב העברת הנתונים שלו וקודק ארבע פעמים. קוד ה-FourCC הוא בדרך כלל 'H264', 'AVC1', 'AACL' וכו'. לווידאו, הוא מציין את הרזולוציות שלו באמצעות MaxWidth ו-MaxHeight. באודיו, הוא מציין את התדירות (למשל 44100) באמצעות SsampleingRate ואת מספר הערוצים.
<c> רכיב מקטע סטרימינג. כוללת:
  • d: משך הזמן של מקטע.
  • t: זמן המדיה של הקטע.
<הגנה> תג עם המאפיין האופציונלי SystemID שמפרט את מזהה המערכת DRM לשימוש בתג <SmoothStreamingMedia>.
<ProtectionHeader> בקטע <Protection>, הערך יכול לכלול מאפיין של SystemID ונתונים מותאמים אישית, בדרך כלל בקידוד Base64. ב-Widevine, הוא יכיל את מזהה המפתח, את אורך המפתח, את מזהה האלגוריתם, כמו AESCTR, LA_URL (כתובת ה-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'

עבור <ProtectionHeader>, לפניכם דוגמה לנתונים בקידוד Base64. לאחר הפענוח, הנתונים תואמים לאותו פורמט מפוענח כמו שמתואר למעלה בתמיכה בהגנה על תוכן של 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 בודקת את יכולות הווידאו והאודיו של המכשיר Web Receiver ומוצגת על ידי אימות הפרמטרים של המדיה שהועברו, והחזרת ערך בוליאני. כל הפרמטרים חוץ מהפרמטר הראשון הם אופציונליים – ככל שכוללים יותר פרמטרים, הבדיקה תהיה מדויקת יותר.

החתימה שלו היא canDisplayType(<em>mimeType</em>,<em>codecs</em>,<em>width</em>,<em>height</em>,<em>framerate</em>)

לדוגמה:

הפונקציה בודקת אם המכשיר והתצוגה של Web Receiver תומכים ב-mimetype וידאו/mp4 עם הקודק, המידות וקצב הפריימים הספציפיים האלה:

canDisplayType("video/mp4", "avc1.42e015,mp4a.40.5", 1920, 1080, 30)

כדי לבדוק אם התצוגה ומכשיר ה-Web Receiver תומכים בפורמט וידאו 4K עבור קודק זה על ידי ציון הרוחב והגובה של 2160:

canDisplayType("video/mp4", "hev1.1.2.L150", 3840, 2160)

הפונקציה בודקת אם המסך ומכשיר ה-Web Receiver תומכים ב-HDR10 עבור הקודק, המימדים וקצב הפריימים:

canDisplayType("video/mp4", "hev1.2.6.L150", 3840, 2160, 30)

הפונקציה בודקת אם המסך ומכשיר ה-Web Receiver תומכים ב-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 שמספק את פרטי הכניסה האלה. לאחר מכן, אפליקציות שכותבות אפליקציה של Web Receiver יכולות להשתמש במידע setCredentials כדי להפעיל DRM לפי הצורך. הנה דוגמה לשימוש בפרטי הכניסה כדי ליצור את המדיה.

טיפ: כדאי גם לעיין בקטע טעינת מדיה באמצעות contentId, contentUrl ו-entity.

טיפול בערוץ אודיו

כשנגן Cast טוען מדיה, הוא מגדיר מאגר נתונים זמני אחד של מקור אודיו. בו-זמנית, הוא בוחר גם קודק מתאים שישמש את המאגר, על סמך סוג ה-MIME של הטראק הראשי. מגדירים מאגר נתונים זמני וקודק חדשים:

  • כשההפעלה מתחילה,
  • בכל הפסקה למודעה,
  • בכל פעם שהתוכן הראשי מתחדש.

מכיוון שהמאגר הזמני משתמש בקודק יחיד ומכיוון שהקודק נבחר בהתאם לטראק הראשי, יש מצבים שבהם טראקים משניים מסוימים יסוננו ולא יושמעו. מצב כזה יכול לקרות כשהטראק הראשי של תוכנית המדיה נמצא בצליל סראונד, אבל טראקים משניים של אודיו משתמשים בצליל סטריאו. מאחר שטראקים משניים משמשים לעיתים קרובות להצגת תוכן בשפות חלופיות, להצגת מדיה שמכילה מספרים שונים של טראקים יכולה להיות השפעה משמעותית – למשל, מספר גדול של צופים לא יכולים לשמוע את התוכן בשפת האם שלהם.

התרחישים הבאים ממחישים למה חשוב לספק לוח זמנים שבו בטראקים הראשיים והמשניים יש אותו מספר ערוצים:

תרחיש 1 – שידור מדיה ללא שיוך ערוצים בטראקים הראשיים והמשניים:

  • אנגלית – ערוץ AC-3 5.1 (ראשי)
  • שוודית – AAC 2 ערוצים
  • צרפתית - AAC 2 ערוצים
  • גרמנית – AAC 2-channel

בתרחיש הזה, אם שפת הנגן מוגדרת לשפה שאינה אנגלית, המשתמשים לא ישמעו את הטראק שהם מצפים לשמוע כי כל הטראקים בשני הערוצים מסוננים במהלך ההפעלה. הטראק היחיד שאפשר להפעיל הוא הערוץ הראשי 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), ומסנן באופן אוטומטי טראקים של מדיה שלא תואמים למספר הערוצים המועדף.