คู่มือนี้ครอบคลุมการพัฒนาแอปพลิเคชันไคลเอ็นต์เพื่อโหลดไลฟ์สด HLS หรือ DASH ด้วย Pod Serving API และตัวจัดการไฟล์ Manifest
ข้อกำหนดเบื้องต้น
คุณต้องมีสิ่งต่อไปนี้ก่อนดำเนินการต่อ
คีย์เนื้อหาที่กำหนดเองสำหรับกิจกรรมไลฟ์สดที่กำหนดค่าด้วย
Pod serving redirectประเภท DAI หากต้องการรับคีย์นี้ ให้ทำดังนี้ใช้ไลบรารีของไคลเอ็นต์ SOAP API เพื่อเรียกใช้เมธอด
LiveStreamEventService.createLiveStreamEventsด้วยออบเจ็กต์LiveStreamEventและตั้งค่าพร็อพเพอร์ตี้dynamicAdInsertionTypeเป็นค่า enumPOD_SERVING_REDIRECTสำหรับไลบรารีของไคลเอ็นต์ทั้งหมด โปรดดูไลบรารีของไคลเอ็นต์และโค้ด ตัวอย่าง
ตรวจสอบว่าแพลตฟอร์มของคุณมี Interactive Media Ads (IMA) SDK หรือไม่ เราขอแนะนำให้ใช้ IMA SDK เพื่อเพิ่มรายได้ โปรดดูรายละเอียดที่หัวข้อตั้งค่า IMA SDK สำหรับ DAI
ส่งคำขอสตรีม
เมื่อผู้ใช้เลือกสตรีม ให้ทำดังนี้
ส่งคำขอ
POSTไปยังเมธอดบริการไลฟ์สด ดูรายละเอียดได้ที่ Method: streamส่งพารามิเตอร์การกำหนดเป้าหมายโฆษณาในรูปแบบ
application/x-www-form-urlencodedหรือapplication/jsonคำขอนี้จะลงทะเบียนเซสชันสตรีมกับ Google DAIตัวอย่างต่อไปนี้จะส่งคำขอสตรีม
การเข้ารหัสแบบฟอร์ม
const url = `https://dai.google.com/ssai/pods/api/v1/` + `network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/stream`; const params = new URLSearchParams({ cust_params: 'section=sports&page=golf,tennis' }).toString(); const response = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: params }); console.log(await response.json());การเข้ารหัส JSON
const url = `https://dai.google.com/ssai/pods/api/v1/` + `network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/stream`; const response = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ cust_params: { section: 'sports', page: 'golf,tennis' } }) }); console.log(await response.json());หากสำเร็จ คุณจะเห็นเอาต์พุตคล้ายกับตัวอย่างต่อไปนี้
{ "stream_id": "c4a5dad5-aaa8-4550-8acb-7cda3cdb21bb:DLS", "media_verification_url": "https://dai.google.com/view/.../event/c14aZDWtQg-ZwQaEGl6bYA/media/", "metadata_url": "https://dai.google.com/linear/pods/hls/.../metadata", "session_update_url": "https://dai.google.com/linear/.../session", "polling_frequency": 10 }ในคำตอบ JSON ให้ค้นหารหัสเซสชันสตรีมและจัดเก็บข้อมูลอื่นๆ สำหรับ ขั้นตอนถัดไป
ข้อมูลเมตาของโฆษณาแบบสำรวจ
หากต้องการสำรวจข้อมูลเมตาของโฆษณา ให้ทำดังนี้
อ่านค่า
metadata_urlจากการตอบกลับการลงทะเบียนสตรีมส่งคำขอ
GETเริ่มต้นไปยังปลายทางmetadata_url- ละเว้นพารามิเตอร์การค้นหา
delta_tokenกระบวนการนี้ช่วยให้เซิร์ฟเวอร์ แสดงข้อมูลเมตาแบบเต็มสำหรับหน้าต่างเครื่องบันทึกวิดีโอดิจิทัล (DVR) ของสตรีม ช่วงที่บันทึกด้วย DVR จะมีกรอบเวลาของการออกอากาศที่พร้อมให้ผู้ชม กรอและเล่น การตอบกลับมีฟิลด์next_delta_token
- ละเว้นพารามิเตอร์การค้นหา
จัดเก็บค่า
next_delta_tokenจากการตอบกลับล่าสุดเพื่อเพิ่มประสิทธิภาพแบนด์วิดท์ในคำขอถัดไป ให้ส่งค่านั้นเป็นพารามิเตอร์การค้นหา
delta_tokenเซิร์ฟเวอร์จะแสดงเฉพาะข้อมูลเมตาที่มีการเปลี่ยนแปลงตั้งแต่มีการสร้างโทเค็นนั้น ส่งโทเค็นล่าสุดที่คุณได้รับเสมอ อย่าพยายามแยกวิเคราะห์ แก้ไข หรือสร้าง โทเค็น ดูรายละเอียดได้ที่ วิธี: ข้อมูลเมตาตัวอย่างต่อไปนี้จะดึงข้อมูลเมตาของโฆษณา
// Initial request (returns full metadata and next_delta_token) let response = await fetch(metadata_url); let metadata = await response.json(); let deltaToken = metadata.next_delta_token; // Subsequent request (returns only changes since deltaToken) if (deltaToken) { const url = new URL(metadata_url); url.searchParams.append('delta_token', deltaToken); response = await fetch(url.toString()); const deltaMetadata = await response.json(); // Merge deltaMetadata into your local cache mergeMetadata(metadata, deltaMetadata); deltaToken = deltaMetadata.next_delta_token; }หากสำเร็จ คุณจะได้รับการตอบกลับ PodMetadata หากคุณระบุพารามิเตอร์
delta_tokenการตอบกลับจะมีเฉพาะโฆษณา ช่วงพักโฆษณา และแท็กที่เซิร์ฟเวอร์เพิ่มหรืออัปเดตตั้งแต่เซิร์ฟเวอร์สร้างโทเค็น การตอบกลับยังมีค่าnext_delta_tokenใหม่ด้วย หากช่วงพักโฆษณาล้าสมัย การตอบสนองจะมีobsolete_ad_break_idsรายการช่วงพักโฆษณาที่ต้องนำออกจากแคชด้วย{ "next_delta_token": "eyJyYW5nZXMiOlt7InMiOjEsImUiOjN9XX0", "obsolete_ad_break_ids": ["0003069407"], "tags":{ "google_1022389921":{ "ad":"0003069408_ad1", "ad_break_id":"0003069408", "type":"start" }, ... }, "ads":{ "0003069408_ad1":{ "ad_break_id":"0003069408", "position":1, "duration":10.01, "title":"External - Pod Midroll 1", "clickthrough_url":"https://.../", ... }, ... }, "ad_breaks":{ "0003069408":{ "type":"mid", "duration":30, "ads":3 }, ... } }บันทึกออบเจ็กต์
tagsและผสานรวมการอัปเดตลงในแคชในเครื่อง หากมีพารามิเตอร์obsolete_ad_break_idsให้นำช่วงพักโฆษณาและ โฆษณาและแท็กที่เกี่ยวข้องออกจากแคชตั้งตัวจับเวลาโดยใช้ค่า
polling_frequencyเพื่อขอข้อมูลเมตาเป็นประจำ ในการสำรวจแต่ละครั้ง ให้ส่งค่าnext_delta_tokenที่แสดงใน การตอบกลับข้อมูลเมตาล่าสุดเป็นพารามิเตอร์การค้นหาdelta_token
โหลดสตรีมลงในวิดีโอเพลเยอร์
หลังจากได้รหัสเซสชันจากการตอบกลับการลงทะเบียนแล้ว ให้ส่งรหัสไปยัง เครื่องมือจัดการไฟล์ Manifest หรือสร้าง URL ของไฟล์ Manifest เพื่อโหลดสตรีมลงใน วิดีโอเพลเยอร์
หากต้องการส่งรหัสเซสชัน โปรดดูเอกสารประกอบของเครื่องมือจัดการ Manifest หากคุณ พัฒนาเครื่องมือจัดการไฟล์ Manifest โปรดดูเครื่องมือจัดการไฟล์ Manifest สำหรับ ไลฟ์สด
ตัวอย่างต่อไปนี้จะประกอบ URL ของไฟล์ Manifest
https://<your_manifest_manipulator_url>/manifest.m3u8?DAI_stream_ID=SESSION_ID&network_code=NETWORK_CODE&DAI_custom_asset_key=CUSTOM_ASSET_KEY"
เมื่อเครื่องเล่นพร้อมแล้ว ให้เริ่มเล่น
รอเหตุการณ์โฆษณา
ตรวจสอบรูปแบบคอนเทนเนอร์ของไลฟ์สดสำหรับข้อมูลเมตาที่กำหนดเวลาไว้
สตรีม HLS ที่มีคอนเทนเนอร์ Transport Stream (TS) จะใช้แท็ก ID3 ที่กำหนดเวลาเพื่อ ส่งข้อมูลเมตาที่กำหนดเวลา ดูรายละเอียดได้ที่เกี่ยวกับรูปแบบแอปพลิเคชันสื่อทั่วไปที่มี HTTP Live Streaming (HLS)
สตรีม DASH ใช้องค์ประกอบ
EventStreamเพื่อระบุเหตุการณ์ในไฟล์ Manifestสตรีม DASH ใช้องค์ประกอบ
InbandEventStreamเมื่อกลุ่มมีกล่องข้อความเหตุการณ์ (emsg) สำหรับข้อมูลเพย์โหลด รวมถึงแท็ก ID3 ดูรายละเอียดได้ที่ InbandEventStreamสตรีม CMAF รวมถึง DASH และ HLS ใช้
emsgที่มีแท็ก ID3
หากต้องการดึงแท็ก ID3 จากสตรีม โปรดดูคำแนะนำของวิดีโอเพลเยอร์ ดูรายละเอียดได้ที่คู่มือการจัดการข้อมูลเมตาที่กำหนดเวลา
หากต้องการดึงรหัสเหตุการณ์โฆษณาจากแท็ก ID3 ให้ทำดังนี้
- กรองเหตุการณ์ตาม
scheme_id_uriด้วยurn:google:dai:2018หรือhttps://aomedia.org/emsg/ID3 ดึงข้อมูลอาร์เรย์ไบต์จากฟิลด์
message_dataตัวอย่างต่อไปนี้จะถอดรหัสข้อมูล
emsgเป็น JSON{ "scheme_id_uri": "https://developer.apple.com/streaming/emsg-id3", "presentation_time": 27554, "timescale": 1000, "message_data": "ID3TXXXgoogle_1022389921", ... }กรองแท็ก ID3 ด้วยรูปแบบ
TXXXgoogle_{ad_event_ID}TXXXgoogle_1022389921
แสดงข้อมูลเหตุการณ์โฆษณา
หากต้องการค้นหาออบเจ็กต์
TagSegment
ให้ทำดังนี้
ดึงออบเจ็กต์ข้อมูลเมตาของโฆษณา
tagsจาก Poll ad metadata ออบเจ็กต์tagsคืออาร์เรย์ของออบเจ็กต์TagSegmentใช้รหัสเหตุการณ์โฆษณาแบบเต็มเพื่อค้นหาออบเจ็กต์
TagSegmentที่มีประเภทprogressใช้ 17 อักขระแรกของรหัสเหตุการณ์โฆษณาเพื่อค้นหาออบเจ็กต์
TagSegmentประเภทอื่นๆเนื่องจากแอปไคลเอ็นต์จะสำรวจข้อมูลเมตาของโฆษณาเป็นระยะๆ จึงอาจเกิดความล่าช้าระหว่างเวลาที่วิดีโอเพลเยอร์พบแท็ก ID3 ในสตรีมกับเวลาที่ข้อมูลเมตาที่เกี่ยวข้องพร้อมใช้งาน หากแอปไคลเอ็นต์ไม่พบแท็ก ID3 ในแท็กที่จัดเก็บ ให้เก็บแท็กไว้ในคิวและประมวลผลแท็กอีกครั้งหลังจาก การสำรวจข้อมูลเมตาครั้งถัดไป เก็บแท็กไว้ในคิวจนกว่าการประมวลผลจะเสร็จสิ้น
หลังจากได้
TagSegmentแล้ว ให้ใช้พร็อพเพอร์ตี้ad_break_idเป็นคีย์ เพื่อค้นหาออบเจ็กต์AdBreakในออบเจ็กต์ข้อมูลเมตาของโฆษณาad_breaksตัวอย่างต่อไปนี้จะค้นหาออบเจ็กต์
AdBreak{ "type":"mid", "duration":15, "ads":1 }ใช้ข้อมูล
TagSegmentและAdBreakเพื่อแสดงข้อมูลเกี่ยวกับตำแหน่งโฆษณา ในช่วงพักโฆษณา เช่นAd 1 of 3
ส่งการ Ping เพื่อยืนยันสื่อ
สําหรับเหตุการณ์โฆษณาทุกรายการ ยกเว้นprogressประเภท ให้ส่งการปิงการยืนยันสื่อ
DAI ของ Google จะทิ้งเหตุการณ์ progress และการส่งเหตุการณ์เหล่านี้บ่อยๆ อาจส่งผลต่อประสิทธิภาพของแอป
หากต้องการสร้าง URL การยืนยันสื่อที่สมบูรณ์ของเหตุการณ์โฆษณา ให้ทำดังนี้
จากคำตอบของสตรีม ให้ต่อท้ายรหัสเหตุการณ์โฆษณาแบบเต็มกับค่า
media_verification_urlส่ง
GETคำขอพร้อม URL แบบเต็ม// media_verification_url: "https://dai.google.com/view/.../event/c14aZDWtQg-ZwQaEGl6bYA/media/" const completeUrl = `${media_verification_url}google_1022389921`; const response = await fetch(completeUrl);หากสำเร็จ คุณจะได้รับการตอบกลับสถานะรหัส
202ไม่เช่นนั้น คุณจะได้รับ404รหัสข้อผิดพลาด
คุณใช้เครื่องมือตรวจสอบกิจกรรมการสตรีม (SAM) เพื่อตรวจสอบบันทึกประวัติของเหตุการณ์โฆษณาทั้งหมดได้ โปรดดูรายละเอียดที่หัวข้อตรวจสอบและแก้ปัญหาไลฟ์สด