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

Pod Serve API ให้สิทธิ์เข้าถึงพ็อดโฆษณาวิดีโอแบบปรับอัตราบิต ซึ่งจัดเตรียมในลักษณะที่สามารถต่อเข้ากับเพลย์ลิสต์สื่อ HLS หรือ MPEG-DASH ที่แสดงต่อผู้ใช้ได้โดยตรง

คู่มือนี้เน้นการใช้เซิร์ฟเวอร์การจัดการไฟล์ Manifest ของพ็อดที่ให้บริการขั้นพื้นฐานสำหรับสตรีม VOD

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

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

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

ตัวอย่างปลายทางของคำขอไฟล์ Manifest

GET /api/stream_id/{stream_id}/video/{content_id}.{format}
Host: {your_domain}
พารามิเตอร์เส้นทาง
stream_id รหัสสตรีม Ad Manager จากแอปโปรแกรมเล่นวิดีโอของไคลเอ็นต์
content_id รหัสสมมติที่เกี่ยวข้องกับวิดีโอเนื้อหาในระบบของคุณ
format พารามิเตอร์สมมติที่เกี่ยวข้องกับรูปแบบสตรีม ประเภทใดประเภทหนึ่งต่อไปนี้
mpd สำหรับสตรีม MPEG-DASH
m3u8 สำหรับสตรีม HLS

เรียกสตรีมเนื้อหา

ใช้รหัสเนื้อหาที่รวบรวมจากคำขอไฟล์ Manifest เพื่อเลือกสตรีมเนื้อหาที่จะต่อเข้ากับโฆษณา

ขอไฟล์ Manifest ของพ็อดโฆษณา

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

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

POST /ondemand/pods/api/v1/network/{network_code}/streams/{stream_id}/adpods
Host: dai.google.com
Content-Type: application/json
พารามิเตอร์เส้นทาง
network_code รหัสเครือข่าย Ad Manager 360 ของผู้เผยแพร่โฆษณา
stream_id รหัสสตรีมจากแอปโปรแกรมเล่นวิดีโอของไคลเอ็นต์

เนื้อหา JSON

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

เพื่อให้การเล่นเป็นไปอย่างราบรื่นที่สุด ข้อมูลนี้ควรตรงกับชุดโปรไฟล์การเข้ารหัสที่ใช้ในสตรีมเนื้อหา

ad_tag Required แท็กโฆษณาที่จะขอโฆษณา VMAP
cuepoints Optional รายการจุดเริ่มโฆษณาภายในสตรีมเนื้อหาที่จะแทรกช่วงพักโฆษณาตอนกลาง จุดเริ่มโฆษณาจะวัดเป็นวินาทีของจุดทศนิยม

จำเป็นสำหรับการตอบสนองของ VMAP ที่มีโฆษณาตอนกลางที่ใช้ออฟเซ็ตเวลาตำแหน่งเท่านั้น กรณีนี้พบได้ไม่บ่อยนัก

content_duration_seconds Optional ระยะเวลาของเนื้อหาเป็นวินาที

จำเป็นเฉพาะสำหรับการตอบกลับ VMAP ที่มีโฆษณาตอนกลางที่ใช้การชดเชยเวลา เปอร์เซ็นต์ กรณีนี้พบได้ไม่บ่อยนัก

manifest_type Optional รูปแบบของสตรีมโฆษณาที่ขอ โดยอาจเป็น hls หรือ dash ค่าเริ่มต้นคือ hls
dai_options Optional ตัวเลือกเพิ่มเติมที่ควบคุมลักษณะการแสดงผลไฟล์ Manifest โปรดดูรายละเอียดด้านล่าง
โปรไฟล์การเข้ารหัส
profile_name Required ตัวระบุสำหรับโปรไฟล์การเข้ารหัสนี้ ค่านี้สามารถเป็นสตริงใดก็ได้ที่คุณเลือก แต่คุณไม่สามารถมีโปรไฟล์การเข้ารหัสหลายโปรไฟล์ที่มีชื่อเดียวกันในสตรีมเดียวกัน
type Required ประเภทการเข้ารหัสของสตรีมที่อธิบายโดยโปรไฟล์การเข้ารหัสนี้ ประเภทเนื้อหา ได้แก่ media, iframe, subtitles
container_type Required รูปแบบคอนเทนเนอร์ที่โปรไฟล์การเข้ารหัสนี้ใช้ รูปแบบคอนเทนเนอร์ ได้แก่ mpeg2ts, fmp4cmaf, hls_packed_audio
video_settings Optional ต้องระบุหากประเภทโปรไฟล์การเข้ารหัสคือ iframe มิเช่นนั้น ระบบจะอนุญาตเฉพาะกรณีที่ประเภทสื่อมีวิดีโอ ดูรายละเอียดด้านล่าง
audio_settings Optional ต้องระบุหากโปรไฟล์การเข้ารหัสมีเสียง อนุญาตเฉพาะกรณีที่ประเภทเป็นสื่อ โปรดดูรายละเอียดด้านล่าง
subtitle_settings Optional ต้องระบุหากโปรไฟล์การเข้ารหัสมีคำบรรยาย โปรดดูรายละเอียดด้านล่าง
การตั้งค่าวิดีโอ
codec Required สตริงตัวแปลงรหัส RFC6381

เช่น avc1.4d000c

bitrate Required จำนวนเต็มที่แสดงอัตราบิตของวิดีโอสูงสุดของโปรไฟล์นี้ในหน่วยไบต์ต่อวินาที
frames_per_second Required FPS ที่เป็นจุดทศนิยมของวิดีโอ
resolution Required ค่าที่เข้ารหัสด้วย JSON ที่มี "ความกว้าง" และ "ความสูง" ของวิดีโอเป็นพิกเซล

เช่น {"width": 640, "height": 320}

การตั้งค่าเสียง
codec Required สตริงตัวแปลงรหัส RFC6381

เช่น mp4a.40.5

bitrate Required จำนวนเต็มที่แสดงอัตราบิตของเสียงสูงสุดของโปรไฟล์นี้ในหน่วยไบต์ต่อวินาที

เช่น 300000

channels Required จำนวนเต็มที่แสดงจำนวนช่องสัญญาณเสียง รวมถึงช่องสัญญาณเสียงที่มีความถี่ต่ำ
sample_rate Required จำนวนเต็มที่แสดงอัตราสุ่มเสียงเป็นเฮิรตซ์

เช่น 4800

การตั้งค่าคำบรรยาย
format Required รูปแบบไฟล์ที่คำบรรยายในย่านใช้ ค่าที่รองรับคือ webvtt หรือ ttml
language Optional ภาษาคำบรรยายเป็นสตริงภาษา RFC5646 หากระบุ ระบบจะใช้ค่านี้สำหรับการแสดงผล DASH เท่านั้น

เช่น en-us

ตัวเลือก DAI
dash_profile Optional โปรไฟล์ MPEG-DASH สำหรับใช้กับไฟล์ Manifest ของพ็อดโฆษณา การตั้งค่านี้ใช้สำหรับไฟล์ Manifest สำหรับ DASH เท่านั้น ค่าที่อนุญาตคือ live หรือ on-demand ค่าเริ่มต้นคือ on-demand

ค่า live สอดคล้องกับโปรไฟล์ MPEG-DASH "urn:mpeg:dash:profile:isoff-live:2011"

ค่า on-demand สอดคล้องกับโปรไฟล์ MPEG-DASH urn:mpeg:dash:profile:isoff-on-demand:2011

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

คำตอบ

พารามิเตอร์การตอบสนอง
valid_for ระยะเวลาที่เพลย์ลิสต์พ็อดโฆษณาเหล่านี้ใช้ได้ในรูปแบบ dhms (วัน ชั่วโมง นาที วินาที)
valid_until วันที่และเวลาที่เพลย์ลิสต์พ็อดโฆษณาจะใช้เป็นสตริงวันที่และเวลา ISO8601 ในรูปแบบ yyyy-MM-dd'T'hh:mm:ss.sssssssss[+|-]hh:mm ได้
ad_pods รายการพ็อดโฆษณาที่เลือกสำหรับสตรีมนี้
พ็อดโฆษณา
manifest_uris สำหรับสตรีม HLS เท่านั้น แมปของรหัสโปรไฟล์การเข้ารหัสกับ URI ไฟล์ Manifest ของ HLS
mpd_uri สำหรับสตรีม DASH เท่านั้น URI ของ DASH MPD
type ประเภทของพ็อดโฆษณา ประเภทพ็อดโฆษณาคือ pre, mid หรือ post
start สำหรับพ็อดโฆษณาตอนกลางเท่านั้น ตำแหน่งในสตรีมที่ควรแทรกพ็อดโฆษณานี้เป็นวินาทีจุดลอยตัว
duration ระยะเวลาของพ็อดโฆษณานี้ในหน่วยวินาทีที่เป็นจุดทศนิยม
midroll_index สำหรับพ็อดโฆษณาตอนกลางเท่านั้น ดัชนีของพ็อดโฆษณาตอนกลางปัจจุบัน การจัดทำดัชนีเริ่มต้นด้วย 1

ตัวอย่างคำขอ (cURL)

curl -X POST \
     -d '@request-body.json' \
     -H 'Content-Type: application/json' \
  https://dai.google.com/ondemand/pods/api/v1/network/21775744923/streams/6e69425c-0ac5-43ef-b070-c5143ba68541:CHS/adpods

ตัวอย่างเนื้อหาของคำขอ

นี่คือเนื้อหาของ request_body.json ที่อ้างอิงในการเรียก cURL ข้างต้น

{
  "encoding_profiles": [
   {
     "profile_name": "1080p",
     "type": "media",
     "container_type": "mpeg2ts",
     "video_settings": {
       "codec": "avc1.4d000c",
       "bitrate": 5000000,
       "frames_per_second": 30.0,
       "resolution": {
         "width": 1920,
         "height": 1080
       }
     },
     "audio_settings": {
       "codec": "mp4a.40.5",
       "bitrate": 300000,
       "channels": 2,
       "sample_rate": 48000
     }
   },
   {
     "profile_name": "360p",
     "type": "media",
     "container_type": "mpeg2ts",
     "video_settings": {
       "codec": "avc1.4d000d",
       "bitrate": 1000000,
       "frames_per_second": 30.0,
       "resolution": {
         "width": 640,
         "height": 360
       }
     },
     "audio_settings": {
       "codec": "mp4a.40.5",
       "bitrate": 64000,
       "channels": 2,
       "sample_rate": 48000
     }
   },
   {
     "profile_name": "subtitles-webvtt",
     "type": "subtitles",
     "subtitle_settings": {
       "format": "webvtt"
     }
   }
 ],
 "ad_tag": "https://pubads.g.doubleclick.net/gampad/ads?...",
 "manifest_type": "hls"
}

ตัวอย่างการตอบกลับ

{
  "valid_for": "8h0m0s",
  "valid_until": "2023-03-24T08:30:26.839717986-07:00",
  "ad_pods": [
    {
      "manifest_urls":{
        "1080p": "https://{...}/pod/0/profile/1080p.m3u8",
        "360p": "https://{...}/pod/0/profile.m3u8",
        "subtitles-webvtt": "https://{...}/pod/0/profile/subtitles-en.vtt"
      },
      "type": "pre",
      "duration": 10.0
    },
    {
      "manifest_urls":{
        "1080p": "https://{...}/pod/1/profile/1080p.m3u8",
        "360p": "https://{...}/pod/1/profile.m3u8",
        "subtitles-webvtt": "https://{...}/pod/1/profile/subtitles-en.vtt"
      },
      "type": "mid",
      "start": 15.0,
      "duration": 15.0,
      "midroll_index": 1
    },
    {
      "manifest_urls":{
        ]"1080p": "https://{...}/pod/2/profile/1080p.m3u8",
        "360p": "https://{...}/pod/2/profile.m3u8",
        "subtitles-webvtt": "https://{...}/pod/0/profile/subtitles-en.vtt""
      },
      "type": "post",
      "duration": 10.0
    }
  ]
}

ต่อพ็อดโฆษณาลงในเนื้อหา

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

สตรีม HLS

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

ทำซ้ำในโปรไฟล์การเข้ารหัส

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

ตัวอย่างอาร์เรย์พ็อดโฆษณา
"ad_pods": [
    {
      "manifest_urls":{
        "1080p": "https://{...}/pod/0/profile/1080p.m3u8",
        "360p": "https://{...}/pod/0/profile/360p.m3u8",
        "subtitles-en": "https://{...}/pod/0/profile/subitles-en.vtt"
      },
      "type": "pre",
      "duration": 10.0
    },
    {
      "manifest_urls":{
        "1080p": "https://{...}/pod/1/profile/1080p.m3u8",
        "360p": "https://{...}/pod/1/profile/360p.m3u8",
        "subtitles-en": "https://{...}/pod/1/profile/subitles-en.vtt"
      },
      "type": "mid",
      "start": 15.0,
      "duration": 15.0,
      "midroll_index": 1
    },
    {
      "manifest_urls":{
        "1080p": "https://{...}/pod/2/profile/1080p.m3u8",
        "360p": "https://{...}/pod/2/profile/360p.m3u8",
        "subtitles-en": "https://{...}/pod/2/profile/subitles-en.vtt"
      },
      "type": "post",
      "duration": 10.0
    }
  ]
ตัวอย่างเพลย์ลิสต์เนื้อหาหลายรูปแบบ
#EXTM3U
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs0",LANGUAGE="en",NAME="English",AUTOSELECT=YES,DEFAULT=YES,URI="https://{...}/subitles-en.vtt"
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080,CODECS="avc1.4d000c,mp4a.40.5"
https://{...}/1080p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=640x360,CODECS="avc1.4d000d,mp4a.40.5"
https://{...}/360p.m3u8
ตัวอย่างข้อมูลของรูปแบบที่รวบรวมไว้
Encoding profile: "1080p"
Profile settings: {...}
Content manifest: https://{...}/1080p.m3u8
Ad pods (start time -> manifest):
    0 -> https://{...}/pod/0/profile/1080p.m3u8
   15 -> https://{...}/pod/1/profile/1080p.m3u8
  600 -> https://{...}/pod/2/profile/1080p.m3u8

แทรกโฆษณาลงในไฟล์ Manifest แต่ละรูปแบบ

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

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

หากไฟล์ Manifest ของเนื้อหามีการเข้ารหัส คุณจะต้องจัดเก็บคีย์การเข้ารหัสล่าสุดที่พบก่อนเริ่มต้นพ็อดโฆษณาปัจจุบันในแท็ก #EXT-X-KEY จากนั้นคุณต้องเพิ่มแท็ก #EXT-X-KEY:METHOD=NONE เพื่อนำการเข้ารหัสออกก่อนส่วนแรกของพ็อดโฆษณาแต่ละรายการ สุดท้าย คุณต้องเพิ่มสําเนาแท็ก #EXT-X-KEY ที่จัดเก็บไว้ก่อนส่วนแรกของเนื้อหาหลังพ็อดโฆษณาแต่ละพ็อด เพื่อกู้คืนการเข้ารหัสเนื้อหา

ตัวอย่างข้อมูลของรูปแบบที่รวบรวมไว้
Encoding profile: "1080p"
Content manifest: https://{...}/1080p.m3u8
Ad pods (start time -> manifest):
    0 -> https://dai.google.com/{...}pod/0/profile/1080p.m3u8
   15 -> https://dai.google.com/{...}pod/1/profile/1080p.m3u8
  600 -> https://dai.google.com/{...}pod/2/profile/1080p.m3u8
ตัวอย่างไฟล์ Manifest ของเนื้อหา

นี่คือเนื้อหาของไฟล์ Manifest https://{...}/1080p.m3u8 ที่ระบุไว้ในข้อมูลรูปแบบที่รวบรวม

#EXTM3U
{...}
#EXTINF:5.000,
https://{...}/1080p/content-segment-0.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-1.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-2.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-3.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-4.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-5.ts
{...}
ตัวอย่างไฟล์ Manifest ของพ็อดโฆษณา

นี่คือเนื้อหาของไฟล์ Manifest https://dai.google.com/{...}/pod/1/profile/1080p.m3u8 ที่แสดงในข้อมูลรูปแบบที่รวบรวมไว้

#EXTM3U
{...}
#EXTINF:5.000,
https://dai.google.com/{...}/0.ts
#EXTINF:5.000,
https://dai.google.com/{...}/1.ts
#EXTINF:5.000,
https://dai.google.com/{...}/2.ts
ตัวอย่างไฟล์ Manifest ของรูปแบบที่ต่อกัน

นี่จะเป็นไฟล์ Manifest ของรูปแบบที่ต่อเข้าด้วยกันที่ได้ ซึ่งส่งไปยัง CDN และโฮสต์ที่ https://cdn.{...}/{userid}/1080p.m3u8

#EXTM3U
{...}
#EXTINF:5.000,
https://{...}/1080p/content-segment-0.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-1.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-2.ts
#EXT-X-DISCONTINUITY
#EXTINF:5.000,
https://dai.google.com/{...}/0.ts
#EXTINF:5.000,
https://dai.google.com/{...}/1.ts
#EXTINF:5.000,
https://dai.google.com/{...}/2.ts
#EXT-X-DISCONTINUITY
#EXTINF:5.000,
https://{...}/1080p/content-segment-3.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-4.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-5.ts
{...}

สร้างเพลย์ลิสต์เวอร์ชันแปรผันหลายตัวแปร

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

ตัวอย่างเพลย์ลิสต์เวอร์ชันแปรผันหลายตัวแปรสุดท้าย
#EXTM3U
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs0",LANGUAGE="en",NAME="English",AUTOSELECT=YES,DEFAULT=YES,URI="https://cdn.{...}-subitles-en.vtt"
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080,CODECS="avc1.4d000c,mp4a.40.5"
https://cdn.{...}/{userid}/1080p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=640x360,CODECS="avc1.4d000d,mp4a.40.5"
https://cdn.{...}/{userid}/360p.m3u8

สตรีม MPEG DASH

หากคุณกำลังต่อสตรีมในรูปแบบ MPEG DASH คุณเพียงต้องสร้างไฟล์เดียว จึงทําให้เชื่อมต่อสตรีม DASH ได้ง่ายกว่า HLS

ไฟล์คำอธิบายงานนำเสนอสื่อ MPEG DASH (MPD) ที่จัดเตรียมอย่างเหมาะสมต้องประกอบด้วยหลายจุด โดยแต่ละไฟล์มีหลายตัวแทน ตัวแทนแต่ละรายการควรตรงกับโปรไฟล์การเข้ารหัสโปรไฟล์ใดโปรไฟล์หนึ่ง พ็อดโฆษณาแต่ละพ็อดที่ส่งกลับมาจาก Ad Manager ยังเป็นไฟล์ MPD ที่มีชุดช่วงเวลาซึ่งมีการแสดงการจับคู่ที่ตรงกันด้วย

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

ไฟล์ MPD ที่ต่อเข้าด้วยกันในขั้นตอนสุดท้ายต้องเป็นไปตามข้อกำหนด MPEG_DASH ทั้งหมด ดังนั้นคุณอาจต้องทำซ้ำไฟล์สุดท้ายอีกครั้งเพื่อแก้ไขเวลาเริ่มต้น แก้ไขระยะเวลาการนำเสนอสื่อเพื่อพิจารณาระยะเวลาโฆษณาที่แทรกใหม่ และแก้ไขข้อขัดแย้งอื่นๆ ที่อาจเกิดขึ้นจากขั้นตอนการต่อภาพ

ตัวอย่าง MPD ของเนื้อหา

<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" minBufferTime="PT1.500000S" type="static" mediaPresentationDuration="PT0H10M00.000S" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011">
  <ProgramInformation moreInformationURL="http://.../info">
    <Title>Example Stream</Title>
  </ProgramInformation>
  <Period duration="PT0H0M15.000S" id="content-period-1">
    ...
  </Period>
  <Period duration="PT0H0M15.000S" id="content-period-2">
    ...
  </Period>
  <Period duration="PT0H0M15.000S" id="content-period-3">
    ...
  </Period>
  ...
</MPD>

ตัวอย่าง JSON ของพ็อดโฆษณา

[{
  "mpd_uri": "https://{...}pod/1.mpd",
  "type": "mid",
  "start": 15.0,
  "duration": 15.0,
  "midroll_index": 1
}]

ตัวอย่าง MPD ของพ็อดโฆษณา

นี่คือเนื้อหาของ mpd_uri จาก JSON ของพ็อดโฆษณาด้านบน

<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" minBufferTime="PT1.500000S" type="static" mediaPresentationDuration="PT0H0M15.000S" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011">
  <ProgramInformation moreInformationURL="http://.../info">
    <Title>Ad Pod 1</Title>
  </ProgramInformation>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-1">
    ...
  </Period>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-2">
    ...
  </Period>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-3">
    ...
  </Period>
  ...
</MPD>

ตัวอย่าง MPD ที่ต่อกัน

ใช้เป็นการตอบกลับคำขอไฟล์ Manifest ของสตรีมเริ่มต้น

<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" minBufferTime="PT1.500000S" type="static" mediaPresentationDuration="PT0H10M15.000S" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011">
  <ProgramInformation moreInformationURL="http://.../info">
    <Title>Example Stream</Title>
  </ProgramInformation>
  <Period duration="PT0H0M15.000S" id="content-period-1">
    ...
  </Period>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-1">
    ...
  </Period>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-2">
    ...
  </Period>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-3">
    ...
  </Period>
  <Period duration="PT0H0M15.000S" id="content-period-2">
    ...
  </Period>
  <Period duration="PT0H0M15.000S" id="content-period-3">
    ...
  </Period>
  ...
</MPD>

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