ช่วงพักโฆษณา
Web Sender SDK ให้การสนับสนุนสำหรับช่วงพักโฆษณาและโฆษณาที่แสดงร่วมภายใน สตรีมสื่อที่กำหนด
โปรดดู ภาพรวมช่วงพักโฆษณาในเว็บรีซีฟเวอร์สำหรับข้อมูลเพิ่มเติม เกี่ยวกับวิธีการทำงานของช่วงพักโฆษณา
แม้ว่าจะสามารถระบุช่วงพักได้ทั้งกับผู้ส่งและผู้รับ แต่เราขอแนะนำให้เป็น ที่ระบุไว้ในเว็บรีซีฟเวอร์และ ตัวรับสัญญาณ Android TV เพื่อให้คงความสม่ำเสมอ พฤติกรรมบนแพลตฟอร์มต่างๆ
บนเว็บ ให้ระบุช่วงพักโฆษณาในคำสั่งโหลดโดยใช้
BreakClip
และ Break
:
let breakClip1 = new BreakClip('bc0');
breakClip1.title = 'Clip title'
breakClip1.posterUrl = 'https://www.some.url';
breakClip1.duration = 60;
breakClip.whenSKippable = 5;
let breakClip2 = ...
let breakClip3 = ...
let break1 = new Break('b0', ['bc0', 'bc1', 'bc2'], 10);
let mediaInfo = new chrome.cast.media.MediaInfo(<contentId>, '<contentType');
...
mediaInfo.breakClips = [breakClip1, breakClip2, breakClip3];
mediaInfo.breaks = [break1];
let request = new chrome.cast.media.LoadRequest(mediaInfo);
cast.framework.CastContext.getInstance().getCurrentSession().loadMedia(request)
การใช้ API ของการติดตาม
แทร็กอาจเป็นออบเจ็กต์ข้อความ (คำบรรยายหรือคำบรรยายแทนเสียง) หรือสตรีมเสียงหรือวิดีโอก็ได้ ออบเจ็กต์ API การติดตามช่วยให้คุณทำงานกับออบเจ็กต์เหล่านี้ในแอปพลิเคชันของคุณได้
ออบเจ็กต์ Track
หมายถึงแทร็กใน SDK คุณสามารถกำหนดค่าแทร็กและกำหนดรหัสที่ไม่ซ้ำกันได้
ดังนี้
var englishSubtitle = new chrome.cast.media.Track(1, // track ID
chrome.cast.media.TrackType.TEXT);
englishSubtitle.trackContentId = 'https://some-url/caption_en.vtt';
englishSubtitle.trackContentType = 'text/vtt';
englishSubtitle.subtype = chrome.cast.media.TextTrackType.SUBTITLES;
englishSubtitle.name = 'English Subtitles';
englishSubtitle.language = 'en-US';
englishSubtitle.customData = null;
var frenchSubtitle = new chrome.cast.media.Track(2, // track ID
chrome.cast.media.TrackType.TEXT);
frenchSubtitle.trackContentId = 'https://some-url/caption_fr.vtt';
frenchSubtitle.trackContentType = 'text/vtt';
frenchSubtitle.subtype = chrome.cast.media.TextTrackType.SUBTITLES;
frenchSubtitle.name = 'French Subtitles';
frenchSubtitle.language = 'fr';
frenchSubtitle.customData = null;
var frenchAudio = new chrome.cast.media.Track(3, // track ID
chrome.cast.media.TrackType.AUDIO);
frenchAudio.trackContentId = 'trk0001';
frenchAudio.trackContentType = 'audio/mp3';
frenchAudio.subtype = null;
frenchAudio.name = 'French Audio';
frenchAudio.language = 'fr';
frenchAudio.customData = null;
รายการสื่ออาจมีหลายแทร็ก เช่น สามารถมีได้ คำบรรยาย (แต่ละรายการสำหรับภาษาอื่น) หรือสตรีมเสียงทางเลือกต่างๆ (สำหรับภาษาต่างๆ)
MediaInfo
คือคลาสที่สร้างโมเดลรายการสื่อ หากต้องการเชื่อมโยงคอลเล็กชันของ
Track
ออบเจ็กต์ด้วยรายการสื่อ
คุณก็อัปเดตออบเจ็กต์
tracks
การเชื่อมโยงนี้ต้องดำเนินการก่อนสื่อ
โหลดลงในเครื่องรับแล้ว:
var tracks = [englishSubtitle, frenchSubtitle, frenchAudio];
var mediaInfo = new chrome.cast.media.MediaInfo(mediaURL);
mediaInfo.contentType = 'video/mp4';
mediaInfo.metadata = new chrome.cast.media.GenericMediaMetadata();
mediaInfo.customData = null;
mediaInfo.streamType = chrome.cast.media.StreamType.BUFFERED;
mediaInfo.textTrackStyle = new chrome.cast.media.TextTrackStyle();
mediaInfo.duration = null;
mediaInfo.tracks = tracks;
คุณตั้งค่าแทร็กที่ใช้งานอยู่ในสื่อได้
activeTrackIds
อีกครั้ง
คุณยังเปิดใช้งานแทร็กอย่างน้อย 1 แทร็กที่เชื่อมโยงกับสื่อได้ด้วย
หลังจากโหลดสื่อแล้ว
EditTracksInfoRequest(opt_activeTrackIds, opt_textTrackStyle)
และการส่งรหัสของแทร็กเพื่อเปิดใช้งานใน opt_activeTrackIds
หมายเหตุ
พารามิเตอร์ทั้ง 2 รายการเป็นตัวเลือก และคุณสามารถเลือกแทร็กหรือสไตล์ที่ใช้งานอยู่
เพื่อกำหนดตามดุลยพินิจของคุณ ตัวอย่างเช่น อธิบายวิธี
เปิดใช้งานคำบรรยายภาษาฝรั่งเศส (2
) และเสียงภาษาฝรั่งเศส (3
):
var activeTrackIds = [2, 3];
var tracksInfoRequest = new chrome.cast.media.EditTracksInfoRequest(activeTrackIds);
media.editTracksInfo(tracksInfoRequest, successCallback, errorCallback);
เมื่อต้องการลบแทร็กเสียงหรือแทร็กวิดีโอทั้งหมดออกจากสื่อปัจจุบัน เพียงแค่ตั้งค่า
mediaInfo.tracks=null
(อาร์เรย์ว่างเปล่า) และโหลดสื่อซ้ำ
หากต้องการนำแทร็กข้อความทั้งหมดออกจากสื่อปัจจุบัน (ตัวอย่างเช่น การปิด คำบรรยาย) ให้ทำสิ่งใดสิ่งหนึ่งต่อไปนี้
- อัปเดต
var activeTrackIds = [2, 3];
(แสดงก่อนหน้านี้) เพื่อให้ รวมเฉพาะแทร็กเสียง [3] - ตั้งค่า
mediaInfo.tracks=null
โปรดทราบว่าคุณไม่จำเป็นต้อง โหลดสื่อซ้ำเพื่อปิดคำบรรยายข้อความ (track.hidden
) กำลังส่งอาร์เรย์activeTracksId
ที่ไม่มีแอตทริบิวต์ เคยเปิดใช้งานtrackId
ไว้ ปิดการใช้งานแทร็กข้อความ
การจัดรูปแบบแทร็กข้อความ
TextTrackStyle
เป็นวัตถุที่ห่อหุ้มข้อมูลการจัดรูปแบบของแทร็กข้อความ หลัง
สร้างหรืออัปเดตออบเจ็กต์ TextTrackStyle
ที่มีอยู่ คุณก็นำออบเจ็กต์ดังกล่าวไปใช้กับ
รายการสื่อที่กำลังเล่นอยู่โดยเรียก
editTrackInfo
ดังนี้
var textTrackStyle = new chrome.cast.media.TextTrackStyle();
var tracksInfoRequest = new chrome.cast.media.EditTracksInfoRequest(textTrackStyle);
media.editTracksInfo(tracksInfoRequest, successCallback, errorCallback);
คุณสามารถติดตามสถานะของคำขอพร้อมผลลัพธ์ของการเรียกกลับ โดยทำอย่างใดอย่างหนึ่งต่อไปนี้ สำเร็จหรือมีข้อผิดพลาด แล้วอัปเดตผู้ส่งต้นทางตามนั้น
แอปพลิเคชันควรอนุญาตให้ผู้ใช้อัปเดตสไตล์สำหรับแทร็กข้อความ ไม่ว่าจะเป็น โดยใช้การตั้งค่าที่ได้รับจากระบบหรือโดยตัวแอปพลิเคชันเอง
คุณสามารถจัดรูปแบบองค์ประกอบของรูปแบบแทร็กข้อความต่อไปนี้ได้
- สีและความทึบแสงของพื้นหน้า (ข้อความ)
- สีและความโปร่งแสงของพื้นหลัง
- ชนิดขอบ
- สีขอบ
- สเกลแบบอักษร
- ชุดแบบอักษร
- รูปแบบตัวอักษร
ตัวอย่างเช่น ตั้งค่าสีข้อความเป็นสีแดงโดยมีความทึบแสง 75% ดังนี้
var textTrackStyle = new chrome.cast.media.TextTrackStyle();
textTrackStyle.foregroundColor = '#80FF0000';
การควบคุมระดับเสียง
คุณสามารถใช้
RemotePlayer
และ
RemotePlayerController
เพื่อตั้งค่าระดับเสียงของผู้รับ
function changeVolume(newVolume) {
player.volumeLevel = newVolume;
playerController.setVolumeLevel();
// Update sender UI to reflect change
}
แอปผู้ส่งควรเป็นไปตามหลักเกณฑ์ต่อไปนี้ในการควบคุมระดับเสียง
- แอปพลิเคชันของผู้ส่งต้องซิงค์กับผู้รับเพื่อให้
UI ผู้ส่งจะรายงานระดับเสียงตามผู้รับเสมอ ใช้เมนู
RemotePlayerEventType.VOLUME_LEVEL_CHANGED
และRemotePlayerEventType.IS_MUTED_CHANGED
Callback เพื่อรักษา ในผู้ส่ง ดูการอัปเดตสถานะ เพื่อดูข้อมูลเพิ่มเติม - แอปผู้ส่งต้องไม่ตั้งระดับเสียงที่ระดับเสียงที่กำหนดไว้ล่วงหน้า หรือตั้งระดับเสียงให้เป็นระดับเสียงเรียกเข้า/ระดับเสียงของสื่อของผู้ส่งเมื่อ ที่แอปโหลดบนเครื่องรับ
โปรดดู การควบคุมระดับเสียงของผู้ส่ง ในรายการตรวจสอบการออกแบบ
การส่งข้อความสื่อไปยังผู้รับ
ระบบสามารถส่ง Media Messages
จากผู้ส่งไปยัง
รีซีฟเวอร์ เช่น หากต้องการส่งข้อความ SKIP_AD
ไปยังผู้รับ ให้ทำดังนี้
// Get a handle to the skip button element
const skipButton = document.getElementById('skip');
skipButton.addEventListener("click", function() {
if (castSession) {
const media = castSession.getMediaSession();
castSession.sendMessage('urn:x-cast:com.google.cast.media', {
type: 'SKIP_AD',
requestId: 1,
mediaSessionId: media.mediaSessionId
});
}
});
การอัปเดตสถานะ
เมื่อผู้ส่งหลายคนเชื่อมต่อกับผู้รับเดียวกัน สิ่งสำคัญสำหรับ ผู้ส่งแต่ละรายต้องทราบการเปลี่ยนแปลงในส่วนรับ แม้ว่าการเปลี่ยนแปลงเหล่านั้น เริ่มต้นจากผู้ส่งรายอื่น
ด้วยเหตุนี้ แอปพลิเคชันของคุณควรลงทะเบียน Listener ที่จำเป็นทั้งหมดบน
RemotePlayerController
หาก
TextTrackStyle
ของการเปลี่ยนแปลงสื่อในปัจจุบัน ผู้ส่งที่เชื่อมต่อทั้งหมดจะได้รับแจ้ง
และคุณสมบัติที่เกี่ยวข้องของเซสชันสื่อปัจจุบัน เช่น
activeTrackIds
และ textTrackStyle
ของ
MediaInfo
จะส่งไปยังผู้ส่งใน Callback ในกรณีนี้ SDK ตัวรับสัญญาณ
ไม่ได้ตรวจสอบว่ารูปแบบใหม่แตกต่างจากรูปแบบก่อนหน้านี้หรือไม่ และ
แจ้งเตือนผู้ส่งที่เชื่อมต่อทั้งหมดโดยไม่คำนึง
สัญญาณบอกสถานะความคืบหน้า
การแสดงตำแหน่งการเล่นพร้อมสัญญาณบอกสถานะความคืบหน้าในผู้ส่งคือ สำหรับแอปส่วนใหญ่ Cast API ใช้โปรโตคอลสื่อของ Cast ซึ่ง ช่วยเพิ่มประสิทธิภาพการใช้แบนด์วิดท์สำหรับสถานการณ์นี้และสถานการณ์อื่นๆ คุณจึงไม่ต้อง ต้องใช้การซิงค์ข้อมูลสถานะของคุณเอง เพื่อการใช้งานที่เหมาะสม ของตัวบ่งชี้ความคืบหน้าสำหรับการเล่นสื่อโดยใช้ API โปรดดู แอป CastVideos-chrome ตัวอย่าง
ข้อกำหนด CORS
Google Cast ต้องมีส่วนหัว CORS สำหรับการสตรีมสื่อแบบปรับอัตโนมัติ แต่แม้แต่สตรีมสื่อ mp4 ธรรมดาๆ ก็ต้องมี CORS ถ้ามีแทร็กรวมอยู่ด้วย หากคุณ หากต้องการเปิดใช้แทร็กสำหรับสื่อใดก็ตาม คุณต้องเปิดใช้ CORS สำหรับทั้งแทร็ก และสตรีมสื่อของคุณ ดังนั้นถ้าคุณไม่มีส่วนหัว CORS สำหรับสื่อ mp4 อย่างง่ายบนเซิร์ฟเวอร์ แล้วเพิ่มคำบรรยายสั้นๆ คุณจะไม่สามารถสตรีมสื่อได้จนกว่าคุณจะอัปเดตเซิร์ฟเวอร์ ให้รวมส่วนหัว CORS ที่เหมาะสม
คุณต้องมีส่วนหัวต่อไปนี้ Content-Type
,Accept-Encoding
และ Range
โปรดทราบว่าส่วนหัว 2 รายการสุดท้ายคือ Accept-Encoding
และ Range
เป็นส่วนเพิ่มเติม
ที่คุณอาจไม่จำเป็นต้องใช้ก่อนหน้านี้
ไวลด์การ์ด "*" ไม่สามารถใช้สำหรับส่วนหัว Access-Control-Allow-Origin
ถ้า
หน้าเว็บมีเนื้อหาสื่อที่มีการป้องกัน จึงต้องใช้โดเมนแทน
ไวลด์การ์ด
ดำเนินเซสชันต่อโดยไม่ต้องโหลดหน้าเว็บซ้ำ
หากต้องการใช้ CastSession
ที่มีอยู่อีกครั้ง ให้ใช้
requestSessionById(sessionId)
กับ sessionId
ของเซสชันที่คุณพยายามเข้าร่วม
sessionId
จะอยู่ใน CastSession
ที่ใช้งานอยู่โดยใช้
getSessionId()
หลังจากโทร
loadMedia()
วิธีการที่แนะนำมีดังนี้
- โทร
loadMedia()
เพื่อเริ่มเซสชัน - จัดเก็บ
sessionId
ในเครื่อง - เข้าร่วมเซสชันอีกครั้งโดยใช้
requestSessionById(sessionId)
เมื่อจำเป็น
let sessionId;
function rejoinCastSession() {
chrome.cast.requestSessionById(sessionId);
// Add any business logic to load new content or only resume the session
}
document.getElementById('play-button').addEventListener(("click"), function() {
if (sessionId == null) {
let castSession = cast.framework.CastContext.getInstance().getCurrentSession();
if (castSession) {
let mediaInfo = createMediaInfo();
let request = new chrome.cast.media.LoadRequest(mediaInfo);
castSession.loadMedia(request)
sessionId = CastSession.getSessionId();
} else {
console.log("Error: Attempting to play media without a Cast Session");
}
} else {
rejoinCastSession();
}
});
ขั้นตอนถัดไป
ส่วนนี้ของฟีเจอร์ที่คุณเพิ่มลงในแอป Web Sender ได้ ตอนนี้คุณสร้างแอปผู้ส่งสำหรับแพลตฟอร์มอื่นได้แล้ว (Android หรือ iOS) หรือ สร้างแอปตัวรับ