chromecast - 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 设备。
解决方案
您看到这些错误是因为您直接通过 Web 浏览器加载接收器。转换会话的通常流程是“发送者”(Web 浏览器、iOS 设备、Android 设备)将启动与托管接收器的转换会话,从而开始套接字连接。现在,你只有一个接收器加载,没有任何东西启动会话。
测试这一点的一种方法是插入 Chromecast 或启用投射的设备(大多数 Android TV 也内置了 Chromecast!),并使用有效的发送器连接到您的接收器。
谷歌已经建立了一个很棒的工具来帮助 Chromecast 的开发,很遗憾它没有被更多地宣传。你可以在这里找到它:https ://casttool-1287.appspot.com/cactesttool/index.html
如果您想真正确定您的 Chromecast 开发技能,我个人建议您查看:
- Google Codelabs for Cast,这些有一些非常有用的演练。https://codelabs.developers.google.com/?cat=Cast
- Google Cast github repo 有一些很好的例子。https://github.com/googlecast
注意:这绝不是对演员会话实际启动方式的详细解释,一些非常聪明的人已经深入研究了 Chromecast 会话的工作原理,如果您有兴趣查看 Romain Picard 在https://blog.oakbits上的文章.com/google-cast-protocol-overview.html
推荐阅读
- sql - PostgreSQL - 其中 datetime <= YEAR-MONTH-DAY,忽略时间
- python - 如何为两列python数据框制作总和行
- android - 在 React Native 中查看包装器导致 Android 应用程序崩溃
- qt - 如何捕捉 Qt 保持事件
- python - Matplotlib 子图问题
- sql - 如何从数据库列中分离记录并在查询中进行比较,忽略 Oracle 中的第二个文本
- visual-studio-2017 - VS 2017 中的 VisualHG:提交解决方案中的所有项目
- python - 在 Windows 上安装 Scrapy 的问题
- docker - Docker:无法连接到 gitlab 实例
- python - Buildout 找不到 Pypi Plone 附加组件的依赖项的链接