כלי להפעלת מניפסטים לשידורי VOD

‏Pod Serving API מספק גישה למודעות וידאו ברצף (pod) עם קצב נתונים אדפטיבי, שמוכן כך שניתן יהיה לחבר אותו ישירות לפלייליסט מדיה מסוג HLS או MPEG-DASH שגלוי למשתמשים.

המדריך הזה מתמקד בהטמעה של שרת בסיסי לטיפול במניפסטים של Pod Serving להעברות VOD.

קבלת בקשות למניפסט של שידור

הכלי לעיבוד המניפסט צריך לספק נקודת קצה ל-API כדי להאזין לבקשות מניפסט מאפליקציית הלקוח של נגן הווידאו. נקודת הקצה הזו צריכה לאסוף לפחות מזהה סטרימינג מאפליקציית הלקוח של הנגן. מזהה הסטרימינג הזה משמש לזיהוי סשן הסטרימינג ב-Ad Manager בבקשות של רצפי המודעות.

בנוסף, צריך לאסוף מידע נוסף כדי לזהות את מקור התוכן המתאים, למשל מזהה תוכן.

דוגמה לנקודת קצה לבקשת מניפסט

GET /api/stream_id/{stream_id}/video/{content_id}.{format}
Host: {your_domain}
פרמטרים של נתיב
stream_id מזהה הסטרימינג של Ad Manager מאפליקציית נגן הווידאו של הלקוח.
content_id מזהה היפותטי שתואם לסרטון התוכן במערכת שלכם.
format פרמטר היפותטי שתואם לפורמט הסטרימינג. אחד מהשניים:
mpd לשידורים של MPEG-DASH
m3u8 לשידורים בפרוטוקול HLS

אחזור מקור נתוני התוכן

משתמשים ב-Content ID שנאסף מבקשת המניפסט כדי לבחור את מקור התוכן שרוצים לחבר למודעות.

שליחת בקשה למניפסטים של מודעות

כדי לבקש מודעות מ-Ad Manager, השרת צריך לשלוח בקשת POST לנקודת הקצה של מודעות ה-pod, ולהעביר את תגי המודעות ופרופילי הקידוד המבוקשים. הבקשה הזו כוללת גם את מזהה הסטרימינג שאספתם בשלב 1.

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

POST /ondemand/pods/api/v1/network/{network_code}/streams/{stream_id}/adpods
Host: dai.google.com
Content-Type: application/json
פרמטרים של נתיב
network_code קוד הרשת של Ad Manager 360 של בעל התוכן הדיגיטלי.
stream_id מזהה מקור הנתונים מאפליקציית הנגן של הלקוח.

גוף ה-JSON

פרמטרים של גוף ההודעה
encoding_profiles Required רשימה של ייצוגים ב-JSON של פרופילי ההצפנה שרוצים לקבל לכל הפסקה למודעה. פרטים נוספים בהמשך

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

ad_tag Required תג מודעה לבקשת מודעות VMAP.
cuepoints Optional רשימה של נקודות סימון בתוך תוכן הסרטון שבהן יוצגו ההפסקות למודעות באמצע הסרטון. נקודות העצירה נמדדות בשניות עם נקודה צפה (floating-point).

חובה רק בתשובות VMAP שמכילות מודעות Mid-roll באמצעות הזחות זמן מבוססות-מיקום. זהו מצב לא נפוץ.

content_duration_seconds Optional משך התוכן בשניות.

נדרש רק לתגובות VMAP שמכילות מודעות Mid-roll באמצעות שינוי זמן לפי אחוזים. זהו מצב לא נפוץ.

manifest_type Optional הפורמט של מקורות הנתונים של המודעות המבוקשים, hls או dash. ערך ברירת המחדל הוא hls.
dai_options Optional אפשרויות נוספות ששולטות בהיבטים של עיבוד המניפסטים. פרטים נוספים בהמשך
פרופיל קידוד
profile_name Required מזהה של פרופיל ההקידוד הזה. הערך הזה יכול להיות כל מחרוזת שתרצו, אבל לא ניתן ליצור כמה פרופילי קידוד עם אותו שם באותו שידור.
type Required סוג הקידוד של הסטרימינג שמתואר בפרופיל הקידוד הזה. סוגי התוכן הם: media, ‏ iframe, ‏ subtitles.
container_type Required פורמט הקונטיינר שבו נעשה שימוש בפרופיל ההקידוד הזה. פורמטים של מאגרי תגים: mpeg2ts, fmp4cmaf, hls_packed_audio
video_settings Optional חובה לציין את הערך הזה אם סוג פרופיל הקידוד הוא iframe. אחרת, מותר להשתמש בהן רק אם סוג המדיה מכיל וידאו. פרטים נוספים בהמשך
audio_settings Optional חובה אם פרופיל הקידוד מכיל אודיו. מותר להשתמש בה רק אם הסוג הוא media. פרטים נוספים בהמשך
subtitle_settings Optional חובה אם פרופיל הקידוד מכיל כתוביות. פרטים נוספים בהמשך
הגדרות וידאו
codec Required מחרוזת הקודק של RFC6381.

דוגמה: avc1.4d000c

bitrate Required מספר שלם שמייצג את קצב הנתונים המקסימלי של הסרטון בפרופיל הזה, בבייטים לשנייה.
frames_per_second Required מספר הפריימים לשנייה (FPS) של הסרטון, בספרות עשרוניות.
resolution Required ערך מקודד ב-JSON שמכיל את 'הרוחב' ו'הגובה' של הסרטון בפיקסלים.

דוגמה: {"width": 640, "height": 320}

הגדרות אודיו
codec Required מחרוזת הקודק של RFC6381.

דוגמה: mp4a.40.5

bitrate Required מספר שלם שמייצג את קצב העברת הנתונים המקסימלי של האודיו בפרופיל הזה, בבייטים לשנייה.

דוגמה: 300000

channels Required מספר שלם שמייצג את מספר ערוצי האודיו, כולל ערוצי תדר נמוך.
sample_rate Required מספר שלם שמייצג את קצב דגימת האודיו בהרץ.

דוגמה: 4800

הגדרות הכתוביות
format Required פורמט הקובץ שבו נעשה שימוש בכתוביות בפס הקול. הערכים הנתמכים הם webvtt או ttml.
language Optional שפת הכתוביות כמחרוזת שפה לפי RFC5646. אם הערך הזה מצוין, הוא ישמש רק לעיבוד DASH.

דוגמה: en-us

אפשרויות DAI
dash_profile Optional פרופיל ה-MPEG-DASH שיחול על מניפסט של רצף מודעות. ההגדרה הזו משמשת רק למניפסטים של DASH. הערכים המותרים הם live או on-demand. ערך ברירת המחדל הוא on-demand.

הערך live תואם לפרופיל MPEG-DASH "urn:mpeg:dash:profile:isoff-live:2011".

הערך on-demand תואם לפרופיל MPEG-DASH urn:mpeg:dash:profile:isoff-on-demand:2011.

ad_pod_timeout Optional משך הזמן המקסימלי לבחירת מודעות וליצירת רצפי מודעות, בשניות עם נקודה צפה. לאחר חלוף הזמן הזה, מערכת Ad Manager מחזירה את כל המודעות שכבר נבחרו בתגובה ad_pods ומפסיקה את העיבוד.
sam_id Optional מציין מפתח ניפוי באגים חלופי שאפשר להשתמש בו כדי לחפש סשנים במעקב אחר פעילות בסטרימינג.

תשובה

פרמטרים של תגובה
valid_for משך הזמן שבו פלייליסטים של רצפי מודעות אלה תקפים, בפורמט dhms (ימים, שעות, דקות, שניות).
valid_until התאריך והשעה שבהם הפלייליסטים של רצפי המודעות האלה תקפים, כמחרוזת זמן תאריך (datetime) לפי פורמט ISO8601 בפורמט yyyy-MM-dd'T'hh:mm:ss.sssssssss[+|-]hh:mm.
ad_pods רשימה של רצפי מודעות שנבחרו לשידור הזה.
רצף מודעות
manifest_uris רק לשידורים ב-HLS. מפה של מזהי פרופילי קידוד למזהי URI של מניפסט HLS.
mpd_uri רק לשידורי DASH. ה-URI של ה-MPD של DASH.
type סוג רצף המודעות. סוגי רצפי המודעות הם: pre,‏ mid או post.
start רק למודעות באמצע הסרטון (mid-roll). המיקום בסטרימינג שבו צריך להוסיף את רצף המודעות, בשניות עם נקודה צפה.
duration משך הזמן של רצף המודעות הזה בשניות עם נקודה צפה.
midroll_index רק למודעות באמצע הסרטון (mid-roll). המדד של רצף המודעות הנוכחי באמצע הסרטון. ההוספה לאינדקס מתחילה ב-1.

בקשה לדוגמה (cURL)

curl -X POST \
     -d '@request-body.json' \
     -H 'Content-Type: application/json' \
  https://dai.google.com/ondemand/pods/api/v1/network/21775744923/streams/6e69425c-0ac5-43ef-b070-c5143ba68541:CHS/adpods

דוגמה לגוף הבקשה

זהו התוכן של request-body.json שצוין בקריאה של cURL שלמעלה.

{
  "encoding_profiles": [
   {
     "profile_name": "1080p",
     "type": "media",
     "container_type": "mpeg2ts",
     "video_settings": {
       "codec": "avc1.4d000c",
       "bitrate": 5000000,
       "frames_per_second": 30.0,
       "resolution": {
         "width": 1920,
         "height": 1080
       }
     },
     "audio_settings": {
       "codec": "mp4a.40.5",
       "bitrate": 300000,
       "channels": 2,
       "sample_rate": 48000
     }
   },
   {
     "profile_name": "360p",
     "type": "media",
     "container_type": "mpeg2ts",
     "video_settings": {
       "codec": "avc1.4d000d",
       "bitrate": 1000000,
       "frames_per_second": 30.0,
       "resolution": {
         "width": 640,
         "height": 360
       }
     },
     "audio_settings": {
       "codec": "mp4a.40.5",
       "bitrate": 64000,
       "channels": 2,
       "sample_rate": 48000
     }
   },
   {
     "profile_name": "subtitles-webvtt",
     "type": "subtitles",
     "subtitle_settings": {
       "format": "webvtt"
     }
   }
 ],
 "ad_tag": "https://pubads.g.doubleclick.net/gampad/ads?...",
 "manifest_type": "hls"
}

דוגמה לתשובה

{
  "valid_for": "8h0m0s",
  "valid_until": "2023-03-24T08:30:26.839717986-07:00",
  "ad_pods": [
    {
      "manifest_urls":{
        "1080p": "https://{...}/pod/0/profile/1080p.m3u8",
        "360p": "https://{...}/pod/0/profile.m3u8",
        "subtitles-webvtt": "https://{...}/pod/0/profile/subtitles-en.vtt"
      },
      "type": "pre",
      "duration": 10.0
    },
    {
      "manifest_urls":{
        "1080p": "https://{...}/pod/1/profile/1080p.m3u8",
        "360p": "https://{...}/pod/1/profile.m3u8",
        "subtitles-webvtt": "https://{...}/pod/1/profile/subtitles-en.vtt"
      },
      "type": "mid",
      "start": 15.0,
      "duration": 15.0,
      "midroll_index": 1
    },
    {
      "manifest_urls":{
        ]"1080p": "https://{...}/pod/2/profile/1080p.m3u8",
        "360p": "https://{...}/pod/2/profile.m3u8",
        "subtitles-webvtt": "https://{...}/pod/0/profile/subtitles-en.vtt""
      },
      "type": "post",
      "duration": 10.0
    }
  ]
}

שילוב של רצפי מודעות בתוכן

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

שידורי HLS

אם אתם עורכים שידורים בפורמט HLS, שידורי התוכן שלכם יהיו פלייליסט עם וריאציות מרובות של קישורים למניפסטים נפרדים של שידורים, אחד לכל פרופיל קידוד. צריך להוסיף את מודעות ה-pod לכל אחד מהמניפסטים של הווריאציות האלה. אחת הדרכים לעשות זאת היא להכין את כל המניפסטים של הווריאנטים ולהעביר אותם לרשת CDN (Content Delivery Network) לצורך אירוח. הפלייליסט הסופי עם המשתנים הרבים הוא קבוצה של קישורים למניפסטים האלה שמתארחים ב-CDN.

איטרציה על פרופילי קידוד

לכל פרופיל קידוד, אוספים את כל המניפסטים המשויכים של רצפי המודעות מהתגובה של Ad Manager, יחד עם זמני ההתחלה המשויכים שלהם. במודעות לפני סרטון (pre-roll), מגדירים את שעת ההתחלה כ-0. במודעות בסוף הסרטון, משתמשים במשך התוכן בתור שעת ההתחלה של רצף המודעות. מזהים את מקור הנתונים של הווריאנט בפלייליסט עם וריאציות מרובות שמתאים להגדרות האודיו והווידאו של כל פרופיל קידוד.

דוגמה למערך של מודעות ברצף
"ad_pods": [
    {
      "manifest_urls":{
        "1080p": "https://{...}/pod/0/profile/1080p.m3u8",
        "360p": "https://{...}/pod/0/profile/360p.m3u8",
        "subtitles-en": "https://{...}/pod/0/profile/subitles-en.vtt"
      },
      "type": "pre",
      "duration": 10.0
    },
    {
      "manifest_urls":{
        "1080p": "https://{...}/pod/1/profile/1080p.m3u8",
        "360p": "https://{...}/pod/1/profile/360p.m3u8",
        "subtitles-en": "https://{...}/pod/1/profile/subitles-en.vtt"
      },
      "type": "mid",
      "start": 15.0,
      "duration": 15.0,
      "midroll_index": 1
    },
    {
      "manifest_urls":{
        "1080p": "https://{...}/pod/2/profile/1080p.m3u8",
        "360p": "https://{...}/pod/2/profile/360p.m3u8",
        "subtitles-en": "https://{...}/pod/2/profile/subitles-en.vtt"
      },
      "type": "post",
      "duration": 10.0
    }
  ]
דוגמה לפלייליסט של תוכן עם וריאציות מרובות
#EXTM3U
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs0",LANGUAGE="en",NAME="English",AUTOSELECT=YES,DEFAULT=YES,URI="https://{...}/subitles-en.vtt"
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080,CODECS="avc1.4d000c,mp4a.40.5"
https://{...}/1080p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=640x360,CODECS="avc1.4d000d,mp4a.40.5"
https://{...}/360p.m3u8
דוגמה לנתוני וריאציות שנאספו
Encoding profile: "1080p"
Profile settings: {...}
Content manifest: https://{...}/1080p.m3u8
Ad pods (start time -> manifest):
    0 -> https://{...}/pod/0/profile/1080p.m3u8
   15 -> https://{...}/pod/1/profile/1080p.m3u8
  600 -> https://{...}/pod/2/profile/1080p.m3u8

הוספת מודעות לכל מניפסט של וריאנט

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

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

אם מניפסט התוכן מוצפן, צריך לאחסן את מפתח ההצפנה האחרון שנמצא לפני תחילת רצף המודעות הנוכחי בתג #EXT-X-KEY. לאחר מכן, צריך להוסיף את התג #EXT-X-KEY:METHOD=NONE כדי להסיר את ההצפנה לפני המקטע הראשון של כל רצף מודעות. לבסוף, כדי לשחזר את הצפנת התוכן, צריך להוסיף עותק של התג #EXT-X-KEY ששמור לפני הקטע הראשון של התוכן אחרי כל רצף מודעות.

דוגמה לנתוני וריאציות שנאספו
Encoding profile: "1080p"
Content manifest: https://{...}/1080p.m3u8
Ad pods (start time -> manifest):
    0 -> https://dai.google.com/{...}pod/0/profile/1080p.m3u8
   15 -> https://dai.google.com/{...}pod/1/profile/1080p.m3u8
  600 -> https://dai.google.com/{...}pod/2/profile/1080p.m3u8
דוגמה למניפסט תוכן

זהו התוכן של המניפסט https://{...}/1080p.m3u8 שמופיע בנתוני הווריאציות שנאספו.

#EXTM3U
{...}
#EXTINF:5.000,
https://{...}/1080p/content-segment-0.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-1.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-2.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-3.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-4.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-5.ts
{...}
דוגמה למניפסט של מודעות Pod

זהו התוכן של המניפסט https://dai.google.com/{...}/pod/1/profile/1080p.m3u8 שמופיע בנתוני הווריאציות שנאספו.

#EXTM3U
{...}
#EXTINF:5.000,
https://dai.google.com/{...}/0.ts
#EXTINF:5.000,
https://dai.google.com/{...}/1.ts
#EXTINF:5.000,
https://dai.google.com/{...}/2.ts
דוגמה למניפסט של וריאנט מודבק

זהו המניפסט של הווריאנטים המחובר, שיעבור ל-CDN ויתארח ב-https://cdn.{...}/{userid}/1080p.m3u8.

#EXTM3U
{...}
#EXTINF:5.000,
https://{...}/1080p/content-segment-0.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-1.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-2.ts
#EXT-X-DISCONTINUITY
#EXTINF:5.000,
https://dai.google.com/{...}/0.ts
#EXTINF:5.000,
https://dai.google.com/{...}/1.ts
#EXTINF:5.000,
https://dai.google.com/{...}/2.ts
#EXT-X-DISCONTINUITY
#EXTINF:5.000,
https://{...}/1080p/content-segment-3.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-4.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-5.ts
{...}

יצירת פלייליסט עם כמה וריאנטים

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

דוגמה לפלייליסט סופי עם וריאנטים מרובים
#EXTM3U
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs0",LANGUAGE="en",NAME="English",AUTOSELECT=YES,DEFAULT=YES,URI="https://cdn.{...}-subitles-en.vtt"
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080,CODECS="avc1.4d000c,mp4a.40.5"
https://cdn.{...}/{userid}/1080p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=640x360,CODECS="avc1.4d000d,mp4a.40.5"
https://cdn.{...}/{userid}/360p.m3u8

מקורות נתונים מסוג MPEG DASH

אם אתם עורכים מקבץ של שידורים בפורמט MPEG DASH, אתם צריכים ליצור רק קובץ אחד. כך קל יותר לחבר שידורי DASH מאשר שידורי HLS.

קובץ תיאור של הצגת מדיה (MPD) ב-MPEG DASH שעבר הכנה בצורה נכונה צריך לכלול כמה תקופות, שכל אחת מהן מכילה כמה ייצוגים. כל ייצוג צריך להתאים לאחד מהפרופילים שלכם לקידוד. כל רצף מודעות שמוחזר מ-Ad Manager הוא גם קובץ MPD שמכיל רצף של תקופות עם ייצוגים תואמים.

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

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

דוגמה ל-MPD של תוכן

<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" minBufferTime="PT1.500000S" type="static" mediaPresentationDuration="PT0H10M00.000S" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011">
  <ProgramInformation moreInformationURL="http://.../info">
    <Title>Example Stream</Title>
  </ProgramInformation>
  <Period duration="PT0H0M15.000S" id="content-period-1">
    ...
  </Period>
  <Period duration="PT0H0M15.000S" id="content-period-2">
    ...
  </Period>
  <Period duration="PT0H0M15.000S" id="content-period-3">
    ...
  </Period>
  ...
</MPD>

דוגמה לקובץ JSON של רצף מודעות

[{
  "mpd_uri": "https://{...}pod/1.mpd",
  "type": "mid",
  "start": 15.0,
  "duration": 15.0,
  "midroll_index": 1
}]

דוגמה ל-MPD של רצף מודעות

זהו התוכן של mpd_uri מקובץ ה-JSON של רצף המודעות שלמעלה.

<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" minBufferTime="PT1.500000S" type="static" mediaPresentationDuration="PT0H0M15.000S" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011">
  <ProgramInformation moreInformationURL="http://.../info">
    <Title>Ad Pod 1</Title>
  </ProgramInformation>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-1">
    ...
  </Period>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-2">
    ...
  </Period>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-3">
    ...
  </Period>
  ...
</MPD>

דוגמה ל-MPD מודבק

שולחים את התגובה הזו בתור התשובה לבקשה המקורית של קובץ המניפסט של הסטרימינג.

<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" minBufferTime="PT1.500000S" type="static" mediaPresentationDuration="PT0H10M15.000S" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011">
  <ProgramInformation moreInformationURL="http://.../info">
    <Title>Example Stream</Title>
  </ProgramInformation>
  <Period duration="PT0H0M15.000S" id="content-period-1">
    ...
  </Period>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-1">
    ...
  </Period>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-2">
    ...
  </Period>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-3">
    ...
  </Period>
  <Period duration="PT0H0M15.000S" id="content-period-2">
    ...
  </Period>
  <Period duration="PT0H0M15.000S" id="content-period-3">
    ...
  </Period>
  ...
</MPD>

מקורות מידע נוספים