總覽
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。