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

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

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

ad_break_id/{string}

ตัวระบุสตริงของช่วงพักโฆษณาปัจจุบัน

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/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}&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 Serving API ระบุ

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