Kolejkowanie

Omówienie

Pakiet Web Receiver SDK obsługuje kolejkowanie z użyciem tagów domyślna kolejka udostępniana przez Pakiet SDK używa QueueData. oraz QueueManager. lub za pomocą niestandardowej kolejki wdrażanie cast.framework.QueueBase i za pomocą QueueManager .

Interfejs Queueing API umożliwia lepszą integrację aplikacji z Cast następujące funkcje:

  • Pomoc we wdrażaniu kolejki w chmurze przez Google i partnerów, więc na zewnątrz zapisane i utworzone kolejki można załadować bezpośrednio do urządzeń przesyłających.
  • Mechanizmy, które umożliwiają podział elementów w kolejce na strony zamiast wczytywania wszystko naraz.
  • Obsługa nowych komunikatów, takich jak przejście do następnego lub poprzedniego elementu, pobierania okna z elementami oraz pobierania informacji o multimediach czyli zbiór elementów kolejki.
  • QueueManager do zarządzania wstawianiem, usuwaniem i aktualizowaniem elementów w kolejce.

Domyślna kolejka

Pakiet Web Receiver SDK zapewnia ograniczoną obsługę kolejek domyślnej kolejki.

Aby użyć domyślnej kolejki, podaj queueData w LoadRequestData ładowania po stronie nadawcy lub wyślij lokalne żądanie wczytywania za pomocą PlayerManager#load Zobacz też Wczytywanie multimediów.

Po stronie odbiorcy kolejkę można modyfikować za pomocą QueueManager po załadowaniu początkowych multimediów.

Kolejka niestandardowa

Jeśli domyślna kolejka nie zapewnia funkcji kolejkowania wymaganej przez aplikacji, możesz utworzyć niestandardową kolejkę, możliwości i elastyczność.

Programiści aplikacji mogą utworzyć poboczną kolejkę odbiornika internetowego przez cast.framework.QueueBase

Oto podstawowy przykład prostej kolejki, w której initialize zostanie zastąpione, a następnie lista elementów kolejki wraz z ich opisami są dostarczane do urządzenia przesyłającego.

Zobacz też Wczytywanie multimediów.

// 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;
 }
};

W tym przykładzie lista elementów w tabeli initialize jest realizowany w QueueBase wywołanie konstruktora. Jednak w przypadku implementacji kolejki w chmurze niestandardowa Logika odbiornika może pobrać produkty na zewnątrz, a następnie zwrócić je w ramach wywołanie inicjujące.

Aby zaprezentować bardziej kompleksowe zastosowanie interfejsu API do obsługi kolejek, obejrzyj prezentację , która implementuje większość funkcji 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);
 }
};

W powyższym przykładzie YourServer jest serwerem kolejki w chmurze i zastosowanym mechanizmem logicznym. o pobieraniu określonych elementów multimedialnych.

Aby użyć narzędzia QueueBase -implementacji kolejki, trzeba ustawić opcję kolejki CastReceiverContext:

const context = cast.framework.CastReceiverContext.getInstance();
context.start({queue: new DemoQueue()});

Zarządzanie kolejką

QueueManager daje programistom elastyczność w opracowywaniu rozwiązań do obsługi kolejek, dostępu do obecnie zapisanej listy elementów kolejki, a także obecnie odtwarzanego elementu. Zapewnia też takie operacje, jak wstawianie, usuwanie i aktualizacja elementów oczekujących. Ten fragment kodu pokazuje, jak uzyskać dostęp do wystąpienie QueueManager:

const context = cast.framework.CastReceiverContext.getInstance();
const queueManager = context.getPlayerManager().getQueueManager();

Domyślne zarządzanie kolejkami

Po załadowaniu początkowej kolejki QueueManager może służyć do wykonywania takich działań jak pobieranie bieżącego elementu, wszystkich elementów w kolejce, a także aktualizowanie elementów znajdujących się w kolejce za pomocą insertItems, removeItems, oraz updateItems.

Niestandardowe zarządzanie kolejkami

Oto przykład niestandardowej implementacji kolejki, która korzysta z funkcji wstawiania metod usuwania treści na podstawie jakiegoś zdarzenia. Ten przykład pokazuje też wykorzystanie updateItems gdzie deweloperzy mogą modyfikować elementy istniejącej kolejki, przez usunięcie przerw na reklamy.

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;
    }));
  }
};

Wiadomości przychodzące i wychodzące

Aby w pełni obsługiwać pobieranie kolejki po stronie odbiorcy jako źródła informacji, kolejne wiadomości umieszczane w kolejce są wprowadzane i obsługiwane przez CAF Pakiet SDK odbiorcy:

Wiadomość przychodząca Parametry Wiadomość z odpowiedzią wychodzącą Zwróć
DALEJ Parametr nie jest wymagany. MEDIA_STATUS Odbiorca (w razie potrzeby pobiera za pomocą funkcji nextItems()) i rozpoczyna odtwarzanie przejdź do następnego elementu.
WSTECZ Parametr nie jest wymagany. MEDIA_STATUS Odbiornik internetowy (w razie potrzeby pobiera za pomocą prevItems()) i uruchamia odtwarzania poprzedniego elementu.
FETCH_ITEMS FetchItemsRequestData QUEUE_CHANGE A cast.framework.messages.QueueChange. Na przykład w przypadku wstawiania pole items w pliku JSON będzie zawierać listę nowych pobranych elementów.
GET_ITEMS_INFO GetItemsInfoRequestData zawiera identyfikatory itemIds: Tablica<numer> ITEMS_INFO cast.framework.messages.ItemsInfo z informacjami o elementach kolejki.
GET_QUEUE_IDS Parametr nie jest wymagany. QUEUE_IDS cast.framework.messages.QueueIds.

Dla NEXT/PREVIOUS, jeśli obecna reprezentacja kolejki w odbiorniku internetowym nie ma więcej elementów, QueueBase.nextItems(). lub QueueBase.prevItems(). jest automatycznie wywoływany w celu otrzymania większej liczby elementów.

W przypadku funkcji FETCH_ITEM odpowiednia funkcja fetchItems. w implementacji QueueBase jest wywoływana dla kolejek w chmurze, które pobierają odpowiednie dane, które mają być zwracane do odbiornika internetowego w celu zapisania.

Przy każdym pobieraniu kolejnych elementów wywoływany jest nowy typ wiadomości QUEUE_CHANGE. i odesłać do nadawcy. Zobacz różne typy zmian w kolejce.

W przypadku usługi GET_ITEMS_INFO, użytkownika QueueBase implementacja nie zostanie aktywowana, a Web Receiver zwraca informacje o multimediach. już znany z listy identyfikatorów.

Odtwarzanie losowe kolejki

Aby ustawić losową kolejność elementów w kolejce, ustaw shuffle flaga QueueData do true podczas wczytywania elementów do kolejki.

Jeśli używasz implementacji QueueBase, użyj shuffle , która zwróci losową listę elementów.

Aby losowo odtwarzać istniejącą kolejkę, użyj shuffle flaga kraju QUEUE_UPDATE MessageType, zamiast polecenia QUEUE_SHUFFLE. Zobacz QueueUpdateRequestData .

Tryb powtarzania

Aby elementy w kolejce powtarzały się, ustaw parametr repeatMode właściwość QueueData do żądanej wartości RepeatMode podczas wczytywania elementów do kolejki.

Aby zmienić RepeatMode istniejącej kolejki, użyj repeatMode. właściwości QueueUpdateRequestData, który korzysta z QUEUE_UPDATE MessageType