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

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

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

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

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

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

ตัวอย่างปลายทางคำขอไฟล์ 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 ไปยังปลายทาง Ad Pod โดยส่งโปรไฟล์การเข้ารหัสและแท็กโฆษณาที่ขอ คำขอนี้ยังรวมรหัสสตรีมที่รวบรวมไว้ในขั้นตอนที่ 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 ของ MPD ของ DASH
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 ที่รวมแล้วครั้งสุดท้ายเพื่อแก้ไขหมายเลขลำดับสื่อ ระยะเวลาของเนื้อหา หมายเลขลำดับการหยุดกลางคัน และแtags อื่นๆ ที่ต้องอัปเดตเพื่อพิจารณากลุ่มโฆษณาใหม่ ทั้งนี้ขึ้นอยู่กับฟีเจอร์ของข้อกําหนดที่ไฟล์ 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 ของเนื้อหา

นี่คือเนื้อหาของไฟล์ https://{...}/1080p.m3u8 Manifest ที่แสดงในข้อมูลผลิตภัณฑ์ย่อยที่รวบรวม

#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 ของพ็อดโฆษณา

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

#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>

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