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

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

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

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

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

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

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

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

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

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_identifier}/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_identifier

הפורמטים הבאים נתמכים:

pod/{integer}

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

ad_break_id/{string}

מזהה המחרוזת של ההפסקה הנוכחית למודעה.

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/ad_break_id/adbreak1/profile/devrel4628000/0.ts?sd=5005&so=0&pd=18015&auth-token=ad_break_id%3Dadbreak1~custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~cust_params%3D~exp%3D1489680000~network_code%3D6062~pd%3D180000~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/ad_break_id/adbreak1/profile/devrel4628000/1.ts?sd=5005&so=5005&pd=18015&auth-token=ad_break_id%3Dadbreak1~custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~cust_params%3D~exp%3D1489680000~network_code%3D6062~pd%3D180000~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/ad_break_id/adbreak1/profile/devrel4628000/2.ts?sd=5005&so=10010&pd=18015&auth-token=ad_break_id%3adbreak1~custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~cust_params%3D~exp%3D1489680000~network_code%3D6062~pd%3D180000~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/ad_break_id/adbreak1/profile/devrel4628000/3.ts?sd=3000&so=15015&pd=18015&auth-token=ad_break_id%3Dadbreak1~custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~cust_params%3D~exp%3D1489680000~network_code%3D6062~pd%3D180000~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. התבנית הזו תהפוך לפרקי הזמן של ההפסקות למודעות, אחרי שהמאקרוים שהיא מכילה יאוכלסו.

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

בקשה לתבנית תקופתית endpointhjf
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 הזה מאמר במרכז העזרה. אם לא נדרשים פרמטרים מותאמים אישית, צריך להחליף את המאקרו הזה בערך ריק String. &cust_params=section%3Dblog%26anotherKey%3Dvalue1%2Cvalue2
$$scte35$$ צריך להחליף את המאקרו בערך scte35 ייחודי לאותו הפסקה למודעה, אם תספקו כתובת. אם לא נדרש מידע של scte35, צריך להחליף את המאקרו הזה במחרוזת ריקה. /DAqAAAAAAAA///wDwVAAAT2f0/+ecF1mQABC/8ACgAIQ1VFSQAAAAsuZVlR
$$token$$ כתובת URL חתומה בקידודי תווים שמתאימים לכתובות URL אסימון HMAC. חובה להוסיף את הטוקן הזה. 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.

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