Pod Serve API ให้คุณเข้าถึงกลุ่มโฆษณาที่เข้ารหัสและปรับสภาพ ที่จัดเตรียมไว้ในลักษณะที่สามารถเย็บต่อเข้ากับ HLS ที่ผู้ใช้เห็นโดยตรง หรือเพลย์ลิสต์สื่อ MPEG-DASH สำหรับ MPEG-DASH พ็อดการแสดง API ยังมี เทมเพลตไฟล์ Manifest เพื่อให้ข้อมูลและบริบทเพิ่มเติมสำหรับโฆษณาเหล่านี้ กลุ่ม
คู่มือนี้มุ่งเน้นไปที่การใช้การจัดการไฟล์ Manifest ที่แสดงในพ็อดแบบพื้นฐาน เซิร์ฟเวอร์สำหรับสตรีมแบบสด
สิ่งที่ต้องทำก่อน: กำหนดค่าเหตุการณ์สตรีมแบบสดใน Google Ad Manager
ก่อนส่งคำขอจาก API สำหรับการแสดงโฆษณาพ็อด คุณต้องสร้างโฆษณาก่อน
ผู้จัดการเหตุการณ์สตรีมแบบสดสำหรับสตรีมแต่ละรายการที่คุณประมวลผล คุณสามารถสร้าง
กิจกรรมสตรีมแบบสดโดยใช้
LiveStreamEventService API
หรือ
อินเทอร์เฟซเว็บของ Google Ad Manager
คุณจะต้องมีคุณสมบัติต่อไปนี้สำหรับเหตุการณ์สตรีมแบบสดที่จะใช้กับ Pod Serve 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/{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 โทเค็น 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/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 Serve 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 Serve API
แหล่งข้อมูลเพิ่มเติม
- พ็อดที่แสดงการเล่นด้วย IMA SDK
- พ็อดที่แสดงการเล่นด้วย DAI API