Pod Serving API ให้สิทธิ์เข้าถึงกลุ่มโฆษณาที่เข้ารหัสและปรับสภาพแล้ว ซึ่งเตรียมไว้ให้ต่อเชื่อมกับเพลย์ลิสต์สื่อ HLS หรือ MPEG-DASH ที่แสดงต่อผู้ใช้ได้โดยตรง สําหรับ MPEG-DASH, Pod Serving API ยังมีเทมเพลตไฟล์ Manifest เพื่อแสดงข้อมูลเพิ่มเติมและบริบทสําหรับกลุ่มโฆษณาเหล่านี้ด้วย
คู่มือนี้มุ่งเน้นที่การใช้เซิร์ฟเวอร์การจัดการไฟล์ Manifest ที่แสดงในพ็อดแบบพื้นฐานสำหรับสตรีมแบบสด
สิ่งที่ต้องทำก่อน: กำหนดค่าเหตุการณ์สตรีมแบบสดใน Google Ad Manager
คุณต้องสร้างเหตุการณ์สตรีมแบบสดของ Ad Manager สําหรับสตรีมแต่ละรายการที่ประมวลผลก่อนส่งคําขอจาก API การแสดงพ็อด คุณสร้างกิจกรรมสตรีมแบบสดได้โดยใช้ LiveStreamEventService API
หรือเว็บอินเทอร์เฟซของ Google Ad Manager
หากต้องการใช้เหตุการณ์ไลฟ์สดกับ API การแสดงพ็อด คุณต้องป้อนแอตทริบิวต์หลายรายการของเหตุการณ์ ดังนี้
customAssetKey
- ตัวระบุที่กำหนดเองที่ใช้สำหรับเหตุการณ์นี้ ต้องไม่ซ้ำกันในเหตุการณ์ทั้งหมดสำหรับเครือข่ายadTags
- URL ของแท็กโฆษณาหลักที่สร้างโดยเวิร์กโฟลว์การดูแลการแสดงโฆษณาของ Ad ManagerdynamicAdInsertionType
- ต้องตั้งค่าเป็นPOD_SERVING_REDIRECT
streamingFormat
- ตั้งค่าเป็นHLS
หรือDASH
ให้สอดคล้องกันsegmentUrlAuthenticationKeyIds
- อย่างน้อย 1 รายการ คีย์ HMAC ใช้เพื่อลงชื่อคำขอกลุ่มโฆษณาdaiEncodingProfileIds
- รายการรหัส DAIEncodingProfile ที่เปิดใช้สำหรับเหตุการณ์นี้startDateTime
- วันที่และเวลาเริ่มต้นของกิจกรรมendDateTime
- วันที่และเวลาสิ้นสุดที่กำหนดไว้ของเหตุการณ์นี้ ต้องระบุแอตทริบิวต์นี้หากunlimitedEndDateTime
is false and ignored if
unlimitedEndDateTimeis true.
unlimitedEndDateTime` - บูลีน ดูด้านบน
รับคำขอไฟล์ Manifest ของสตรีม
เครื่องมือจัดการไฟล์ Manifest ของคุณต้องระบุปลายทาง API เพื่อรอรับไฟล์ Manifest จากแอปไคลเอ็นต์โปรแกรมเล่นวิดีโอ อย่างน้อยที่สุดปลายทางนี้ต้อง รวบรวมรหัสสตรีมจากแอปโปรแกรมเล่นไคลเอ็นต์ และต้องส่งคืนรหัสที่เย็บเข้าด้วยกัน ไฟล์ Manifest ของสตรีม ระบบใช้รหัสสตรีมเพื่อระบุเซสชันสตรีมมิงสำหรับโฆษณา ผู้จัดการ
นอกจากนี้ คุณยังต้องรวบรวมข้อมูลอื่นๆ เพื่อระบุเครื่องมือที่ใช้ สตรีมเนื้อหา เช่น Content ID
ตัวอย่างปลายทางคำขอไฟล์ Manifest ที่เป็นไปได้
GET /api/video/{asset_key}/manifest.{format}
Host: {your_domain}
พารามิเตอร์เส้นทาง | |||||
---|---|---|---|---|---|
asset_key |
รหัสสมมติที่เกี่ยวข้องกับสตรีมแบบสดที่ขอในระบบ | ||||
format |
พารามิเตอร์สมมติซึ่งสอดคล้องกับรูปแบบสตรีม ตัวเลือกใดตัวเลือกหนึ่งต่อไปนี้
|
พารามิเตอร์การค้นหา | |
---|---|
stream_id |
รหัสสตรีมของ Ad Manager จากแอปโปรแกรมเล่นวิดีโอไคลเอ็นต์ |
เรียกข้อมูลสตรีมเนื้อหา
ใช้รหัสเนื้อหาที่รวบรวมจากคำขอไฟล์ Manifest เพื่อเลือกสตรีมเนื้อหาที่จะต่อกับโฆษณา
ต่อกันกลุ่มโฆษณาในสตรีมเนื้อหา
การต่อ URL ของกลุ่มโฆษณาจะแตกต่างกันไป ขึ้นอยู่กับรูปแบบสตรีม
สตรีม HLS
ปกติแล้วสตรีม HLS จะแสดงเป็นไฟล์ Manifest หลายตัวแปร ซึ่งจะประกอบด้วยไฟล์ Manifest ชุดของลิงก์ไปยังไฟล์ Manifest ของรูปแบบที่สอดคล้องกับการเข้ารหัส โปรไฟล์
หมายเหตุ: เพื่อความง่ายดาย คู่มือนี้จะถือว่าสื่อ HLS ของคุณได้รับการเข้ารหัสในรูปแบบที่รวมเสียงและวิดีโอไว้ในไฟล์กลุ่มเดียวกัน
เพลย์ลิสต์เวอร์ชันแปรผันหลายตัวแปรของพร็อกซี
คุณจะต้องแทนที่ URL เพลย์ลิสต์เวอร์ชันแปรผันแต่ละรายการในหน้าตัวแปรหลายตัวแปรเดิม เพลย์ลิสต์ที่มีการเรียกปลายทางอื่นไปยัง เครื่องมือควบคุมเพื่อประมวลผล ไฟล์ Manifest ของตัวแปรที่เลือกไว้
ขั้นตอนที่เหลือสำหรับการต่อ HLS จะถือว่าระบบกำลังประมวลผลไฟล์ Manifest ของตัวแปรเดียว
ตัวอย่างปลายทางคำขอตัวแปรที่เป็นไปได้
GET /api/video/{asset_key}/variant/{variant_id}.m3u8
Host: {your_domain}
พารามิเตอร์เส้นทาง | |
---|---|
asset_key |
รหัสสมมติที่เกี่ยวข้องกับสตรีมแบบสดที่ขอในระบบ |
variant |
พารามิเตอร์สมมติที่มีตัวระบุสําหรับตัวแปรที่เฉพาะเจาะจง กำลังประมวลผล |
พารามิเตอร์การค้นหา | |
---|---|
stream_id |
รหัสสตรีมของ Ad Manager จากแอปโปรแกรมเล่นวิดีโอไคลเอ็นต์ ซึ่งใช้ที่นี่เพื่อระบุเซสชันของผู้ใช้ด้วยเครื่องมือจัดการไฟล์ Manifest |
ตัวอย่างไฟล์ Manifest แบบหลายตัวแปรที่ยังไม่ได้ประมวลผล
#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
ตัวอย่างไฟล์ Manifest หลายตัวแปรผ่านพร็อกซี
#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
ระบุกลุ่มช่วงพักโฆษณาและแทรกความไม่ต่อเนื่อง
ขณะที่ประมวลผลไฟล์ Manifest ของตัวแปร ให้ติดตามเวลาเริ่มต้น ระยะเวลา และดัชนีของช่วงพักโฆษณาที่กําลังจะมาถึงถัดไป จนกว่าไฟล์ Manifest แบบไดนามิกที่ประมวลผลอยู่จะมีส่วนที่เนื้อหาโฆษณาจะเข้ามาแทนที่
ช่วงพักโฆษณาอาจแบ่งออกจากกลุ่มเนื้อหาด้วยวิธีต่างๆ ขึ้นอยู่กับโปรแกรมเปลี่ยนไฟล์ วิธีทั่วไปอย่างหนึ่งในการแบ่งช่วงพักโฆษณาคือการใส่แท็ก #EXT-X-CUE-OUT
ไว้หน้ากลุ่มโฆษณา แล้วตามด้วยแท็ก #EXT-X-CUE-IN
หากต้องการแยกช่วงพักโฆษณาที่โฮสต์โดย Google ออกจากกลุ่มเนื้อหา คุณต้องแทรกแท็ก #EXT-X-DISCONTINUITY
ที่จุดเริ่มต้นและจุดสิ้นสุดของแต่ละช่วงพักโฆษณา หาก
แท็กความไม่ต่อเนื่องไม่ปรากฏในไฟล์ Manifest สุดท้าย การเล่นจะล้มเหลว
URI ของกลุ่มโฆษณาที่แทรกจะไม่เข้ารหัส หากเนื้อหาได้รับการเข้ารหัส คุณจะต้องนำการเข้ารหัสออกด้วยโดยระบุ #EXT-X-KEY:METHOD=NONE
ก่อนกลุ่มโฆษณาแรกของแต่ละช่วงพักโฆษณา แล้วเพิ่มกลับเข้าไปใหม่หลังจากช่วงพักโฆษณา
ไฟล์ Manifest ตัวอย่าง (ต้นฉบับ)
#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
ไฟล์ Manifest ที่มีการแทรกความไม่ต่อเนื่องแล้ว
#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
ประมวลผลกลุ่มพ็อดโฆษณา
สําหรับแต่ละกลุ่มภายในพ็อดโฆษณา คุณต้องติดตามค่าเพิ่มเติมอีก 2-3 ค่า ดังนี้
segment_number
: ดัชนีกลุ่มภายในพ็อดโฆษณา โดยเริ่มจาก 0 หรือ "init" สำหรับกลุ่มการเริ่มต้น mp4segment_duration
: ระยะเวลาของกลุ่มปัจจุบันเป็นมิลลิวินาที ช่วงเวลานี้ ควรค่าเหมือนกันสำหรับส่วนทั้งหมด ยกเว้นกลุ่มสุดท้ายในพ็อดsegment_offset
: การชดเชยกลุ่มที่คำนวณโดยการเพิ่มช่วงเวลาก่อนหน้า ระยะเวลาของกลุ่มเพื่อชดเชยกลุ่มในหน่วยมิลลิวินาทีlast
: ค่าบูลีนที่ระบุกลุ่มสุดท้ายในพ็อดโฆษณา ค่าเริ่มต้นคือเท็จ
สร้าง 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}
ตัวระบุตัวเลขสำหรับช่วงพักโฆษณาปัจจุบัน รหัสพ็อดโฆษณาคือ
ได้รับมอบหมายส่วนเพิ่มสำหรับแต่ละเหตุการณ์ช่วงพักโฆษณา โดยเริ่มต้นที่
ad_break_id/{string}
ตัวระบุสตริงของช่วงพักโฆษณาปัจจุบัน |
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 โทเค็น HMAC สำหรับพ็อดโฆษณานี้ |
last
|
ไม่บังคับ | บูลีนระบุกลุ่มสุดท้ายในช่วงพักโฆษณา ค่าเริ่มต้นคือ "เท็จ" |
ค่าพารามิเตอร์การค้นหาต้องเข้ารหัสอย่างถูกต้องเพื่อให้ URL ปลอดภัย ซึ่งสำคัญมากสำหรับช่อง auth-token
เนื่องจากอาจมีอักขระ /
,
+
และ =
ตัวอย่างไฟล์ Manifest (หลังการแทนที่กลุ่ม)
#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 เทมเพลตนี้จะกลายเป็นช่วงพักโฆษณาเมื่อระบบป้อนข้อมูลมาโครที่มีอยู่ในเทมเพลต
คุณควรขอเทมเพลตนี้เพียงครั้งเดียวต่อเซสชันสตรีม และแคชไว้เพื่อใช้ซ้ำกับช่วงพักโฆษณาแต่ละครั้ง
จุดสิ้นสุดคำขอเทมเพลตระยะเวลา
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}
ป้อนข้อมูลในเทมเพลตระยะเวลา
เทมเพลตระยะเวลาประกอบด้วยมาโครหลายรายการที่คุณต้องแทนที่สำหรับช่วงพักโฆษณาแต่ละช่วง ต้องแทนที่มาโครทั้งหมด ควรแทนที่มาโครที่ไม่ได้ใช้ด้วยสตริงว่าง ("")
มาโคร | คำอธิบาย | ตัวอย่าง |
---|---|---|
$$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$$ |
ข้อความที่เข้ารหัสและเข้ารหัส 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>
แทรกระยะเวลาที่ป้อนลงในไฟล์ Manifest ของ DASH
สุดท้าย ให้แทนที่ระยะเวลาที่เหมาะสมในไฟล์ Manifest ดิบด้วยระยะเวลาโฆษณาที่สร้างขึ้นใหม่ แล้วส่งไฟล์ Manifest ที่ต่อกันแล้วฉบับสุดท้ายไปยังไคลเอ็นต์วิดีโอที่ขอเพื่อเล่น
ตัวอย่างไฟล์ Manifest ของเนื้อหาดิบ
<?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>
ตัวอย่างไฟล์ Manifest ที่ต่อกัน
<?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