- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在按照 https://codelabs.developers.google.com/codelabs/cast-receiver#0 上的教程构建一个 chrome cast 自定义接收器。我无法让它工作,也不知道如何开始找出问题所在。我已经注册了我的 Actor 应用程序,并正在尝试使用 https://casttool.appspot.com/cactool/来测试接收器。该测试适用于 cactools“CC1AD845”的样本 ID,它转换得很好。我还注册了我的设备进行测试,并重新启动了我认为有效的设备,因为在我这样做之前,cactools 不会为我的自定义应用程序 ID 显示 chromecast 按钮,但现在它确实显示了。问题是当我点击它时,chrome 只显示消息:
“转换失败,请重试”
我的接收器与 http-server 和 ngrok 一起运行,就像代码实验室所指示的那样。我将 ngrok 服务器的正确路径复制到 Cast 开发人员控制台上的应用程序 URL。
当我从浏览器运行 ngrok url 时,devtools 控制台显示以下错误:
Uncaught TypeError: Cannot read property 'is_device_registered' of null
at new V (caf_receiver_logger.js:18)
at Function.V.getInstance (caf_receiver_logger.js:28)
at receiver.js:13
但我认为这是由于我从浏览器打开时没有设备造成的,而在 Chromecast 上运行时不应该出现这种情况。
我复制了 Codelab 提供的整个文件夹,这应该是自定义接收器的工作示例。但即使使用他们的确切代码,它也不起作用。代码是:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Cast CAF Receiver</title>
<script src="//www.gstatic.com/cast/sdk/libs/caf_receiver/v3/cast_receiver_framework.js"></script>
<!-- Cast Debug Logger -->
<script src="//www.gstatic.com/cast/sdk/libs/devtools/debug_layer/caf_receiver_logger.js"></script>
</head>
<body>
<cast-media-player></cast-media-player>
<footer>
<script src="js/receiver.js"></script>
</footer>
</body>
</html>
const context = cast.framework.CastReceiverContext.getInstance();
const playerManager = context.getPlayerManager();
//Media Sample API Values
const SAMPLE_URL = "https://storage.googleapis.com/cpe-sample-media/content.json";
const StreamType = {
DASH: 'application/dash+xml',
HLS: 'application/x-mpegurl'
}
const TEST_STREAM_TYPE = StreamType.DASH
// Debug Logger
const castDebugLogger = cast.debug.CastDebugLogger.getInstance();
const LOG_TAG = 'MyAPP.LOG';
// Enable debug logger and show a 'DEBUG MODE' overlay at top left corner.
castDebugLogger.setEnabled(true);
// Show debug overlay
// castDebugLogger.showDebugLogs(true);
// Set verbosity level for Core events.
castDebugLogger.loggerLevelByEvents = {
'cast.framework.events.category.CORE': cast.framework.LoggerLevel.INFO,
'cast.framework.events.EventType.MEDIA_STATUS': cast.framework.LoggerLevel.DEBUG
}
// Set verbosity level for custom tags.
castDebugLogger.loggerLevelByTags = {
LOG_TAG: cast.framework.LoggerLevel.DEBUG,
};
function makeRequest (method, url) {
return new Promise(function (resolve, reject) {
let 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(LOG_TAG, 'Intercepting LOAD request');
// Map contentId to entity
if (request.media && request.media.entity) {
request.media.contentId = request.media.entity;
}
return new Promise((resolve, reject) => {
// Fetch repository metadata
makeRequest('GET', SAMPLE_URL)
.then(function (data) {
// Obtain resources by contentId from downloaded repository metadata.
let item = data[request.media.contentId];
if(!item) {
// Content could not be found in repository
castDebugLogger.error(LOG_TAG, 'Content not found');
reject();
} else {
// Adjusting request to make requested content playable
request.media.contentType = TEST_STREAM_TYPE;
// Configure player to parse DASH content
if(TEST_STREAM_TYPE == StreamType.DASH) {
request.media.contentUrl = item.stream.dash;
}
// Configure player to parse HLS content
else if(TEST_STREAM_TYPE == StreamType.HLS) {
request.media.contentUrl = item.stream.hls
request.media.hlsSegmentFormat = cast.framework.messages.HlsSegmentFormat.FMP4;
request.media.hlsVideoSegmentFormat = cast.framework.messages.HlsVideoSegmentFormat.FMP4;
}
castDebugLogger.warn(LOG_TAG, 'Playable URL:', request.media.contentUrl);
// Add metadata
let metadata = new cast.framework.messages.GenericMediaMetadata();
metadata.title = item.title;
metadata.subtitle = item.author;
request.media.metadata = metadata;
// Resolve request
resolve(request);
}
});
});
});
// Optimizing for smart displays
const touchControls = cast.framework.ui.Controls.getInstance();
const playerData = new cast.framework.ui.PlayerData();
const playerDataBinder = new cast.framework.ui.PlayerDataBinder(playerData);
let browseItems = getBrowseItems();
function getBrowseItems() {
let browseItems = [];
makeRequest('GET', SAMPLE_URL)
.then(function (data) {
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;
// Media browse
touchControls.setBrowseContent(browseContent);
// Clear default buttons and re-assign
touchControls.clearDefaultSlotAssignments();
touchControls.assignButton(
cast.framework.ui.ControlsSlot.SLOT_PRIMARY_1,
cast.framework.ui.ControlsButton.SEEK_BACKWARD_30
);
});
context.start();
提前谢谢你。
最佳答案
“is_device_registered”错误是由无法在浏览器中运行的 Cast Debug Logger 调用引起的(因为它未在 Chromecast 设备上运行,因此无法找到它)。
经过多次迭代和测试后,我注意到在使用代码实验室设置时出现“无法转换。请重试”的以下常见原因:
关于javascript - Chrome Cast 自定义接收器 "Failed to cast. Please try again",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66320727/
我的应用程序中有一些漫长的过程,因此我创建了一个WAIT PLEASE表单,然后在另一个线程上调用,如下所示: public void ShowWait() { continu
public class Qn { static class Friend { private final String name; public Friend
我正在尝试在 Excel VBA 中创建请稍候消息。这是为了提醒处理 SQL 查询的用户该过程仍在进行中。我希望将此消息显示在用户表单中。 当前,用户连接到 SQL DB,选择数据库和一些其他选项,按
我正在尝试整理来自不同媒体的报道相同故事的新闻文章,我正在使用 news-please python 库。以下代码使用给定的 URL 为我提供新闻,但我想获取多篇新闻文章(基于特定日期或日期范围)。有
我有一个严重的问题:我已经下载了最新版本的 NLTK我得到了一个奇怪的 POS 输出: import nltk import re sample_text="start please with me"
提交此 JSP 时,应要求用户选择除“请选择”之外的其他内容。如果用户选择“请选择”并提交表单,它应该通过弹出窗口提醒用户应该更改该字段。 Please Select
我有一个包含 HTML 表单的页面,一旦用户单击返回的搜索结果列表中的链接,该表单就会提交回自身。一旦他们点击链接,页面就会获取提交的变量,在各种外部 API 上运行一堆搜索,解析一堆数据,并将一堆东
我有一个很长的任务,并且在执行过程中显示“请等待”消息。我使用 SwingWorker 来实现。但有时长任务并不长,所以我想延迟 1 秒显示消息,但我不知道该怎么做。 SwingWorker mySw
我有一个通过 .net Web 服务检查用户名可用性的 Activity ,我需要在调用期间显示“请稍候”消息,因为它可能需要一两秒钟 - 我已经尝试过 AsyncTask 和 Threading,但
我有以下 3 个表: storage ( id, client, cost, -- which have no values col_1, -- which have no values col_2,
我想添加“请选择...”作为组合框中的第一个选项。请参阅下面的代码 - 有什么建议吗? 问候,彼得 "; $sql[0] = 'Please select...'; while ($row = mys
我的表单将运行一些可能需要一段时间才能执行的代码。我想在后台运行操作时显示“请稍候”消息。 我想将该消息保存在一种形式中,我可以从其他形式控制它的可见性以及它的文本。 我还希望将其设置为在 Progr
我想模拟friendlyARM的板子,Mini2440或者mini6410,这样我就可以练习嵌入式编程,QT编程等等,由于一些经济困难和奇怪的进口政策,我的国家。 无论如何,问题是我似乎无法理解进行仿
我有以下 jQuery 函数,它会在用户水平滚动超过 500 像素时触发 aTestEvent(): jQuery(document).scroll(function(){ if(jQuery
我有应用服务器,我使用 Chef + 一些临时 bash 脚本一起引导它们。问题是,当我想在这些应用程序服务器之一上运行更新时,我得到: 19:00:28: *** Please tell me wh
我有这个bootstrap-table数据表,加载完所有数据后,消息继续显示。任何人都知道为什么会这样?提前谢谢你。 Id
我需要在应用程序启动,动画启动以及应用程序更改可见性的生命周期中创建一个“请稍候”窗口。我不想创建明确的新线程(可能是ThreadPool或BackgroundWorker)。 有任何想法吗? 最佳答
我正在使用3rd party库,该库的某些功能需要很长时间才能执行,因此我想在功能繁忙时显示“请稍候”对话框。 通常我会做这样的事情: Thread longTask = new Thread (ne
我想让我的选择器在启动时显示“默认选项”。这意味着:类似“请选择一个选项”。 我尝试使用此短语手动添加选项,但是,这样在选择其他选项后可以重新选择“默认选项”,就像它是真正的选项之一一样。有什么办法可
我一直在努力制作一个模态表单来通知用户等待作业结束。这是我正在尝试做的一个简单示例: unit Unit1; interface uses Winapi.Windows, Winapi.Messa
我是一名优秀的程序员,十分优秀!