הפעלת מניפולציה של מניפסט לשידורים חיים

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

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

דרישה מוקדמת: הגדרת אירועים בשידור חי ב-Google Ad Manager

לפני ששולחים בקשות מה-API להצגת רצף מודעות, עליכם ליצור אירוע בשידור חי ב-Ad Manager לכל שידור שאתם מעבדים. אפשר ליצור אירוע בשידור חי באמצעות LiveStreamEventService API או ממשק האינטרנט של Google Ad Manager.

כדי להשתמש באירוע בשידור חי עם API להצגת pod, צריך לאכלס כמה מאפיינים של האירוע:

  • customAssetKey – מזהה מותאם אישית שישמש לאירוע הזה. חייב להיות ייחודי בכל האירועים ברשת.
  • adTags – כתובת URL ראשית של תג מודעה שנוצרה על ידי תהליך העבודה לניהול טראפיק ב-Ad Manager.
  • dynamicAdInsertionType – חייב להיות מוגדר לערך POD_SERVING_REDIRECT.
  • streamingFormat – צריך להגדיר לערך HLS או DASH בהתאם.
  • segmentUrlAuthenticationKeyIds – לפחות מפתח HMAC אחד משמש לחתימה על בקשות לפלחי מודעות.
  • daiEncodingProfileIds – רשימה של מזהי DAIEncodingProfile שהופעלו לאירוע הזה.
  • startDateTime - תאריך ושעת ההתחלה של האירוע
  • endDateTime - תאריך ושעת הסיום המתוכננות של האירוע הזה. המאפיין הזה נדרש אם הערך unlimitedEndDateTimeis false and ignored ifunlimitedEndDateTimeis true.unlimitedEndDateTime' הוא ערך בוליאני. עיינו למעלה.

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

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

בנוסף, עליכם לאסוף מידע נוסף כדי לזהות את מקור התוכן המתאים, לדוגמה Content ID.

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

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

אחזור של זרם התוכן

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

חיבור פלחי מודעות אל זרם תוכן

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

שידורי HLS

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

הערה: כדי לפשט את המדריך, ההנחה היא שמדיה בפורמט HLS מקודדת בפורמט שמשלבת אודיו ווידאו באותו קובץ קטעים.

פלייליסטים רב-משתנים בשרת proxy

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

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

דוגמה לנקודת קצה פוטנציאלית של בקשת וריאנט
GET /api/video/{asset_key}/variant/{variant_id}.m3u8
Host: {your_domain}
פרמטרים של נתיב
asset_key מזהה היפותטי שתואם לשידור החי המבוקש במערכת.
variant פרמטר היפותטי שמכיל מזהה של הווריאנט הספציפי שעובר עיבוד.
פרמטרים של שאילתה
stream_id מזהה מקור הנתונים ב-Ad Manager מאפליקציית נגן הווידאו של הלקוח. משמש כאן לזיהוי סשן של משתמש עם המניפולציה של המניפסט.
דוגמה למניפסט רב-משתנים שלא עבר עיבוד
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080,CODECS="avc1.4d000c,mp4a.40.5"
https://cdn.{...}/1080p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2500000,RESOLUTION=1280x720,CODECS="avc1.4d000c,mp4a.40.5"
https://cdn.{...}/720p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=640x360,CODECS="avc1.4d000d,mp4a.40.5"
https://cdn.{...}/360p.m3u8
דוגמה למניפסט רב-משתנים באמצעות שרת proxy
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080,CODECS="avc1.4d000c,mp4a.40.5"
https://{manifest_manipulator}/api/video/tears_of_steel/variant/1080p.m3u8?stream_id=6e69425c-0ac5-43ef-b070-c5143ba68541:CHS
#EXT-X-STREAM-INF:BANDWIDTH=2500000,RESOLUTION=1280x720,CODECS="avc1.4d000c,mp4a.40.5"
https://{manifest_manipulator}/api/video/tears_of_steel/variant/720p.m3u8?stream_id=6e69425c-0ac5-43ef-b070-c5143ba68541:CHS
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=640x360,CODECS="avc1.4d000d,mp4a.40.5"
https://{manifest_manipulator}/api/video/tears_of_steel/variant/360p.m3u8?stream_id=6e69425c-0ac5-43ef-b070-c5143ba68541:CHS

זיהוי פלחים של הפסקות למודעות והוספת אי-רציפות

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

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

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

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

מניפסט לדוגמה (המקורי)
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0

#EXTINF:5.005,
contentorigin.com/1.ts
#EXTINF:5.005,
contentorigin.com/2.ts
#EXT-X-CUE-OUT:15.000
#EXTINF:5.005,
contentorigin.com/3.ts
#EXTINF:5.005,
contentorigin.com/4.ts
#EXTINF:5.005,
contentorigin.com/5.ts
#EXTINF:5.000,d
contentorigin.com/6.ts
#EXT-X-CUE-IN
#EXTINF:5.005,
contentorigin.com/7.mp4
#EXTINF:5.005,
contentorigin.com/8.mp4
קובץ מניפסט עם אי-רציפות
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0

#EXTINF:5.005,
contentorigin.com/1.ts
#EXTINF:5.005,
contentorigin.com/2.ts
#EXTINF:5.005,
#EXT-X-DISCONTINUITY
{... New segments will go here ...}
#EXT-X-DISCONTINUITY
#EXTINF:5.005,
contentorigin.com/7.mp4
#EXTINF:5.005,
contentorigin.com/8.mp4

עיבוד פלחים של רצף מודעות

לכל פלח ברצף מודעות צריך לעקוב אחרי כמה ערכים נוספים:

  • segment_number: אינדקס הפילוח בתוך רצף המודעות, שמתחיל באפס. או "init" למקטע אתחול mp4.
  • segment_duration: משך המקטע הנוכחי באלפיות השנייה. הערך הזה צריך להיות זהה בכל הפלחים, חוץ מהקטע האחרון ברצף.
  • segment_offset: היסט המקטע מחושב על ידי הוספת משך הזמן של הפלח הקודם להיסט הקטע שלו באלפיות השנייה
  • last: ערך בוליאני לזיהוי הפלח האחרון ברצף מודעות. ברירת המחדל היא FALSE.

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

מחליפים כל פלח בהפסקה למודעה בכתובת URL בפורמט:

/linear/pods/v1/seg/network/{network_code}/custom_asset/{custom_asset_key}/pod/{pod_id}/profile/{profile_name}/{segment_number}.(ts|mp4|vtt|aac|ac3|eac3)
פרמטרים של נתיב
network_code הקוד של רשת Ad Manager 360 לרשת הזו.
custom_asset_key מפתח הנכס המותאם אישית של הסטרימינג בשידור חי, שצוין ב-LiveStreamEventService API או בדף השידור החי בממשק האינטרנט של Ad Manager 360.
pod_id מזהה ההפסקה למודעה. צריך להיות מספר שלם שמתחיל ב-1 ומעלה באחד בכל הפסקה למודעה.

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

profile_name מזהה של הפרופיל המבוקש,
segment_number האינדקס של הפלח הזה ברצף המודעות הנוכחי, מתחיל באפס.
כשמשתמשים במאגר MP4, ניתן לבקש את פלח האתחול על ידי הגדרה של segment_number כ-"init".
פרמטרים של שאילתה
stream_id חובה הפרמטר stream_id של המשתמש שהוחזר מהבקשה ליצירת מקור נתונים.
sd חובה segment_duration
so אופציונלי segment_offset

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

pd חובה, למעט אירועים שבהם הופעלו הפסקות למודעות ללא משך זמן משך הזמן (באלפיות שנייה) של ההפסקה למודעה. נקרא גם ad_pod_duration.
auth-token חובה אסימון HMAC חתום עם קידוד כתובת URL עבור רצף המודעות הזה.
last אופציונלי ערך בוליאני שמציין את הפלח האחרון בהפסקה למודעה. ברירת המחדל היא FALSE.

ערכי הפרמטרים של השאילתה צריכים להיות מקודדים כראוי כדי להבטיח כתובות URL בטוחות. זה חשוב במיוחד לשדה auth-token כי הוא יכול להכיל את התווים /, + ו-=.

מניפסט לדוגמה (לאחר החלפת פלח)
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0

#EXTINF:5.005,
contentorigin.com/1.ts
#EXTINF:5.005,
contentorigin.com/2.ts
#EXT-X-DISCONTINUITY
#EXTINF:5.005,
https://dai.google.com/linear/pods/v1/seg/network/6062/custom_asset/iYdOkYZdQ1KFULXSN0Gi7g/pod/1/profile/devrel4628000/0.ts?sd=5005&so=0&pd=18015&auth-token=custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~cust_params%3D~exp%3D1489680000~network_code%3D6062~pd%3D180000~pod_id%3D5~hmac%3D44bf78223c240cbc5bae3cdfd794bfc6971b6583cd296f44ef3a46944605cf9a&stream_id=fe6c9136-09a4-4ff6-862e-daee1dea0e1b:MRN2
#EXTINF:5.005,
https://dai.google.com/linear/pods/v1/seg/network/6062/custom_asset/iYdOkYZdQ1KFULXSN0Gi7g/pod/1/profile/devrel4628000/1.ts?sd=5005&so=5005&pd=18015&auth-token=custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~cust_params%3D~exp%3D1489680000~network_code%3D6062~pd%3D180000~pod_id%3D5~hmac%3D44bf78223c240cbc5bae3cdfd794bfc6971b6583cd296f44ef3a46944605cf9a&stream_id=fe6c9136-09a4-4ff6-862e-daee1dea0e1b:MRN2
#EXTINF:5.005,
https://dai.google.com/linear/pods/v1/seg/network/6062/custom_asset/iYdOkYZdQ1KFULXSN0Gi7g/pod/1/profile/devrel4628000/2.ts?sd=5005&so=10010&pd=18015&auth-token=custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~cust_params%3D~exp%3D1489680000~network_code%3D6062~pd%3D180000~pod_id%3D5~hmac%3D44bf78223c240cbc5bae3cdfd794bfc6971b6583cd296f44ef3a46944605cf9a&stream_id=fe6c9136-09a4-4ff6-862e-daee1dea0e1b:MRN2
#EXTINF:3.000,
https://dai.google.com/linear/pods/v1/seg/network/6062/custom_asset/iYdOkYZdQ1KFULXSN0Gi7g/pod/1/profile/devrel4628000/3.ts?sd=3000&so=15015&pd=18015&auth-token=custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~cust_params%3D~exp%3D1489680000~network_code%3D6062~pd%3D180000~pod_id%3D5~hmac%3D44bf78223c240cbc5bae3cdfd794bfc6971b6583cd296f44ef3a46944605cf9a&stream_id=fe6c9136-09a4-4ff6-862e-daee1dea0e1b:MRN2&last=true
#EXT-X-DISCONTINUITY
#EXTINF:5.005,
contentorigin.com/7.mp4
#EXTINF:5.005,
contentorigin.com/8.mp4

כל הכבוד! אתם מציגים עכשיו שידור חי עם פלחים של מודעות שמסופקים על ידי DAI Pod serving API.

מקורות נתונים של DASH

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

תבנית של תקופת בקשה

מבקשים תבנית תקופה מ-Google Ad Manager. התבנית הזו תהפוך לתקופת ההפסקה למודעה, אחרי שפקודות המאקרו שהיא מכילה יאוכלסו.

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

בקשה לתבנית תקופה של Endhjf
GET /linear/pods/v1/dash/network/{network_code}/custom_asset/{custom_asset}/pods.json
Host: dai.google.com
Content-Type: application/json
פרמטרים של נתיב
network_code קוד רשת Ad Manager 360 של בעל התוכן הדיגיטלי.
custom_asset מפתח הנכס המותאם אישית של האירוע בשידור חי ב-Google Ad Manager.
פרמטרים של שאילתה
stream_id מזהה מקור הנתונים של Ad Manager מנגן הווידאו של הלקוח.
קובץ JSON של התשובה
dash_period_template מחרוזת ה-XML של תבנית התקופה.
segment_duration_ms משך הזמן של כל פלח מדיה של מודעה בתבנית התקופה של המקף, באלפיות השנייה.
בקשה לדוגמה (cURL)
curl https://dai.google.com/linear/pods/v1/dash/network/21775744923/custom_asset/tears_of_steel/pods.json?stream-id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS
דוגמה לתגובה
{"dash_period_template":"<Period id="adpod-$$pod-id$$" $$period-start$$ $$period-duration$$> <BaseURL>https://dai.google.com/linear/pods/v1/seg/event/{event_code}/pods/$$pod-id$$/profile/</BaseURL>
 <SegmentTemplate initialization="$RepresentationID$/init.mp4?stream_id={a-stream-id}&amp;sd=5000&pd=$$pod-duration$$&amp;cust_params=$$cust_params$$&amp;auth_token=$$token$$" media="$RepresentationID$/$Number$.mp4?stream_id={a-stream-id}&amp;sd=5000&pd=$$pod-duration$$&amp;cust_params=$$cust_params$$&amp;scte35=$$scte35$$&amp;auth_token=$$token$$" startNumber="1" presentationTimeOffset="0">
  <SegmentTimeline>
    <S t="0" d="5" r="$$number-of-repeated-segments$$"/>
  </SegmentTimeline>
  </SegmentTemplate>
  <AdaptationSet id="0" width="1280" height="720" frameRate="30" contentType="video" subsegmentAlignment="true" startWithSAP="1">
    <InbandEventStream schemeIdUri="https://developer.apple.com/streaming/emsg-id3"/>
    <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
    <Representation mimeType="video/mp4" codecs="avc1.640029" id="a943ff679a2f3e71d9181a21b7542122g" bandwidth="3200000"/>
    <Representation mimeType="video/mp4" codecs="avc1.640029" id="abbbd80q4w5ce2fs28308rd1f4g4bat0" bandwidth="1500000"/>
  </AdaptationSet>
  <AdaptationSet id="1" contentType="audio"> <Representation audioSamplingRate="48000" mimeType="audio/mp4" codecs="mp4a.40.2" id="a87ff679a2f3e71d9181a67b7542122c" bandwidth="95000"/>

    <Representation audioSamplingRate="48000" mimeType="audio/mp4" codecs="mp4a.40.2" id="eccbc87e4b5ce2fe28308fd9f2a7baf3" bandwidth="127000"/>
  </AdaptationSet>
</Period>",
"segment_duration_ms":5000}

אכלוס התבנית לתקופה

תבנית התקופה כוללת כמה פקודות מאקרו שצריך להחליף לכל הפסקה למודעה. צריך להחליף את כל רכיבי המאקרו. צריך להחליף פקודות מאקרו שלא בשימוש במחרוזת ריקה ("").

Macro תיאור דוגמה
$$pod-id$$ האינדקס של רצף המודעות שהתקופה הזו מייצגת. הערך הזה צריך להיות תואם לאותו רצף מודעות בכל הסשנים של הצופים. 1
$$period-start$$ השעה שבה התקופה מתחילה ב-MPD הנוכחי. מאפיין אופציונלי שצריך להחליף ב-start="###", כאשר ### הוא שעת ההצגה שבה ההפסקה למודעה מתחילה. אם לא צוינה שעת ההתחלה של התקופה, יש להחליף את המאקרו הזה במחרוזת ריקה. start="PT2H33M30S"
$$period-duration$$ משך הזמן של כל תקופת המודעות. מאפיין אופציונלי שצריך להחליף ב-duration="###", כאשר ### הוא משך תקופת המודעה בפורמט הרגיל של משך DASH. אם לא משך הזמן של התקופה, צריך להחליף את המאקרו הזה במחרוזת ריקה. duration="PT15S"
$$pod-duration$$ משך הזמן הצפוי של הצגת מודעות עבור רצף המודעות הזה, באלפיות שנייה. 15000
$$number-of-repeated-segments$$ הערך הזה מחושב על ידי חלוקת משך הזמן של תקופת המודעה (באלפיות שנייה) בערך של segment_duration_ms, ועיגול כלפי מעלה למספר השלם הקרוב ביותר. 3
$$cust_params$$ ניתן להחליף את המאקרו הזה בפרמטרים מותאמים אישית של טירגוט ייחודיים להפסקה הנוכחית למודעות, אם רלוונטי. פורמט הערך צריך להיות תואם להנחיות שמפורטות במאמר הזה במרכז העזרה של Ad Manager. אם לא נדרשים פרמטרים מותאמים אישית, יש להחליף את המאקרו במחרוזת ריקה. &cust_params=section%3Dblog%26anotherKey%3Dvalue1%2Cvalue2
$$scte35$$ יש להחליף את המאקרו בערך scte35 הייחודי להפסקה למודעה הזו, אם צוין. אם לא נדרש מידע scte35, יש להחליף את המאקרו הזה במחרוזת ריקה. /DAqAAAAAAAA///wDwVAAAT2f0/+ecF1mQABC/8ACgAIQ1VFSQAAAAsuZVlR
$$token$$ אסימון HMAC חתום בקידוד כתובת URL. חובה להשתמש באסימון הזה. custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~exp%3D1489680000~network_code%3D6062~pd%3D180000~pod_id%3D5~hmac%3D6a8c44c72e4718ff63ad2284edf2a8b9e319600b430349d31195c99b505858c9
תבנית של תקופה גולמית, שמכילה פקודות מאקרו
<Period id="adpod-$$pod-id$$" $$period-start$$ $$period-duration$$>
  <BaseURL>
    https://dai.google.com/linear/pods/v1/seg/event/{event_code}/pods/$$pod-id$$/profile/
  </BaseURL>
  <SegmentTemplate initialization="$RepresentationID$/init.mp4?stream_id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS&amp;sd=5000&pd=$$pod-duration$$&amp;cust_params=$$cust_params$$&amp;auth_token=$$token$$" media="$RepresentationID$/$Number$.mp4?stream_id=ç√&amp;sd=5000&pd=$$pod-duration$$&amp;cust_params=$$cust_params$$&amp;scte35=$$scte35$$&amp;auth_token=$$token$$" startNumber="1" presentationTimeOffset="0">  
    <SegmentTimeline>
      <S t="0" d="5" r="$$number-of-repeated-segments$$"/>
    </SegmentTimeline>
  </SegmentTemplate>
  <AdaptationSet id="0" width="1280" height="720" frameRate="30" contentType="video" subsegmentAlignment="true" startWithSAP="1">
    <InbandEventStream schemeIdUri="https://developer.apple.com/streaming/emsg-id3"/>
    <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
    <Representation mimeType="video/mp4" codecs="avc1.640029" id="a943ff679a2f3e71d9181a21b7542122g" bandwidth="3200000"/>
    <Representation mimeType="video/mp4" codecs="avc1.640029" id="abbbd80q4w5ce2fs28308rd1f4g4bat0" bandwidth="1500000"/>
  </AdaptationSet>
  <AdaptationSet id="1" contentType="audio"> <Representation audioSamplingRate="48000" mimeType="audio/mp4" codecs="mp4a.40.2" id="a87ff679a2f3e71d9181a67b7542122c" bandwidth="95000"/>
    <Representation audioSamplingRate="48000" mimeType="audio/mp4" codecs="mp4a.40.2" id="eccbc87e4b5ce2fe28308fd9f2a7baf3" bandwidth="127000"/>
  </AdaptationSet>
</Period>
תקופת מודעות אכלוס
<Period id="pod-0" start="PT5H50M12S">
  <BaseURL>
    https://dai.google.com/linear/pods/v1/seg/event/M-nTcApTRTi6CEGIt4GYMw/pod/0/profile/
  </BaseURL>
  <SegmentTemplate startNumber="0" media="1080p/0.mp4?stream_id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS&amp;sd=5000&amp;pd=30000&amp;cust_params=&amp;auth-token=&amp;scte35=" initialization="$RepresentationID$/init.mp4?stream_id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS&amp;pd=30000&amp;cust_params=&amp;auth-token=&amp;scte35=">
    <SegmentTimeline>
      <S d="5" r="1"/>
    </SegmentTimeline>
  </SegmentTemplate>
  <AdaptationSet mimeType="video/mp4" scanType="progressive" contentType="video">
    <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
    <Representation width="768" height="432" frameRate="30" codecs="avc1.42c01e" id="fmp4-video-1200k" bandwidth="1300000">
      <InbandEventStream schemeIdUri="https://developer.apple.com/streaming/emsg-id3"/>
    </Representation>
  </AdaptationSet>
  <AdaptationSet mimeType="audio/mp4" scanType="progressive" contentType="audio">
    <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
      <Representation audioSamplingRate="48000" codecs="mp4a.40.2" id="fmp4-audio-128kbps" bandwidth="128000">
      <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
    </Representation>
  </AdaptationSet>
</Period>

הוספת התקופה המאוכלסת למניפסט DASH

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

דוגמה למניפסט של תוכן גולמי
<?xml version="1.0"?>
  <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" profiles="urn:mpeg:dash:profile:isoff-main:2011" type="static" mediaPresentationDuration="PT0H9M56.46S">
    <BaseURL>
      http://example.com/tears_of_steel/
    </BaseURL>
    <Period start="PT0S">
      <AdaptationSet bitstreamSwitching="true">

        <Representation id="0" codecs="avc1" mimeType="video/mp4" width="1920" height="1080" startWithSAP="1" bandwidth="500000">
          <SegmentBase>
            <Initialization sourceURL="segments/1080/1.m4s" range="0-862"/>
          </SegmentBase>
          <SegmentList duration="15">
            <SegmentURL media="segments/1080p/2.m4s" mediaRange="863-7113"/>
            <SegmentURL media="segments/1080p/3.m4s" mediaRange="7114-14104"/>
            <SegmentURL media="segments/1080p/4.m4s" mediaRange="14105-17990"/>
            ...
          </SegmentList>
        </Representation>

        <Representation id="1" codecs="avc1" mimeType="video/mp4" width="1280" height="720" startWithSAP="1" bandwidth="250000">
          <SegmentBase>
            <Initialization sourceURL="segments/720p/1.m4s" range="0-864"/>
          </SegmentBase>
          <SegmentList duration="15">
            <SegmentURL media="segments/720p/2.m4s" mediaRange="865-11523"/>
            <SegmentURL media="segments/720p/3.m4s" mediaRange="11524-25621"/>
            <SegmentURL media="segments/720p/4.m4s" mediaRange="25622-33693"/>
            ...
          </SegmentList>
        </Representation>

        <Representation id="1" codecs="avc1" mimeType="video/mp4" width="640" height="480" startWithSAP="1" bandwidth="100000">
          <SegmentBase>
            <Initialization sourceURL="segment/480p/1.m4s" range="0-865"/>
          </SegmentBase>
          <SegmentList duration="15">
            <SegmentURL media="segment/480p/2.m4s" mediaRange="866-26970"/>
            <SegmentURL media="segment/480p/3.m4s" mediaRange="26971-72543"/>
            <SegmentURL media="segment/480p/4.m4s" mediaRange="72544-95972"/>
            ...
          </SegmentList>
        </Representation>
        ...
      </AdaptationSet>
    </Period end>
  </MPD>
דוגמה למניפסט עם חיבור
<?xml version="1.0"?>
  <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" profiles="urn:mpeg:dash:profile:isoff-main:2011" type="static" mediaPresentationDuration="PT0H9M56.46S">
    <BaseURL>
      http://example.com/tears_of_steel/
    </BaseURL>
    
    <Period id="pod-0" start="PT5H50M12S">
  <BaseURL>
    https://dai.google.com/linear/pods/v1/seg/event/M-nTcApTRTi6CEGIt4GYMw/pod/0/profile/
  </BaseURL>
  <SegmentTemplate startNumber="0" media="1080p/0.mp4?stream_id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS&amp;sd=5000&amp;pd=30000&amp;cust_params=&amp;auth-token=&amp;scte35=$$scte35$$" initialization="$RepresentationID$/init.mp4?stream_id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS&amp;pd=30000&amp;cust_params=&amp;auth-token=&amp;scte35=$$scte35$$">
    <SegmentTimeline>
      <S d="5" r="1"/>
    </SegmentTimeline>
  </SegmentTemplate>
  <AdaptationSet mimeType="video/mp4" scanType="progressive" contentType="video">
    <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
    <Representation width="768" height="432" frameRate="30" codecs="avc1.42c01e" id="fmp4-video-1200k" bandwidth="1300000">
      <InbandEventStream schemeIdUri="https://developer.apple.com/streaming/emsg-id3"/>
    </Representation>
  </AdaptationSet>
  <AdaptationSet mimeType="audio/mp4" scanType="progressive" contentType="audio">
    <Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
      <Representation audioSamplingRate="48000" codecs="mp4a.40.2" id="fmp4-audio-128kbps" bandwidth="128000">
      <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
    </Representation>
  </AdaptationSet>
</Period>
    
</MPD>

כל הכבוד! עכשיו אתם מציגים שידור חי של DASH עם פלחים של מודעות שסופקו על ידי DAI Pod serving API.

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