เพิ่มการรองรับ API ของช่วงพักโฆษณาไปยังตัวรับเว็บ

1. ภาพรวม

โลโก้ Google Cast

Codelab นี้จะสอนวิธีสร้างแอปตัวรับสัญญาณเว็บที่กําหนดเองซึ่งใช้ Cast Ad Breaks API

Google Cast คืออะไร

Google Cast ช่วยให้ผู้ใช้แคสต์เนื้อหาจากอุปกรณ์เคลื่อนที่ไปยัง TV ได้ จากนั้นผู้ใช้จะใช้อุปกรณ์เคลื่อนที่เป็นรีโมตคอนโทรลในการเล่นสื่อบนทีวีได้

Google Cast SDK ช่วยให้คุณขยายแอปเพื่อควบคุมทีวีหรือระบบเสียงได้ Cast SDK ช่วยให้คุณเพิ่มคอมโพเนนต์ UI ที่จําเป็นได้ตามรายการตรวจสอบการออกแบบ Google Cast

รายการตรวจสอบการออกแบบ Google Cast มีไว้ให้ผู้ใช้ของ Cast ใช้งานได้ง่ายและคาดการณ์ได้ในทุกแพลตฟอร์มที่รองรับ

สิ่งที่เรากําลังจะสร้าง

หลังจากที่คุณสร้าง Codelab นี้เสร็จแล้ว คุณจะสร้าง Cast Receiver ที่ใช้ประโยชน์จาก Break API ใหม่ได้

สิ่งที่คุณจะได้เรียนรู้

  • วิธีใส่ช่วงพักของ VMAP และ VAST ในเนื้อหาสําหรับ Cast
  • วิธีข้ามคลิปช่วงพักโฆษณา
  • วิธีปรับแต่งลักษณะการทํางานของช่วงพักโฆษณาเริ่มต้นเมื่อทําการค้นหา

สิ่งที่ต้องมี

  • เบราว์เซอร์ Google Chrome เวอร์ชันล่าสุด
  • บริการโฮสติ้ง HTTPS เช่น โฮสติ้งของ Firebase หรือ ngrok
  • อุปกรณ์ Google Cast เช่น Chromecast หรือ Android TV ที่กําหนดค่าด้วยการเข้าถึงอินเทอร์เน็ต
  • ทีวีหรือจอภาพที่มีอินพุต HDMI หรือ Google Home Hub

ประสบการณ์การใช้งาน

  • คุณจะต้องมีความรู้เกี่ยวกับการพัฒนาเว็บมาก่อน
  • ประสบการณ์ที่ผ่านมาในการสร้างแอปพลิเคชันผู้ส่งและผู้รับการแคสต์

คุณจะใช้บทแนะนํานี้อย่างไร

อ่านอย่างเดียว อ่านแบบฝึกหัดจนจบ

คุณจะให้คะแนนประสบการณ์ในการสร้างเว็บแอปอย่างไร

ผู้ฝึกหัด ขั้นกลาง ผู้ชํานาญ

2. รับโค้ดตัวอย่าง

คุณสามารถดาวน์โหลดตัวอย่างโค้ดทั้งหมดลงในคอมพิวเตอร์ของคุณได้...

และคลายไฟล์ ZIP ที่ดาวน์โหลด

3. การทําให้ผู้รับใช้งานได้ภายในเครื่อง

หากต้องการใช้อุปกรณ์รับสัญญาณบนเว็บกับอุปกรณ์ Cast คุณต้องโฮสต์อุปกรณ์ดังกล่าวไว้ในตําแหน่งที่อุปกรณ์ Cast เข้าถึงได้ ถ้ามีเซิร์ฟเวอร์ที่รองรับ https อยู่แล้ว ให้ข้ามวิธีการต่อไปนี้และจดบันทึก URL ไว้ เนื่องจากต้องใช้ในหัวข้อถัดไป

หากไม่มีเซิร์ฟเวอร์พร้อมให้ใช้งาน คุณก็ใช้ Firebase Hosting หรือ ngrok ได้

เรียกใช้เซิร์ฟเวอร์

เมื่อคุณตั้งค่าบริการที่คุณเลือกแล้ว ให้ไปที่ app-start และเริ่มเซิร์ฟเวอร์ของคุณ

โปรดจด URL สําหรับผู้รับที่โฮสต์ของคุณ ซึ่งจะนําไปใช้ในส่วนถัดไป

4. ลงทะเบียนแอปพลิเคชันในคอนโซลนักพัฒนาซอฟต์แวร์ Cast

คุณต้องลงทะเบียนแอปพลิเคชันของคุณเพื่อให้สามารถเรียกใช้ตัวรับสัญญาณที่กําหนดเอง ดังเช่นใน Codelab นี้บนอุปกรณ์ Chromecast หลังจากที่คุณลงทะเบียนแอปพลิเคชัน คุณจะได้รับรหัสแอปพลิเคชันที่แอปพลิเคชันผู้ส่งของคุณต้องใช้ในการเรียก API เช่น ในการเรียกใช้แอปพลิเคชันตัวรับ

รูปภาพแผงควบคุมสําหรับนักพัฒนาซอฟต์แวร์ Google Cast SDK ที่ไฮไลต์ปุ่ม "เพิ่มแอปพลิเคชันใหม่"

คลิก "เพิ่มแอปพลิเคชันใหม่"

รูปภาพของหน้าจอ "แอปพลิเคชันตัวรับใหม่" ที่ไฮไลต์ตัวเลือก "ตัวรับสัญญาณที่กําหนดเอง"

เลือก "ตัวรับสัญญาณที่กําหนดเอง" ซึ่งเป็นสิ่งที่เรากําลังสร้าง

รูปภาพของหน้าจอ "New Receiver ใหม่ที่กําหนดเอง" ที่แสดง URL ที่มีคนกําลังพิมพ์ในช่อง "URL แอปพลิเคชันตัวรับ"

ป้อนรายละเอียดของผู้รับใหม่ อย่าลืมใช้ URL ที่คุณลงท้ายด้วย

ในส่วนสุดท้าย จดรหัสแอปพลิเคชันที่กําหนดให้กับผู้รับรายใหม่

นอกจากนี้ คุณต้องลงทะเบียนอุปกรณ์ Google Cast เพื่อให้เข้าถึงอุปกรณ์ของผู้รับก่อนเผยแพร่ เมื่อคุณเผยแพร่แอปพลิเคชันตัวรับสัญญาณแล้ว แอปพลิเคชันนั้นจะใช้งานได้กับอุปกรณ์ Google Cast ทั้งหมด สําหรับวัตถุประสงค์ของ Codelab นี้ ขอแนะนําให้คุณทํางานกับแอปพลิเคชันรีซีฟเวอร์ที่ไม่ได้เผยแพร่

รูปภาพแผงควบคุมสําหรับนักพัฒนาซอฟต์แวร์ Google Cast SDK ที่ไฮไลต์ปุ่ม "เพิ่มอุปกรณ์ใหม่"

คลิก "เพิ่มอุปกรณ์ใหม่"

รูปภาพข้อความ 'Add Cast Receiver Device'

ป้อนหมายเลขซีเรียลที่พิมพ์ไว้ด้านหลังอุปกรณ์ Cast และตั้งชื่อที่สื่อความหมาย นอกจากนี้ คุณยังค้นหาหมายเลขซีเรียลได้โดยแคสต์หน้าจอใน Chrome เมื่อเข้าถึง Google Cast SDK Developer Console

ผู้รับและอุปกรณ์อาจใช้เวลา 5-15 นาทีเพื่อเตรียมพร้อมสําหรับการทดสอบ หลังจากรอ 5-15 นาที คุณต้องรีบูตอุปกรณ์ Cast

5. เตรียมโครงการเริ่มต้น

ก่อนที่จะเริ่มต้น Codelab การอ่านคู่มือนักพัฒนาซอฟต์แวร์ซึ่งให้ภาพรวมของฟังก์ชันการทํางานของโฆษณาใหม่อาจเป็นประโยชน์

เราจําเป็นต้องเพิ่มการสนับสนุนสําหรับ Google Cast ไปยังแอปพลิเคชันเริ่มต้นที่คุณดาวน์โหลด ต่อไปนี้คือคําศัพท์ของ Google Cast ที่เราจะใช้ใน Codelab นี้

  • แอปผู้ส่งทํางานในอุปกรณ์เคลื่อนที่หรือแล็ปท็อป
  • แอปตัวรับจะทํางานบนอุปกรณ์ Google Cast

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

  1. เลือกไดเรกทอรี ไอคอนโฟลเดอร์app-start จากตัวอย่างการดาวน์โหลดโค้ด
  2. เปิด js/receiver.js และ index.html

โปรดทราบว่าในขณะที่ทํา Codelab นี้ http-server ควรจะเลือกการเปลี่ยนแปลงที่คุณทํามา หากไม่พบ แสดงว่าพยายามฆ่าและรีสตาร์ท http-server แทน

สําหรับผู้ส่ง เราจะใช้การแก้ไขข้อบกพร่องของเครื่องรับ CAF เช่นกันเพื่อเริ่มเซสชันการแคสต์ รีซีฟเวอร์ออกแบบมาเพื่อเริ่มเล่นสตรีมโดยอัตโนมัติ

การออกแบบแอป

แอปฝั่งผู้รับจะเริ่มเซสชันการแคสต์และจะสแตนด์บายจนกว่าคําขอโหลด (เช่น คําสั่งในการเล่นสื่อ) จากผู้ส่งจะมาถึง

แอปประกอบด้วยมุมมองหลัก 1 มุมมองที่กําหนดไว้ใน index.html และไฟล์ JavaScript 1 ไฟล์ชื่อ js/receiver.js ซึ่งมีตรรกะทั้งหมดเพื่อให้ตัวรับสัญญาณทํางานได้

index.html

ไฟล์ html นี้จะมี UI ทั้งหมดสําหรับแอปรับของเรา ในขณะนี้ค่าเหล่านี้ว่างเปล่า

Receiver.js

การจัดการสคริปต์นี้จะจัดการตรรกะทั้งหมดสําหรับแอปรีซีฟเวอร์ของเรา ขณะนี้มีตัวรับ CAF พื้นฐาน

6. เพิ่ม VMAP ลงในเนื้อหา

ในการเริ่มต้น ให้เปิดผู้ส่งเว็บใน Chrome ป้อนรหัสแอปพลิเคชันของผู้รับที่คุณได้รับในแผงควบคุมสําหรับนักพัฒนาซอฟต์แวร์ Cast SDK แล้วคลิก "ตั้งค่า"

ในรีซีฟเวอร์ เราจําเป็นต้องเพิ่มตรรกะบางอย่างเพื่อรวมโฆษณาไว้ในเนื้อหา

คัดลอกบรรทัดต่อไปนี้ลงในไฟล์ js/receiver.js ซึ่งประกอบด้วยตัวอย่างแท็ก VMAP จาก DoubleClick พร้อมด้วยการสุ่ม

const vmapUrl = "https://pubads.g.doubleclick.net/gampad/ads?sz=640x480&iu=/124319096/external/ad_rule_samples&ciu_szs=300x250&ad_rule=1&impl=s&gdfp_req=1&env=vp&output=vmap&unviewed_position_start=1&cust_params=deployment%3Ddevsite%26sample_ar%3Dpremidpost&cmsid=496&vid=short_onecue&correlator=" + Math.floor(Math.random() * Math.pow(10, 10));

ใน js/receiver.js file ให้ค้นหาฟังก์ชัน playerManager.setMessageInterceptor และเพิ่มค่าต่อไปนี้ก่อนบรรทัด return request; สุดท้ายในฟังก์ชัน

request.media.vmapAdsRequest = {
    adTagUrl: vmapUrl,
};

หมายเหตุ: ออบเจ็กต์ที่กําหนดให้กับ vmapAdsRequest ข้างต้นเป็นออบเจ็กต์ VastAdsRequest เวอร์ชันย่อ

บันทึกการเปลี่ยนแปลงของคุณไปยัง js/receiver.js และเริ่มต้นเซสชันการแคสต์บนผู้ส่งเว็บด้วยการคลิกขวาที่ใดก็ได้บนหน้าเว็บแล้วเลือก "แคสต์" สตรีมโฆษณาควรเริ่มเล่นทันที

7. เพิ่ม VAST ลงในเนื้อหาของคุณ

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

คัดลอกข้อมูลต่อไปนี้ลงในไฟล์ js/receiver.js ซึ่งประกอบด้วยคลิป VAST break 6 คลิปจาก DoubleClick และคลิปแบบสุ่ม คลิปช่วงพักโฆษณาเหล่านี้จะกําหนดให้กับช่วงพัก 5 รายการ และระบุตําแหน่งของช่วงพักแต่ละช่วงด้วย

const addVASTBreaksToMedia = (mediaInformation) => {
    mediaInformation.breakClips = [
        {
            id: "bc1",
            title: "bc1 (Pre-roll)",
            vastAdsRequest: {
                adTagUrl: 'https://pubads.g.doubleclick.net/gampad/ads?slotname=/124319096/external/ad_rule_samples&sz=640x480&ciu_szs=300x250&cust_params=deployment%3Ddevsite%26sample_ar%3Dpremidpost&url=&unviewed_position_start=1&output=xml_vast3&impl=s&env=vp&gdfp_req=1&ad_rule=0&vad_type=linear&vpos=preroll&pod=1&ppos=1&lip=true&min_ad_duration=0&max_ad_duration=30000&vrid=6256&correlator=' + Math.floor(Math.random() * Math.pow(10, 10)) + '&video_doc_id=short_onecue&cmsid=496&kfa=0&tfcd=0'
            }
        },
        {
            id: "bc2",
            title: "bc2 (Mid-roll)",
            vastAdsRequest: {
                adTagUrl: 'https://pubads.g.doubleclick.net/gampad/ads?slotname=/124319096/external/ad_rule_samples&sz=640x480&ciu_szs=300x250&cust_params=deployment%3Ddevsite%26sample_ar%3Dpremidpost&url=&unviewed_position_start=1&output=xml_vast3&impl=s&env=vp&gdfp_req=1&ad_rule=0&cue=15000&vad_type=linear&vpos=midroll&pod=2&mridx=1&rmridx=1&ppos=1&lip=true&min_ad_duration=0&max_ad_duration=30000&vrid=6256&correlator=' + Math.floor(Math.random() * Math.pow(10, 10)) + '&video_doc_id=short_onecue&cmsid=496&kfa=0&tfcd=0'
            }
        },
        {
            id: "bc3",
            title: "bc3 (Mid-roll)",
            vastAdsRequest: {
                adTagUrl: 'https://pubads.g.doubleclick.net/gampad/ads?slotname=/124319096/external/ad_rule_samples&sz=640x480&ciu_szs=300x250&cust_params=deployment%3Ddevsite%26sample_ar%3Dpremidpost&url=&unviewed_position_start=1&output=xml_vast3&impl=s&env=vp&gdfp_req=1&ad_rule=0&cue=15000&vad_type=linear&vpos=midroll&pod=2&mridx=1&rmridx=1&ppos=1&lip=true&min_ad_duration=0&max_ad_duration=30000&vrid=6256&correlator=' + Math.floor(Math.random() * Math.pow(10, 10)) + '&video_doc_id=short_onecue&cmsid=496&kfa=0&tfcd=0'
            }
        },
        {
            id: "bc4",
            title: "bc4 (Mid-roll)",
            vastAdsRequest: {
                adTagUrl: 'https://pubads.g.doubleclick.net/gampad/ads?slotname=/124319096/external/ad_rule_samples&sz=640x480&ciu_szs=300x250&cust_params=deployment%3Ddevsite%26sample_ar%3Dpremidpost&url=&unviewed_position_start=1&output=xml_vast3&impl=s&env=vp&gdfp_req=1&ad_rule=0&cue=15000&vad_type=linear&vpos=midroll&pod=2&mridx=1&rmridx=1&ppos=1&lip=true&min_ad_duration=0&max_ad_duration=30000&vrid=6256&correlator=' + Math.floor(Math.random() * Math.pow(10, 10)) + '&video_doc_id=short_onecue&cmsid=496&kfa=0&tfcd=0'
            }
        },
        {
            id: "bc5",
            title: "bc5 (Mid-roll)",
            vastAdsRequest: {
                adTagUrl: 'https://pubads.g.doubleclick.net/gampad/ads?slotname=/124319096/external/ad_rule_samples&sz=640x480&ciu_szs=300x250&cust_params=deployment%3Ddevsite%26sample_ar%3Dpremidpost&url=&unviewed_position_start=1&output=xml_vast3&impl=s&env=vp&gdfp_req=1&ad_rule=0&cue=15000&vad_type=linear&vpos=midroll&pod=2&mridx=1&rmridx=1&ppos=1&lip=true&min_ad_duration=0&max_ad_duration=30000&vrid=6256&correlator=' + Math.floor(Math.random() * Math.pow(10, 10)) + '&video_doc_id=short_onecue&cmsid=496&kfa=0&tfcd=0'
            }
        },
        {
            id: "bc6",
            title: "bc6 (Post-roll)",
            vastAdsRequest: {
                adTagUrl: 'https://pubads.g.doubleclick.net/gampad/ads?slotname=/124319096/external/ad_rule_samples&sz=640x480&ciu_szs=300x250&cust_params=deployment%3Ddevsite%26sample_ar%3Dpremidpost&url=&unviewed_position_start=1&output=xml_vast3&impl=s&env=vp&gdfp_req=1&ad_rule=0&vad_type=linear&vpos=postroll&pod=3&ppos=1&lip=true&min_ad_duration=0&max_ad_duration=30000&vrid=6256&correlator=' + Math.floor(Math.random() * Math.pow(10, 10)) + '&video_doc_id=short_onecue&cmsid=496&kfa=0&tfcd=0'
            }
        }
    ];
    mediaInformation.breaks = [
        {
            id: "b1",
            breakClipIds: ["bc1"],
            position: 0
        },
        {
            id: "b2",
            breakClipIds: ["bc2"],
            position: 15
        },
        {
            id: "b3",
            breakClipIds: ["bc3","bc4"],
            position: 60
        },
        {
            id: "b4",
            breakClipIds: ["bc5"],
            position: 100
        },
        {
            id: "b5",
            breakClipIds: ["bc6"],
            position: -1
        }
    ];
};

หมายเหตุ: พร็อพเพอร์ตี้ breakClipIds ของช่วงพักคืออาร์เรย์ ซึ่งหมายความว่าคลิปแยกหลายๆ คลิปสามารถกําหนดให้กับแต่ละช่วงพักได้

ใน js/receiver.js file ให้ค้นหาจุดตัดข้อความ LOAD กล่าวคือบรรทัดที่ขึ้นต้นด้วย playerManager.setMessageInterceptor และเพิ่มบรรทัดต่อไปนี้ก่อนบรรทัด return request; สุดท้ายในฟังก์ชัน

addVASTBreaksToMedia(request.media);

บันทึกการเปลี่ยนแปลงของคุณไปยัง js/receiver.js และเริ่มต้นเซสชันการแคสต์บนผู้ส่งเว็บด้วยการคลิกขวาที่ใดก็ได้บนหน้าเว็บแล้วเลือก "แคสต์" สตรีมโฆษณาควรเริ่มเล่นทันที

8. ข้ามช่วงพักโฆษณา

CAF มีคลาสใหม่ที่ชื่อว่า BreakManager ซึ่งจะช่วยคุณในการนํากฎทางธุรกิจที่กําหนดเองไปใช้สําหรับลักษณะการทํางานของโฆษณา สมมติว่าคุณต้องการให้ระยะเวลาผ่อนผันเพื่อข้ามโฆษณาหลังจากผ่านไปสักระยะหนึ่ง

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

ค้นหา playerManager.setMessageInterceptor และเพิ่มบรรทัดต่อไปนี้ก่อนถึง return request

request.currentTime = 10;

บันทึกไฟล์ receiver.js และเริ่มเซสชันการแคสต์ คุณจะเห็นเนื้อหาโหลดใน 10 วินาที แล้วเล่นโฆษณาในอีก 5 วินาทีต่อมา

ตอนนี้เรามาเพิ่มกฎเพื่อข้ามโฆษณาตอนกลางที่จุด 15 วินาทีกัน

คุณจะต้องมีอินสแตนซ์ของ BreakManager เพื่อตั้งค่าจุดตัดสําหรับการโหลดช่วงพัก คัดลอกบรรทัดต่อไปนี้ลงในไฟล์ js/receiver.js หลังจากบรรทัดที่มีตัวแปร context และ playerManager

const breakManager = playerManager.getBreakManager();

คราวนี้ เราจะมาเริ่มสกัดกั้นด้วยกฎเพื่อข้ามช่วงพักโฆษณาที่เกิดขึ้นก่อน 30 วินาทีไปก่อน ดักจับนี้ทําหน้าที่เหมือนกับดักตัวแปล LOAD บน PlayerManager ยกเว้นตัวนี้มีการโหลดเฉพาะ BreakClips

คัดลอกข้อมูลต่อไปนี้ลงในไฟล์ js/receiver.js

breakManager.setBreakClipLoadInterceptor((breakClip, breakCtx) => {
  /** Below code will skip playback of break clips if the break position is less than 30 **/
  let breakObj = breakCtx.break;
  if(breakObj.position < 30)
    return null;
  else
    return breakClip;
});

หมายเหตุ: เราแสดงผลค่า null ที่นี่สําหรับ BreakClips ที่ควรข้าม

บันทึกการเปลี่ยนแปลงของคุณไปยัง js/receiver.js และเริ่มต้นเซสชันการแคสต์บนผู้ส่งเว็บด้วยการคลิกขวาที่ใดก็ได้บนหน้าเว็บแล้วเลือก "แคสต์"

สตรีมควรเริ่มเล่น แต่จะไม่มีการข้ามการบล็อกโฆษณาที่เราเห็นใน 15 วินาทีก่อนหน้านี้

9. การปรับแต่งพฤติกรรมการกรอวิดีโอ

เมื่อผู้ใช้กรอไปข้างหน้า การพักการเล่นระหว่างการค้นหาจาก และ รอการค้นหาสุดท้ายจะเล่นก่อนที่การเล่นเนื้อหาจะเริ่มจากตําแหน่ง searchTo เมื่อผู้ใช้กรอวิดีโอกลับ จะไม่มีการเล่นช่วงพัก นี่คือลักษณะการทํางานเริ่มต้นของการพัก

เราปรับแต่ง BreakManager เพื่อปรับแต่งเวลาพักระหว่างเล่นในการค้นหา เราใช้ setBreakSeekInterceptor ของ BreakManager เพื่อระบุพฤติกรรมที่กําหนดเองตามที่เราต้องการ มีการเรียกใช้ setBreakSeekInterceptor เมื่อใดก็ตามที่ดําเนินการค้นหา

เราส่งผ่านฟังก์ชันเรียกกลับไปยัง setBreakSeekInterceptor ฟังก์ชันเรียกกลับจะถูกส่งผ่านวัตถุที่มีตัวแบ่งทั้งหมดระหว่างตําแหน่ง requestFrom กับตําแหน่ง requestTo

มาตั้งค่าตัวช่วยสกัดกั้นด้วยกฎเพื่อเล่นช่วงพักชมการแข่งขันที่คั่นระหว่างตําแหน่ง "FromFrom" กับ "LookTo"

คัดลอกข้อมูลต่อไปนี้ลงในไฟล์ js/receiver.js

breakManager.setBreakSeekInterceptor(function(breakSeekData) {
     /**
     *
     * Below code will play an unwatched break between seekFrom and seekTo position
     * Note: If the position of a break is less than 30 then it will be skipped due to the setBreakClipLoadInterceptor code
     */

    let breakToPlay;
    for (let i = 0; i < breakSeekData.breaks.length; i++) {
        if (!breakSeekData.breaks[i].isWatched) {
            breakToPlay = breakSeekData.breaks[i];
        }
    }
    if (breakToPlay){
        breakSeekData.breaks = [breakToPlay];
        return breakSeekData;
    }
});

หมายเหตุ: เราจะไม่แสดงข้อผิดพลาด ถ้าเราแสดงผล breakSeekData ตามเดิม ช่วงพักทั้งหมดระหว่าง requestFrom จะเล่นที่ toTo จะเล่น

บันทึกการเปลี่ยนแปลงของคุณไปยัง js/receiver.js และเริ่มต้นเซสชันการแคสต์บนผู้ส่งเว็บด้วยการคลิกขวาที่ใดก็ได้บนหน้าเว็บแล้วเลือก "แคสต์" สตรีมโฆษณาควรเริ่มเล่นทันที

10. ขอแสดงความยินดี

ขณะนี้คุณทราบวิธีเพิ่มโฆษณาในแอปพลิเคชันตัวรับสัญญาณโดยใช้ SDK ตัวรับสัญญาณล่าสุด

โปรดดูรายละเอียดเพิ่มเติมในคู่มือนักพัฒนาซอฟต์แวร์ช่วงพักโฆษณา