首页 > 解决方案 > Chromecast v3 接收器应用程序不工作

问题描述

我运行了示例自定义接收器。我正在使用 ngrok 运行它,但我在控制台中看到它没有连接到网络套接字。任何帮助表示赞赏:这是我的接收器代码和屏幕截图

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


const playbackConfig = new cast.framework.PlaybackConfig();
// Customize the license url for playback
playbackConfig.licenseUrl = 'https://wv-keyos.licensekeyserver.com/';
playbackConfig.protectionSystem = cast.framework.ContentProtection.WIDEVINE;
playbackConfig.licenseRequestHandler = requestInfo => {
  requestInfo.withCredentials = true;
  requestInfo.headers = {
    'customdata': '<custom data>'
  };
};


// Update playback config licenseUrl according to provided value in load request.
context.getPlayerManager().setMediaPlaybackInfoHandler((loadRequest, playbackConfig) => {
  if (loadRequest.media.customData && loadRequest.media.customData.licenseUrl) {
    playbackConfig.licenseUrl = loadRequest.media.customData.licenseUrl;
  }
  return playbackConfig;
});


function makeRequest (method, url) {
  return new Promise(function (resolve, reject) {
    var xhr = new XMLHttpRequest();
    xhr.open(method, url);
    xhr.onload = function () {
      if (this.status >= 200 && this.status < 300) {
        resolve(JSON.parse(xhr.response));
      } else {
        reject({
          status: this.status,
          statusText: xhr.statusText
        });
      }
    };
    xhr.onerror = function () {
      reject({
        status: this.status,
        statusText: xhr.statusText
      });
    };
    xhr.send();
  });
}

playerManager.setMessageInterceptor(
  cast.framework.messages.MessageType.LOAD,
  request => {
    castDebugLogger.info('MyAPP.LOG', 'Intercepting LOAD request');

    if (request.media && request.media.entity) {
      request.media.contentId = request.media.entity;
    }

    return new Promise((resolve, reject) => {

      if(request.media.contentType == 'video/mp4') {
        return resolve(request);
      }

      // Fetch content repository by requested contentId
      makeRequest('GET', 'https://tse-summit.firebaseio.com/content.json?orderBy=%22$key%22&equalTo=%22'+ request.media.contentId + '%22')
        .then(function (data) {
          var item = data[request.media.contentId];
          if(!item) {
            // Content could not be found in repository
            castDebugLogger.error('MyAPP.LOG', 'Content not found');
            reject();
          } else {
            // Adjusting request to make requested content playable
            request.media.contentId = item.stream.hls;
            request.media.contentType = 'application/x-mpegurl';
            castDebugLogger.warn('MyAPP.LOG', 'Playable URL:', request.media.contentId);

            // Add metadata
            var metadata = new cast.framework.messages.MovieMediaMetadata();
            metadata.metadataType = cast.framework.messages.MetadataType.MOVIE;
            metadata.title = item.title;
            metadata.subtitle = item.author;

            request.media.metadata = metadata;
            resolve(request);
          }
      });
    });
  });

/** Debug Logger **/
const castDebugLogger = cast.debug.CastDebugLogger.getInstance();

// Enable debug logger and show a warning on receiver
// NOTE: make sure it is disabled on production
castDebugLogger.setEnabled(true);

playerManager.addEventListener(
  cast.framework.events.category.CORE,
  event => {
      castDebugLogger.info('ANALYTICS', 'CORE EVENT:', event);
});

// Set verbosity level for custom tags
castDebugLogger.loggerLevelByTags = {
  'MyAPP.LOG': cast.framework.LoggerLevel.WARNING,
  'ANALYTICS': cast.framework.LoggerLevel.INFO,
};

/** Optimizing for smart displays **/
const playerData = new cast.framework.ui.PlayerData();
const playerDataBinder = new cast.framework.ui.PlayerDataBinder(playerData);
const touchControls = cast.framework.ui.Controls.getInstance();

let browseItems = getBrwoseItems();

function getBrwoseItems() {
  let data = '"video": { \
    "author": "The Blender Project", \
    "description": "Grumpy Bunny is grumpy", \
    "poster": "https://storage.googleapis.com/tse-summit.appspot.com/bbb/poster.png", \
    "prog": "https://storage.googleapis.com/tse-summit.appspot.com/bbb/bbb-prog.mp4", \
    "stream": { \
      "dash": "https://d8dbsji255dut.cloudfront.net/drm-test/4K-Gaming-Sample.mpd", \
      "hls": "https://d8dbsji255dut.cloudfront.net/drm-test/4K-Gaming-Sample.m3u8" \
    }, \
    "title": "Big Buck Bunny" \
  }';


  let browseItems = [];

  for (let key in data) {
    let item = new cast.framework.ui.BrowseItem();
    item.entity = key;
    item.title = data[key].title;
    item.subtitle = data[key].description;
    item.image = new cast.framework.messages.Image(data[key].poster);
    item.imageType = cast.framework.ui.BrowseImageType.MOVIE;
    browseItems.push(item);
  }
  return browseItems;
}

let browseContent = new cast.framework.ui.BrowseContent();
browseContent.title = 'Up Next';
browseContent.items = browseItems;
browseContent.targetAspectRatio =
  cast.framework.ui.BrowseImageAspectRatio.LANDSCAPE_16_TO_9;

playerDataBinder.addEventListener(
  cast.framework.ui.PlayerDataEventType.MEDIA_CHANGED,
  (e) => {
    if (!e.value) return;

    // Clear default buttons and re-assign
    touchControls.clearDefaultSlotAssignments();
    touchControls.assignButton(
      cast.framework.ui.ControlsSlot.SLOT_1,
      cast.framework.ui.ControlsButton.SEEK_BACKWARD_30
    );

    // Media browse
    touchControls.setBrowseContent(browseContent);
  });

// context.start({ touchScreenOptimizedApp: true });

context.start({playbackConfig: playbackConfig});


在此处输入图像描述

我已经注册了 Google Cast SDK Developer Console 并创建了一个未发布的应用程序并添加了我的 chrome cast 设备。

标签: chromecastgoogle-cast

解决方案


您看到这些错误是因为您直接通过 Web 浏览器加载接收器。转换会话的通常流程是“发送者”(Web 浏览器、iOS 设备、Android 设备)将启动与托管接收器的转换会话,从而开始套接字连接。现在,你只有一个接收器加载,没有任何东西启动会话。

测试这一点的一种方法是插入 Chromecast 或启用投射的设备(大多数 Android TV 也内置了 Chromecast!),并使用有效的发送器连接到您的接收器。


谷歌已经建立了一个很棒的工具来帮助 Chromecast 的开发,很遗憾它没有被更多地宣传。你可以在这里找到它:https ://casttool-1287.appspot.com/cactesttool/index.html

如果您想真正确定您的 Chromecast 开发技能,我个人建议您查看:

  1. Google Codelabs for Cast,这些有一些非常有用的演练。https://codelabs.developers.google.com/?cat=Cast
  2. Google Cast github repo 有一些很好的例子。https://github.com/googlecast

注意:这绝不是对演员会话实际启动方式的详细解释,一些非常聪明的人已经深入研究了 Chromecast 会话的工作原理,如果您有兴趣查看 Romain Picard 在https://blog.oakbits上的文章.com/google-cast-protocol-overview.html


推荐阅读