ה-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
- תאריך ושעת הסיום המתוכננות של האירוע הזה. המאפיין הזה נדרש אם הערךunlimitedEndDateTime
is false and ignored if
unlimitedEndDateTimeis true.
unlimitedEndDateTime' הוא ערך בוליאני. עיינו למעלה.
קבלת בקשות לשידור מניפסט
הגורם המפעיל של המניפסט צריך לספק נקודת קצה ל-API כדי להאזין לבקשות מניפסט מאפליקציית הלקוח של נגן הווידאו. לכל הפחות, נקודת הקצה הזו צריכה לאסוף מזהה שידור מאפליקציית נגן הלקוח ולהחזיר מניפסט סטרימינג מאוחד. מזהה מקור הנתונים משמש לזיהוי סשן הסטרימינג ב-Ad Manager.
בנוסף, עליכם לאסוף מידע נוסף כדי לזהות את מקור התוכן המתאים, לדוגמה Content ID.
דוגמה לנקודת קצה פוטנציאלית של בקשה במניפסט
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
|
האינדקס של הפלח הזה ברצף המודעות הנוכחי, מתחיל באפס. כשמשתמשים במאגר MP4, ניתן לבקש את פלח האתחול על ידי הגדרה של segment_number כ-"init". |
פרמטרים של שאילתה | ||
---|---|---|
stream_id
|
חובה | הפרמטר stream_id של המשתמש שהוחזר מהבקשה ליצירת
מקור נתונים.
|
sd
|
חובה | segment_duration
|
so
|
אופציונלי | segment_offset
אם השדה |
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}&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. אם לא נדרשים פרמטרים מותאמים אישית, יש להחליף את המאקרו במחרוזת ריקה. |
&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&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.
מקורות מידע נוספים
- הצגת פודים באמצעות IMA SDK:
- הפעלה של הצגת פודים באמצעות DAI API