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

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

הסבר על DASH

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

  • מבוסס על סטנדרטים פתוחים.
  • מבוססת HTTP. כתוצאה מכך, DASH הוא ידידותי לתשתיות אינטרנט ויכול לעבור חומות אש.
  • תומך בקצב העברת נתונים גבוה של העברה. DASH תומך בסשנים מרובים של HTTP בו-זמנית ובהעברה של פלחים לא עוקבים, ומספק גמישות רבה יותר מאשר פרוטוקולים שמסתמכים על חיבור TCP יחיד.
  • מסירה מאובטחת באמצעות HTTPS.
  • מסירה ללא אובדן נתונים דרך HTTP ו-HTTPS.
  • קודק ללא הפרעות.
  • תמיכה בקובצי 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 באמצעות YouTube Live Streaming API.

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

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

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

כתובות URL בפורמט MPD

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

כתובות URL של אתחול וכתובות 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

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

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

ניסיונות חוזרים והשהיה מעריכית לפני ניסיון חוזר (exponential backoff)

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

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

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

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

קודי תגובה של HTTP

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

200 (OK)

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

202 (התקבל)

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

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

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

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

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

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

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

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

401 (לא מורשה)

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

405 (שיטה לא מותרת)

תגובת HTTP 405 (method Not Allowed) מציינת שנשלחה בקשה שאינה POST או PUT.

409 (התנגשות)

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

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

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

דוגמאות

רצף כתובות 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 BMFF חוקי ומלא,

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

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

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