排程

總覽

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_INFOQueueBase的 實作時不會觸發,且 Web Receiver 會傳回媒體資訊 編號

隨機排列佇列

如要將佇列中的項目設為隨機排序,請設定 shuffle敬上 國旗 QueueData。 將項目載入佇列時一併載入 true

如果您使用 QueueBase,使用 這個 shuffle。 方法來傳回重組項目清單。

如要隨機播放現有佇列,請使用 shuffle敬上 QUEUE_UPDATE的國旗 MessageType, 而不是 QUEUE_SHUFFLE 指令詳情請參閱 QueueUpdateRequestData 相關說明。

重複模式

如要設定佇列中重複的項目,請將 repeatMode敬上 以下地點的房源: QueueData。 移至所需 RepeatMode

如要變更現有佇列的 RepeatMode,請使用 repeatModeQueueUpdateRequestData, 使用 QUEUE_UPDATE MessageType