總覽
Web Receiver SDK 支援將
預設佇列 (由
SDK 使用
QueueData
敬上
和
QueueManager
或使用自訂佇列 (方法是
實作
cast.framework.QueueBase
並使用
QueueManager
。
Queueing API 可為應用程式提供更完善的與 Cast 整合, 包含下列功能:
- 支援 Google 與合作夥伴在外部實作雲端佇列 或已建立的待播清單可直接載入投放裝置。
- 允許在佇列中對項目分頁 (而非載入) 的機制 就能一次完成所有工作
- 支援新的訊息,例如前往下一個項目、上一個項目 擷取項目視窗,以及取得與下列項目相關的媒體資訊: 一組佇列項目。
-
QueueManager
敬上 管理佇列項目的插入、移除和更新作業。
預設佇列
Web Receiver SDK 在表單中直接提供有限的佇列支援 預設佇列的組合
如要使用預設佇列,請提供
queueData
敬上
在傳送方載入的 LoadRequestData
中,或傳送本機載入要求
使用
PlayerManager#load
。
另請參閱載入媒體。
在接收端上,可使用
QueueManager
敬上
載入初始媒體後
自訂佇列
如果預設佇列未提供 應用程式提供建立自訂佇列功能, 。
應用程式開發人員可以透過實作
cast.framework.QueueBase
。
以下為簡易佇列的基本範例,其中
initialize
敬上
便會覆寫呼叫,然後展開佇列項目清單以及佇列說明
所提供的版本
另請參閱載入媒體。
// Creates a simple queue with a combination of contents.
const DemoQueue = class extends cast.framework.QueueBase {
constructor() {
super();
/**
* List of media urls.
* @private @const {!Array<string>}
*/
this.myMediaUrls_ = [...];
}
/**
* Provide a list of items.
* @param {!cast.framework.messages.LoadRequestData} loadRequestData
* @return {!cast.framework.messages.QueueData}
*/
initialize(loadRequestData) {
const items = [];
for (const mediaUrl of this.myMediaUrls_) {
const item = new cast.framework.messages.QueueItem();
item.media = new cast.framework.messages.MediaInformation();
item.media.contentId = mediaUrl;
items.push(item);
}
let queueData = loadRequestData.queueData;
// Create a new queue with media from the load request if one doesn't exist.
if (!queueData) {
queueData = new cast.framework.messages.QueueData();
queueData.name = 'Your Queue Name';
queueData.description = 'Your Queue Description';
queueData.items = items;
// Start with the first item in the playlist.
queueData.startIndex = 0;
// Start from 10 seconds into the first item.
queueData.currentTime = 10;
}
return queueData;
}
};
在這個範例中,
initialize
敬上
呼叫所提供的回呼
QueueBase
。
建構函式呼叫中設定。不過,如果是雲端佇列的實作,自訂網路
接收端邏輯可以從外部擷取項目,然後將項目做為
初始化呼叫。
如要示範更全面的佇列 API 用法,請點選這個示範
會實作絕大多數的
QueueBase
類別。
const DemoQueue = class extends cast.framework.QueueBase {
constructor() {
/** @private {} */
super();
YourServer.onSomeEvent = this.updateEntireQueue_;
}
/**
* Initializes the queue.
* @param {!cast.framework.messages.LoadRequestData} loadRequestData
* @return {!cast.framework.messages.QueueData}
*/
initialize(loadRequestData) {
let queueData = loadRequestData.queueData;
// Create a new queue with media from the load request if one doesn't exist.
if (!queueData) {
queueData = new cast.framework.messages.QueueData();
queueData.name = 'Your Queue Name';
queueData.description = 'Your Queue Description';
// Put the first set of items into the queue
const items = this.nextItems();
queueData.items = items;
// Start with the first item in the playlist.
queueData.startIndex = 0;
// Start from 10 seconds into the first item.
queueData.currentTime = 10;
}
return queueData;
}
/**
* Picks a set of items from remote server after the reference item id and
* return as the next items to be inserted into the queue. When
* referenceItemId is omitted, items are simply appended to the end of the
* queue.
* @param {number} referenceItemId
* @return {!Array<cast.framework.QueueItem>}
*/
nextItems(referenceItemId) {
// Assume your media has a itemId and the media url
return this.constructQueueList_(YourServer.getNextMedias(referenceItemId));
}
/**
* Picks a set of items from remote server before the reference item id and
* return as the items to be inserted into the queue. When
* referenceItemId is omitted, items are simply appended to beginning of the
* queue.
* @param {number} referenceItemId
* @return {!Array<cast.framework.QueueItem>}
*/
prevItems(referenceItemId) {
return this.constructQueueList_(YourServer.getPrevMedias(referenceItemId));
}
/**
* Constructs a list of QueueItems based on the media information containing
* the item id and the media url.
* @param {number} referenceItemId
* @return {!Array<cast.framework.QueueItem>}
*/
constructQueueList_(medias) {
const items = [];
for (media of medias) {
const item = new cast.framework.messages.QueueItem(media.itemId);
item.media = new cast.framework.messages.MediaInformation();
item.media.contentId = media.url;
items.push(item);
}
return items;
}
/**
* Logs the currently playing item.
* @param {number} itemId The unique id for the item.
* @export
*/
onCurrentItemIdChanged(itemId) {
console.log('We are now playing video ' + itemId);
YourServer.trackUsage(itemId);
}
};
在上述範例中,YourServer
是您的雲端佇列伺服器,且有邏輯
瞭解如何擷取特定媒體項目
使用 QueueBase
-實作佇列,即會在
CastReceiverContext
:
const context = cast.framework.CastReceiverContext.getInstance();
context.start({queue: new DemoQueue()});
管理佇列
QueueManager
敬上
開發人員能藉由提供便捷的管道,靈活開發佇列解決方案
方法,存取目前儲存的佇列項目清單,以及
目前正在播放的項目。還提供插入、移除、
和更新佇列項目。下列程式碼片段說明如何存取
執行個體
QueueManager
:
const context = cast.framework.CastReceiverContext.getInstance();
const queueManager = context.getPlayerManager().getQueueManager();
預設佇列管理
初始佇列載入後,
QueueManager
敬上
可用來執行多項動作,例如擷取現有項目、擷取
佇列中的所有項目,並使用以下指令更新佇列中的項目:
insertItems
,
removeItems
,
和
updateItems
。
管理自訂佇列
以下是使用插入和插入功能的自訂佇列實作範例
根據某些事件移除特定資料本範例也示範瞭如何使用
updateItems
敬上
開發人員可在其中修改現有佇列中的佇列項目,例如
移除廣告插播時間點
const DemoQueue = class extends cast.framework.QueueBase {
constructor() {
super();
/** @private @const {!cast.framework.QueueManager} */
this.queueManager_ = context.getPlayerManager().getQueueManager();
}
/**
* Provide a list of items.
* @param {!cast.framework.messages.LoadRequestData} loadRequestData
* @return {!cast.framework.messages.QueueData}
*/
initialize(loadRequestData) {
// Your normal initialization; see examples above.
return queueData;
}
/** Inserts items to the queue. */
onSomeEventTriggeringInsertionToQueue() {
const twoMoreUrls = ['http://url1', 'http://url2'];
const items = [];
for (const mediaUrl of twoMoreUrls) {
const item = new cast.framework.QueueItem();
item.media = new cast.framework.messages.MediaInformation();
item.media.contentId = mediaUrl;
items.push(item);
}
// Insert two more items after the current playing item.
const allItems = this.queueManager_.getItems();
const currentItemIndex = this.queueManager_.getCurrentItemIndex();
const nextItemIndex = currentItemIndex + 1;
let insertBefore = undefined;
if (currentItemIndex >= 0 &&
currentItemIndex < allItems.length - 1) {
insertBefore = allItems[nextItemIndex].itemId;
}
this.queueManager_.insertItems(items, insertBefore);
}
/** Removes a particular item from the queue. */
onSomeEventTriggeringRemovalFromQueue() {
this.queueManager_.removeItems([2]);
}
/** Removes all the ads from all the items across the entire queue. */
onUserBoughtAdFreeVersion() {
const items = this.queueManager_.getItems();
this.queueManager_.updateItems(items.map(item => {
item.media.breaks = undefined;
return item;
}));
}
};
傳入和傳出的訊息
為了完整支援接收方端佇列擷取做為可靠資料來源, 後續排入佇列的訊息則由 CAF 導入及處理 接收端 SDK:
收到的訊息 | 參數 | 傳出回應訊息 | Return 鍵 |
繼續 | 不需要參數。 | MEDIA_STATUS | 接收端將 (視需要透過 nextItems() 擷取) 並開始播放 下一個項目 |
上一步 | 不需要參數。 | MEDIA_STATUS | 網路接收端將 (視需要透過 prevItems() 擷取) 並啟動 播放上一個項目 |
FETCH_ITEMS | FetchItemsRequestData | QUEUE_CHANGE | cast.framework.messages.QueueChange。以插入案件為例 JSON 中的 items 欄位會包含擷取的新項目清單。 |
GET_ITEMS_INFO | 包含 itemIds 的 GetItemsInfoRequestData: 陣列<數字> | ITEMS_INFO | 含有佇列項目資訊的 cast.framework.messages.ItemsInfo。 |
GET_QUEUE_IDS | 不需要參數。 | QUEUE_IDS | cast.framework.messages.QueueIds. |
針對 NEXT
/PREVIOUS
,如果網路接收端上的現有佇列表示法
沒有其他項目,
QueueBase.nextItems()
敬上
或
QueueBase.prevItems()
自動叫用以接收更多項目。
如果是 FETCH_ITEM
,對應的函式
fetchItems
系統會針對 Cloud 佇列呼叫 QueueBase
實作中的工作,系統會擷取
要傳回給網路接收器儲存的相關資料。
每當擷取更多項目時,就會觸發新的訊息類型 QUEUE_CHANGE
並退回給寄件者查看各種類型的
變更佇列。
針對 GET_ITEMS_INFO
,
QueueBase
的
實作時不會觸發,且 Web Receiver 會傳回媒體資訊
編號
隨機排列佇列
如要將佇列中的項目設為隨機排序,請設定
shuffle
敬上
國旗
QueueData
。
將項目載入佇列時一併載入 true
。
如果您使用
QueueBase
,使用
這個
shuffle
。
方法來傳回重組項目清單。
如要隨機播放現有佇列,請使用
shuffle
敬上
QUEUE_UPDATE
的國旗
MessageType
,
而不是 QUEUE_SHUFFLE
指令詳情請參閱 QueueUpdateRequestData
相關說明。
重複模式
如要設定佇列中重複的項目,請將
repeatMode
敬上
以下地點的房源:
QueueData
。
移至所需
RepeatMode
。
如要變更現有佇列的 RepeatMode
,請使用
repeatMode
的
QueueUpdateRequestData
,
使用 QUEUE_UPDATE
MessageType
。