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

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

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

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

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

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

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

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 האינדקס של הקטע הזה בתוך רצף המודעות הנוכחי, מתחיל ב-0.
כשמשתמשים במאגר MP4, אפשר לבקש את קטע האתחול על ידי הגדרת segment_number ל-"init".
פרמטרים של שאילתה
stream_id חובה הפרמטר stream_id של המשתמש שהוחזר מ'יצירת מקור נתונים' בקשה.
sd חובה segment_duration
so אופציונלי segment_offset

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

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

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

בקשה לתבנית תקופתית 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.

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