העברת תוכן של YouTube בשידור חי באמצעות DASH

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

הסבר על DASH

ברשימה הבאה מפורטים חלק מהמאפיינים והמאפיינים המרכזיים של DASH:

  • מבוסס על סטנדרטים פתוחים.
  • מבוסס-HTTP. כתוצאה מכך, DASH הוא ידידותי לתשתית אינטרנט ויכול לעבור בין חומות אש.
  • תומך בקצב העברת נתונים גבוה. DASH תומך בהפעלות HTTP בו-זמנית ובמספר פלחים לא רציפים, וכך גמישות רבה יותר מאשר פרוטוקולים שמסתמכים על חיבור TCP אחד.
  • העברה מאובטחת באמצעות HTTPS.
  • מסירה ללא אובדן נתונים דרך HTTP ו-HTTPS.
  • Codec חלקי.
  • יש תמיכה ב-MP4 שמכיל H264 ו-AAC, וגם ב-WebM המכיל VP8/VP9 ו-Vorbis/Opus.

מפרטים

דרישות

בקטעי המשנה הבאים מוסברות הדרישות לשימוש ב-DASH להפעלת שידורים חיים ב-YouTube.

תזמון

נקודת הקצה של YouTube DASH מתנהגת כשרת HTTP פסיבי ומקליט שיחות בשיטת PUT שנשלחות על ידי מקודד.

  • נקודת הקצה DASH תומכת בחיבורי TCP סימולטניים. אפשר לעשות שימוש חוזר בחיבורים בהתאם ל-HTTP/1.1.
  • פלחי ה-MPD והאתחול צריכים להיות לפי PUT בתוך 3 שניות מפלח המדיה הראשון. (מומלץ לכלול את פלח האתחול ב-MPD).
  • כל פלח או MPD חייבים להשתמש בבקשת PUT נפרדת. העלאה מרובת חלקים של פלחים מרובים אינה נתמכת.
  • כדי לשפר את רוחב הפס להעלאה, פעולות של PUT עבור פלחי מדיה עשויות לחפוף בזמן.
  • אפשר לציין פלחים בסדר לא רציף בפרק זמן של כ-3 שניות.
  • צריך לעדכן את פלחי ה-MPD והאתחול לפחות פעם ב-60 שניות עם עדכון בavailabilityStartTime ובstartNumber. (כפי שצוין למעלה, אתם יכולים לכלול את פלח האתחול ב-MPD. במקרה כזה, בקשת PUT אחת יכולה לעדכן את שני הפלחים).

מבנה של כתובת אתר

המקודד שלכם חייב ליצור כתובות URL של PUT על ידי הוספת מחרוזת לכתובת ה-URL הבסיסית של נקודת הקצה של YouTube. יש ליצור את נקודת הקצה של הטמעת נתונים מסוג DASH באמצעות ה-API לסטרימינג בשידור חי ב-YouTube.

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

המחרוזת שמצורפת לכתובת האתר הבסיסית יכולה להכיל את הקבוצה הבאה של תווי ASCII:

  • אותיות קטנות: a-z
  • אותיות רישיות: A-Z
  • ספרות: 0-9
  • תווים מיוחדים: _ (קו תחתון), - (מקף), . (נקודה)

כתובות URL של MPD

בנוסף לדרישה שלמעלה, כתובת ה-MPD חייבת להסתיים ב-.mpd, כדי ששרת YouTube יוכל לזהות בקלות את ה-MPD.כתובות URL של פלחים אחרים לא יכולות להסתיים ב-.mpd.

אתחול כתובות URL ופילוחי מדיה

כתובת ה-URL של פלח האתחול וכל כתובות ה-URL של פלחי המדיה חייבות להסתיים ב-.mp4 אם הנתונים נמצאים במאגר מסוג ISO BMFF או עם .webm אם הנתונים נמצאים במאגר מסוג WebM.

תוכן MPD

ה-MPD חייב להיות מלא ותואם לתקן DASH. עליה להכיל בדיוק אחד מהרכיבים הבאים. הרשימה הזו מציינת רכיבים הדרושים ספציפית על ידי YouTube, ותקן DASH עשוי לזהות רכיבים נדרשים נוספים. הרכיבים מיוצגים באמצעות תחביר XPath והם תואמים לתקן DASH.

  • /mpd:MPD/attribute::type
  • /mpd:MPD/mpd:Period
  • /mpd:MPD/mpd:Period/mpd:AdaptationSet
  • /mpd:MPD/mpd:Period/mpd:AdaptationSet/attribute::mimeType (video/mp4 or video/webm)
  • /mpd:MPD/mpd:Period/mpd:AdaptationSet/mpd:SegmentTemplate
  • /mpd:MPD/mpd:Period/mpd:AdaptationSet/mpd:SegmentTemplate/attribute::media
  • /mpd:MPD/mpd:Period/mpd:AdaptationSet/mpd:SegmentTemplate/attribute::initialization
  • /mpd:MPD/mpd:Period/mpd:AdaptationSet/mpd:SegmentTemplate/attribute::startNumber

חשוב לשים לב לדרישות הבאות לגבי ערכי רכיבים:

  • יש להגדיר את מאפיין ה-minimumUpdatePeriod של הרכיב <MPD> לערך שווה ל-60 שניות או פחות (PT60S).
  • מאפיין media של הרכיב <SegmentTemplate> חייב לציין שכתובות URL של פלחי מדיה נוצרות באמצעות $Number$. (המאפיין startNumber מזהה את המספר שיוקצה לפלח המדיה הראשון.)

אורך פלח האתחול

הפלח של אתחול לא יכול להיות יותר מ-100kb. (בדרך כלל, פלח אתחול קטן בהרבה). אם פלח האתחול כלול ב-MPD, כתובת ה-URL של data:, שמכילה את הפלח, לא יכולה להיות ארוכה מ-100KB.

מקודד המקודד

קטע האתחול וקטעי המדיה חייבים להיות בפורמט מרובה-נתונים של ISO BMFF או WebM עם GOP סגור (קבוצות של תמונות).

  • גודל ה-GOP צריך להיות בערך 2 שניות וצריך להיות קצר מ-8 שניות.
  • רצף השידורים המרובים חייב להכיל גם טראקים של אודיו וגם טראקים של וידאו.

שיטות מומלצות נוספות

הצפנה

המערכת של YouTube תומכת בהצפנת סטרימינג באמצעות HTTPS. מומלץ מאוד להשתמש בתכונה זו.

פלחי אתחול ב-MPD

ניתן לייצג את פלח האתחול ישירות ב-MPD באמצעות כתובת URL של data:, לפי RFC 2397. אפשרות זו מפשטת את הגדרת השידור ומפחיתה את האפשרות שקטע האתחול לא יתאים לשאר השידור.

ה-XPath של הרכיב הזה הוא:

/mpd:MPD/mpd:Period/mpd:AdaptationSet/mpd:SegmentTemplate/attribute:data

משך הזמן של פלחי קהל היעד

כדי לשפר את ביצועי הטמעת הנתונים ולשפר את השילוב בין תפוקה לזמן אחזור, האורך של פלחי המדיה צריך להיות בין שנייה ל-5 שניות.מומלץ מאוד להודיע על משך היעד של אותם פלחים ב-MPD באמצעות שני הרכיבים האלה:

  • /mpd:MPD/mpd:Period/mpd:AdaptationSet/mpd:SegmentTemplate/attribute::duration
  • /mpd:MPD/mpd:Period/mpd:AdaptationSet/mpd:SegmentTemplate/attribute::timescale

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

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

ניסיון חוזר והשהיה מעריכית

יש לבצע את כל הבקשות מסוג PUT HTTP עם פסק זמן. מומלץ להגדיר ערך גדול מ-500 אלפיות השנייה ממשך הפלח.

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

  1. אם הפעולה נכשלה, יש להמתין פרק זמן אקראי בין [0 ... 100] אלפיות השנייה ולנסות שוב לשלוח את הבקשה.
  2. אם הבקשה תיכשל שוב, יש להמתין פרק זמן אקראי בין [0 ... 200] אלפיות השנייה ולנסות שוב לשלוח את הבקשה.
  3. אם הבקשה תיכשל שוב, יש להמתין פרק זמן אקראי בין [0 ... 400] אלפיות השנייה ולנסות שוב לשלוח את הבקשה.
  4. וכו'

חשוב לשים לב שכשלים חוזרים מדווחים לאופרטור של המקודד, מאחר שהם תואמים לשידור כושל.

קודי תגובות HTTP

בקטעים הבאים נסביר על קודי התגובות ש-YouTube מחזיר בתגובה לפילוחים שנמסרו באמצעות DASH.

200 (אישור)

תגובת HTTP 200 (OK) מציינת ששרת YouTube קיבל פעולה צפויה וטיפל בה בהצלחה.

202 (התקבל)

תגובת HTTP 202 (אישור) שמתייחסת לכל פעולת PUT או POST מציינת שהפעולה הייתה בלתי צפויה ואושרה לעיבוד מעוכב. עם זאת, הפעולה שעוכבה עשויה להצליח או להיכשל, ולכן התגובה אינה מבטיחה ש-YouTube יוכל לעבד את הפעולה בהצלחה.

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

לדוגמה, YouTube יכול להחזיר תשובה 202 בכל אחד מהמצבים הבאים:

  • קטע אתחול מתקבל לפני קובץ ה-MPD.
  • פלחי מדיה מתקבלים לפני פלחי MPD ואתחול.
  • פלח מדיה מתקבל לפני שפלח קודם, כמו פלח 3, מתקבל לפני פלח 2.

עם זאת, תגובה מתגובה 202 עשויה לציין גם שמזהה הפריט שגוי אם המערכת של YouTube לא יכולה לאמת באופן מלא את המזהה עם קבלת בקשת ה-POST או ה-PUT. לדוגמה, אחד מהמצבים האלה מתרחש כאשר YouTube מקבל ומאשר פלח אתחול לפני קבלת ה-MPD, אבל פלח האתחול מתברר כלא חוקי. במקרה כזה, המערכת של YouTube מקבלת את קטע האתחול ומחזירה 202, ולאחר מכן קובעת אם הקטע תקף עם קבלת ה-MPD. כדי למנוע את התרחיש הספציפי הזה, מוסיפים את פלח האתחול ב-MPD.

400 (בקשה שגויה)

תגובת HTTP 400 (בקשה שגויה) מציינת אחת מהבעיות הבאות:

  • כתובת האתר מעוותת
  • הפוסט גדול מדי (יותר מ-10MB)
  • לא ניתן לנתח את קובץ ה-MPD
  • פלח האתחול ב-MPD פגום

401 (אין הרשאה)

תגובת HTTP 401 (לא מורשה) מציינת שכתובת ה-URL הבסיסית של נקודת הקצה של YouTube DASH פגומה או שפג תוקפה.

405 (שיטה אסורה)

תגובת HTTP 405 (שיטה אסורה) מציינת שנשלחה בקשה שאינה POST או PUT.

409 (התנגשות)

תגובת HTTP 409 (התנגשות) לכל פעולת PUT או POST מציינת ש-YouTube לא יכול לעבד את הבקשה. לדוגמה, ייתכן שהתגובה הזו תתקבל אם מגיש הבקשה שלח מספר רב של פלחי מדיה, אבל ל-YouTube עדיין אין MPD, את קטע האתחול, או את שניהם. בדוגמה הזו, המקודד יצטרך להעביר את קטעי ה-MPD והאתחול לפני הניסיון החוזר לשלוח את הבקשה שנכשלה.

500 (שגיאה פנימית בשרת)

תגובת HTTP 500 (שגיאה פנימית בשרת) מציינת שהשרת לא הצליח לעבד את הבקשה. במקרה של שגיאה זו, מומלץ לנסות לשלוח שוב את הבקשה עם השהיה מעריכית.

דוגמאות

רצף כתובות URL

רצף כתובות ה-URL שלמטה מציג סדרה של בקשות PUT שיבוצעו כדי לספק תוכן באמצעות DASH. ההנחה היא שכתובת ה-URL הבסיסית של נקודת הקצה של YouTube DASH היא:

http://upload.youtube.com/dash_upload?cid=xxxx-xxxx-xxxx-xxxx&copy=0&file=

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

PUT upload.youtube.com/dash_upload?cid=xxxx-xxxx-xxxx-xxxx&copy=0&file=dash.mpd
PUT upload.youtube.com/dash_upload?cid=xxxx-xxxx-xxxx-xxxx&copy=0&file=init.mp4
PUT upload.youtube.com/dash_upload?cid=xxxx-xxxx-xxxx-xxxx&copy=0&file=media001.mp4
PUT upload.youtube.com/dash_upload?cid=xxxx-xxxx-xxxx-xxxx&copy=0&file=media002.mp4
PUT upload.youtube.com/dash_upload?cid=xxxx-xxxx-xxxx-xxxx&copy=0&file=media003.mp4
...

קטעי WebM

MPD עם קטע אתחול מוטמע

קובץ ה-MPD הבא לדוגמה כולל קטע מוטמע של אתחול בכתובת URL של נתונים בפורמט RFC 2397. מומלץ להטמיע את פלח האתחול בדרך הזו במקום לשלוח אותו בנפרד.

הדוגמה הזו תואמת להטמעת נתונים של WebM (VP8 או VP9, Opus) ב-YouTube. מרבית כתובת ה-URL של הנתונים הושארה כך שתהיה קריאה:

<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns="urn:mpeg:dash:schema:mpd:2011"
     xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd"
     type="dynamic" 
     profiles="urn:mpeg:dash:profile:isoff-live:2011" 
     minimumUpdatePeriod="PT60S"
     minBufferTime="PT12S"
     availabilityStartTime="2016-04-13T20:52:58" >
  <Period start="PT0S" id="1">
    <AdaptationSet mimeType="video/webm">
      <ContentComponent contentType="video" id="1"/>
      <SegmentTemplate timescale="1000"
           duration="2000"
           startNumber="1"
           initialization="data:video/mp4;base64,AAAAGGZ0eXBpc...AAA"
           media="/dash_upload?cid=xxxx-xxxx-xxxx-xxxx&copy=0&file=media-$Number%09d$.webm"/>
      <Representation id="1" width="1920" height="1080">
        <SubRepresentation contentComponent="1"/>
      </Representation>
    </AdaptationSet>
  </Period>
</MPD>

MPD

קובץ ה-MPD הבא לדוגמה, ללא פלח אתחול מוטמע, מתאים גם להטמעת נתונים של WebM (VP8 או VP9, Opus) ב-YouTube:

<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns="urn:mpeg:dash:schema:mpd:2011"
     xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd"
     type="dynamic" 
     profiles="urn:mpeg:dash:profile:isoff-live:2011" 
     minimumUpdatePeriod="PT60S"
     minBufferTime="PT12S"
     availabilityStartTime="2016-04-13T20:52:58" >
  <Period start="PT0S" id="1">
    <AdaptationSet mimeType="video/webm">
      <ContentComponent contentType="video" id="1"/>
      <SegmentTemplate timescale="1000"
           duration="2000"
           startNumber="1"
           initialization="/dash_upload?cid=xxxx-xxxx-xxxx-xxxx&copy=0&file=init.webm"
           media="/dash_upload?cid=xxxx-xxxx-xxxx-xxxx&copy=0&file=media-$Number%09d$.webm"/>
      <Representation id="1" width="1920" height="1080">
        <SubRepresentation contentComponent="1"/>
      </Representation>
    </AdaptationSet>
  </Period>
</MPD>

אתחול

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

מדיה

הטבלה הבאה מציגה את הפריסה של פלח מדיה לדוגמה מסוג WebM. היא מורכבת מאשכול אחד של WebM. כמו במקרה של זרם ISO BMFF, הקטע 'אתחול' שמופיע לפני סדרה של אשכולות צריך לייצר שידור WebM חוקי.

קטעי ISO BMFF

MPD עם קטע אתחול מוטמע

קובץ ה-MPD הבא לדוגמה כולל קטע מוטמע של אתחול בכתובת URL של נתונים בפורמט RFC 2397. מומלץ להטמיע את פלח האתחול בדרך הזו במקום לשלוח אותו בנפרד.

הדוגמה הזו תואמת להטמעת נתונים של ISO BMFF (H.264, AAC) ב-YouTube. מרבית כתובת ה-URL של הנתונים הושארה כך שתהיה קריאה:

<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="urn:mpeg:dash:schema:mpd:2011"   
    xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" 
    type="dynamic"
    minimumUpdatePeriod="PT30S" 
    availabilityStartTime="2016-05-04T20:47:25" 
    minBufferTime="PT12S" 
    profiles="urn:mpeg:dash:profile:isoff-live:2011">
  <Period start="PT0S" id="1">
    <AdaptationSet mimeType="video/mp4" codecs="avc1.4d401e,mp4a.40.2">
      <ContentComponent contentType="video" id="1"/>
      <ContentComponent contentType="audio" id="2"/>
      <SegmentTemplate timescale="600"
             media="/dash_upload?cid=ug50-xg26-cbc1-2p0h&staging=1&copy=0&file=media$Number%09d$.mp4"
             initialization="data:video/mp4;base64,AAAAGGZ0eXBpc281AA...AA"
             duration="306"
             startNumber="1"/>
      <Representation id="1" width="640" height="360" bandwidth="526952">
        <SubRepresentation contentComponent="1" bandwidth="526952" 
codecs="avc1.4d401e"/>
        <SubRepresentation contentComponent="2" bandwidth="125584" codecs="mp4a.40.2"/>
      </Representation>
    </AdaptationSet>
  </Period>
</MPD>

MPD

קובץ ה-MPD הבא לדוגמה, ללא פלח אתחול מוטמע, מתאים גם להטמעת נתונים ISO BMFF (H.264, AAC) ב-YouTube:

<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns="urn:mpeg:dash:schema:mpd:2011"
     xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd"
     type="dynamic"
     profiles="urn:mpeg:dash:profile:isoff-live:2011"
     minimumUpdatePeriod="PT60S" 
     minBufferTime="PT12S"
     availabilityStartTime="2016-04-13T20:51:31" >
  <Period start="PT0S" id="1">
    <AdaptationSet mimeType="video/mp4" codecs="avc1.4d401e,mp4a.40.2">
      <ContentComponent contentType="video" id="1"/>
      <ContentComponent contentType="audio" id="2"/>
      <SegmentTemplate timescale="600"
           duration="1200"
           startNumber="1"
           initialization="/dash_upload?cid=xxxx-xxxx-xxxx-xxxx&copy=0&file=init.mp4"
           media="/dash_upload?cid=xxxx-xxxx-xxxx-xxxx&copy=0&file=media$Number%09d$.mp4"/>
      <Representation id="1" width="640" height="360" bandwidth="526952">
        <SubRepresentation contentComponent="1" bandwidth="526952" codecs="avc1.4d401e"/>
        <SubRepresentation contentComponent="2" bandwidth="125584" codecs="mp4a.40.2"/>
      </Representation>
    </AdaptationSet>
  </Period>
</MPD>

אתחול

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

מדיה

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

מגבלות ידועות

הטמעת נתונים של RTMP ו-DASH

אין אפשרות לשלב הטמעות של RTMP ו-DASH ב-YouTube.האפשרות הזו חלה על המעבר בין השניים במהלך שידור מסוים, ועל שימוש באחד מהם בתור שיטת הטמעת נתונים ראשית והשנייה על הטמעת נתונים לגיבוי.