ה-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
– תאריך ושעת הסיום המתוכננים של האירוע. המאפיין הזה הוא נדרש אםunlimitedEndDateTime
is false and ignored if
unlimitedEndDateTimeis true.
unlimitedEndDateTime' – בוליאני. עיינו למעלה.
קבלת בקשות למניפסט של השידור
הכלי לטיפול במניפסט צריך לספק נקודת קצה ל-API כדי להאזין למניפסט בקשות מאפליקציית הלקוח של נגן הווידאו. לכל הפחות, נקודת הקצה איסוף מזהה שידור מאפליקציית הנגן של הלקוח, ועליו להחזיר מזהה תפור . מזהה מקור הנתונים משמש לזיהוי הסשן של הסטרימינג למודעה מנהל.
כמו כן, עליכם לאסוף מידע נוסף כדי לזהות זרם תוכן, לדוגמה, Content ID.
דוגמה לנקודת קצה (endpoint) פוטנציאלית של בקשה למניפסט
GET /api/video/{asset_key}/manifest.{format}
Host: {your_domain}
פרמטרים של נתיב | |||||
---|---|---|---|---|---|
asset_key |
מזהה היפותטי שתואם לשידור החי המבוקש במערכת. | ||||
format |
פרמטר היפותטי שתואם לפורמט של השידור. אחת מהאפשרויות האלה:
|
פרמטרים של שאילתה | |
---|---|
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
אם חסר |
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}&sd=5000&pd=$$pod-duration$$&cust_params=$$cust_params$$&auth_token=$$token$$" media="$RepresentationID$/$Number$.mp4?stream_id={a-stream-id}&sd=5000&pd=$$pod-duration$$&cust_params=$$cust_params$$&scte35=$$scte35$$&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&sd=5000&pd=$$pod-duration$$&cust_params=$$cust_params$$&auth_token=$$token$$" media="$RepresentationID$/$Number$.mp4?stream_id=ç√&sd=5000&pd=$$pod-duration$$&cust_params=$$cust_params$$&scte35=$$scte35$$&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&sd=5000&pd=30000&cust_params=&auth-token=&scte35=" initialization="$RepresentationID$/init.mp4?stream_id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS&pd=30000&cust_params=&auth-token=&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&sd=5000&pd=30000&cust_params=&auth-token=&scte35=$$scte35$$" initialization="$RepresentationID$/init.mp4?stream_id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS&pd=30000&cust_params=&auth-token=&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.
מקורות מידע נוספים
- הפעלת Pod באמצעות IMA SDK:
- פודקאסט להצגת מודעות באמצעות DAI API