เครื่องมือจัดการไฟล์ Manifest สำหรับสตรีมแบบสด

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 Manager
  • dynamicAdInsertionType - ต้องตั้งค่าเป็น POD_SERVING_REDIRECT
  • streamingFormat - ตั้งค่าเป็น HLS หรือ DASH ให้สอดคล้องกัน
  • segmentUrlAuthenticationKeyIds - อย่างน้อย 1 รายการ คีย์ HMAC ใช้เพื่อลงชื่อคำขอกลุ่มโฆษณา
  • daiEncodingProfileIds - รายการ DAIEncodingProfile เปิดใช้รหัสสำหรับกิจกรรมนี้แล้ว
  • startDateTime - วันที่และเวลาเริ่มต้นของกิจกรรม
  • endDateTime - วันที่และเวลาสิ้นสุดที่กำหนดไว้ของกิจกรรมนี้ แอตทริบิวต์นี้ ต้องระบุหาก unlimitedEndDateTimeis false and ignored ifunlimitedEndDateTimeis true.unlimitedEndDateTime" - บูลีน ดูด้านบน

รับคำขอไฟล์ Manifest ของสตรีม

เครื่องมือจัดการไฟล์ Manifest ของคุณต้องระบุปลายทาง API เพื่อรอรับไฟล์ Manifest จากแอปไคลเอ็นต์โปรแกรมเล่นวิดีโอ อย่างน้อยที่สุดปลายทางนี้ต้อง รวบรวมรหัสสตรีมจากแอปโปรแกรมเล่นไคลเอ็นต์ และต้องส่งคืนรหัสที่เย็บเข้าด้วยกัน ไฟล์ Manifest ของสตรีม ระบบใช้รหัสสตรีมเพื่อระบุเซสชันสตรีมมิงสำหรับโฆษณา ผู้จัดการ

นอกจากนี้ คุณยังต้องรวบรวมข้อมูลอื่นๆ เพื่อระบุเครื่องมือที่ใช้ สตรีมเนื้อหา เช่น Content ID

ตัวอย่างปลายทางของคำขอไฟล์ Manifest ที่เป็นไปได้

GET /api/video/{asset_key}/manifest.{format}
Host: {your_domain}
พารามิเตอร์เส้นทาง
asset_key รหัสสมมติที่เกี่ยวข้องกับสตรีมแบบสดที่ขอในระบบ
format พารามิเตอร์สมมติที่สอดคล้องกับรูปแบบสตรีม อย่างใดอย่างหนึ่งต่อไปนี้
mpd สำหรับสตรีม MPEG-DASH
m3u8 สำหรับสตรีม HLS
พารามิเตอร์การค้นหา
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" สำหรับกลุ่มการเริ่มต้น MP4
  • segment_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

หาก so ขาดหายไป ระบบจะถือว่ากลุ่มก่อนหน้าทั้งหมด มีระยะเวลาเท่ากัน และการชดเชยกลุ่มคำนวณจาก segment_number และ sd

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}&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}

ป้อนข้อมูลในเทมเพลตระยะเวลา

เทมเพลตระยะเวลามีมาโครหลายรายการที่คุณต้องแทนที่สำหรับแต่ละโฆษณา พัก ต้องแทนที่มาโครทั้งหมด มาโครที่ไม่ได้ใช้งานควรแทนที่ด้วยมาโคร สตริงว่าง ("")

มาโคร คำอธิบาย ตัวอย่าง
$$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&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>

แทรกระยะเวลาที่คุณป้อนลงในไฟล์ 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&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 Serve API

แหล่งข้อมูลเพิ่มเติม