用于直播电视流的Chromecast CAF接收器设置

时间:2018-06-28 06:31:41

标签: google-cast

我正在尝试设置CAF接收器以播放直播电视频道。它是单个频道的连续不可搜索流。我有要定期加载的当前和后续程序的所有程序信息。

最初,我使用“ LOAD”消息拦截器将其设置为标准媒体项目,它可以很好地播放流,但没有单独程序的概念。

参加Google Home Cast开发者研讨会后,我意识到应该使用Queuing系统处理LIVE TV流,每个节目都表示为一个Queue项。这样可以使媒体信息自动针对每个程序进行更新,并显示正确的进度信息。但是,我没有看到任何实现此目标的示例。

我一直在研究文档,试图使某些东西正常工作,但是很难将它们全部拼合在一起。以下是我的QueueBase实现的示例。它确实使用第一个队列项加载并播放流,仅此而已。进度条/值不正确,似乎在进度条上使用各个流段作为持续时间/进度,因此我认为我没有正确设置这些值。我也不确定containerMetadata信息是否正确或什至需要。

是否有人有更多有关如何配置接收器播放LIVE TV流的信息?似乎我正在丢失某些东西或以错误的方式进行操作,因此将不胜感激。

谢谢

export class LiveQueue extends cast.framework.QueueBase {
  async initialize(loadRequestData: LoadRequestData) {
    if (
      loadRequestData.media &&
      loadRequestData.media.contentId &&
      loadRequestData.customData.assetType === 'LIVE'
    ) {

      const {
        media: { contentId },
        customData: { state },
      } = loadRequestData;

      const { channel, region } = await getLiveAsset(contentId, state);
      const queueItems = await this.getLiveQueueItems(channel, region);

      const queueData = new cast.framework.messages.QueueData(
        channel.id,
        channel.name,
        channel.description,
        'REPEAT_OFF',
        queueItems,
        0
      );

      queueData.queueType = 'LIVE_TV';

      queueData.containerMetadata = new cast.framework.messages.ContainerMetadata();
      queueData.containerMetadata.title = channel.name;
      queueData.containerMetadata.containerDuration = Infinity;
      queueData.containerMetadata.sections = channel.listings.map(
        (program, index) => {
          const startTime = moment(program.startTime);
          const endTime = moment(program.endTime);
          const duration = endTime.diff(startTime) / 1000;

          let metadata = new cast.framework.messages.MediaMetadata('GENERIC');
          metadata.queueItemId = queueItems[index].itemId;
          metadata.sectionDuration = duration;
          metadata.sectionStartAbsoluteTime = startTime.unix();
          return metadata;
        }
      );

      return queueData;
    }
    return null;
  }

  async getLiveQueueItems(channel: Channel, region: Region) {
    const playbackDetails = await getLivePlaybackDetails(channel.referenceId);
    const { contentUrl, contentType } = playbackDetails;

    const queueItems = channel.listings.map((program, index) => {
      const startTime = moment(program.startTime);
      const endTime = moment(program.endTime);
      const duration = endTime.diff(startTime) / 1000;

      const media = new cast.framework.messages.MediaInformation();
      media.contentId = program.id;
      media.contentType = contentType;
      media.contentUrl = contentUrl;
      media.streamType = 'LIVE';
      media.startAbsoluteTime = startTime.unix();
      media.duration = duration;
      media.metadata = new cast.framework.messages.GenericMediaMetadata();
      media.metadata.title = channel.name;
      media.metadata.subtitle = channel.listings[index].name;

      const queueItem = new cast.framework.messages.QueueItem();
      queueItem.media = media;

      return queueItem;
    });

    return queueItems;
  }

  onCurrentItemIdChanged(itemId: number) {
    console.log('onCurrentItemIdChanged', itemId);
  }
}

0 个答案:

没有答案