廣告插播
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)
使用 tracks API
音軌可以是文字 (字幕或輔助字幕) 物件,也可以是音訊或影片串流物件。Tracks API 可讓您在應用程式中使用這些物件。
Track
物件代表 SDK 中的曲目。您可以設定追蹤記錄並指派專屬 ID,如下所示:
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
要求中設定有效的曲目。
您也可以在媒體載入後,呼叫 EditTracksInfoRequest(opt_activeTrackIds, opt_textTrackStyle)
並傳遞要啟用的音軌 ID,藉此啟用與媒體項目相關聯的一或多個音軌。opt_activeTrackIds
請注意,這兩個參數都是選用的,您可以自行選擇要設定哪些活動追蹤或樣式。舉例來說,以下是如何啟用法文字幕 (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
)。傳送「不含」先前已啟用的trackId
的activeTracksId
陣列,即可停用文字軌。
設定文字軌樣式
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
回呼,維持傳送端的音量。詳情請參閱「狀態更新」。 - 傳送端應用程式不得將音量設為特定的預先定義音量,或在應用程式載入至接收端時,將音量設為傳送端裝置的鈴聲/媒體音量。
傳送媒體訊息給接收者
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
});
}
});
最新動態
當多個傳送者與同一個接收者連線時,即使這些變更是由其他傳送者啟動,每個傳送者都必須注意接收者的變更。
為此,您的應用程式應在 RemotePlayerController
上註冊所有必要的事件監聽器。如果目前媒體的 TextTrackStyle
發生變更,系統會通知所有已連結的傳送端,並在回呼中將目前媒體工作階段的相應屬性 (例如 MediaInfo
欄位的 activeTrackIds
和 textTrackStyle
) 傳送給傳送端。在這種情況下,接收器 SDK 不會驗證新樣式是否與先前樣式不同,並且會通知所有已連結的傳送端。
進度指標
對於大多數應用程式而言,在傳送端顯示播放位置並附上進度指標是必要條件。Cast API 會使用 Cast 媒體通訊協定,可針對這類情況和其他情況最佳化頻寬使用量,因此您不需要實作自己的狀態同步處理功能。如要使用 API 正確實作媒體播放進度指標,請參閱 CastVideos-chrome 範例應用程式。
CORS 規定
針對自適應媒體串流,Google Cast 需要 CORS 標頭,但即使是簡單的 mp4 媒體串流,如果包含音軌,也需要 CORS。如果您想為任何媒體啟用「曲目」,必須為曲目串流和媒體串流啟用 CORS。因此,如果伺服器上的簡易 mp4 媒體沒有 CORS 標頭,且您新增簡易字幕音軌,則必須更新伺服器,納入適當的 CORS 標頭,才能串流媒體。
您需要以下標頭:Content-Type
、Accept-Encoding
和 Range
。請注意,最後兩個標頭 Accept-Encoding
和 Range
是先前可能不需要的額外標頭。
萬用字元「*」無法用於 Access-Control-Allow-Origin
標頭。如果網頁含有受保護的媒體內容,則必須使用網域,而非萬用字元。
不重新載入網頁即可繼續工作階段
如要繼續使用現有的 CastSession
,請使用 requestSessionById(sessionId)
與您要加入的會話 sessionId
。
在呼叫 loadMedia()
後,您可以使用 getSessionId()
在有效的 CastSession
上找到 sessionId
。
建議做法如下:
- 呼叫
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 傳送端應用程式的功能。現在,您可以為其他平台 (Android 或 iOS) 建構傳送端應用程式,或是建構接收端應用程式。