【问题标题】:Handling Chromecast load errors in web-based sender处理基于 Web 的发件人中的 Chromecast 加载错误
【发布时间】:2021-02-25 23:38:16
【问题描述】:

基于网络的 Chromecast 发件人的文档说 castSession.loadMedia() 返回一个承诺。因此,我应该能够像这样在异步函数中捕获错误:

const castSession = cast.framework.CastContext.getInstance().getCurrentSession();

const mediaInfo = new chrome.cast.media.MediaInfo(
  'https://example.com/stream.m3u8',
  'application/vnd.apple.mpegurl'
);

const loadRequest = new chrome.cast.media.LoadRequest(mediaInfo);

try {
  await castSession.getSessionObj().loadMedia(loadRequest);
} catch(e) {
  console.error(e);
}

很遗憾,这不起作用。无论我遇到什么加载错误,似乎都发生在下载 HLS 清单和播放之前之间的某个时间。 loadMedia() 承诺成功解决,因此没有要捕获的错误。发件人的开发者控制台报错:

cast_sender.js:85 Uncaught TypeError: d is not a function
    at cast_sender.js:85
    at V.onMessage (cast_sender.js:91)
    at S.h (cast_sender.js:71)
(anonymous) @ cast_sender.js:85
V.onMessage @ cast_sender.js:91
S.h @ cast_sender.js:71

显然,某种错误正在返回给客户端,似乎应该有一些未设置的事件处理程序,但我没有看到任何有关如何捕获错误的文档。

如何在 Chromecast 发送器上捕获媒体加载错误、一般媒体错误和任何其他错误?

【问题讨论】:

    标签: javascript chromecast google-cast google-cast-sdk


    【解决方案1】:

    chrome.cast.Sessioncast.framework.CastSession 是不同的。 CastSession 方法返回承诺,Session 对象与回调一起使用。调用session.loadMedia()时缺少回调导致报错

    在您的情况下,您必须检查 chrome.cast.Session 对象的文档以进行进一步操作,或者通过从您的 CastSession 对象直接调用 loadMedia 来继续您的工作:

    选项 1:继续使用 CastSession 对象:

    try {
      await castSession.loadMedia(loadRequest);
    } catch(e) {
      console.error(e);
    }
    

    选项 2:使用 Session 对象

    try {
      const sessionObj = await castSession.getSessionObj();
      await (new Promise((res) => {
        sessionObj.loadMedia(loadRequest, res);
      }));
    } catch(e) {
      console.error(e);
    }
    

    更多信息:

    https://developers.google.com/cast/docs/reference/chrome/cast.framework.CastSession https://developers.google.com/cast/docs/reference/chrome/chrome.cast.Session

    【讨论】:

    • 成功了!感谢您的信息。您能否澄清一下我什么时候应该使用cast.framework.CastSession,什么时候应该使用chrome.cast.Session?它们看起来相似,但用于不同的目的,我不确定一般应该使用哪个。 (也就是说,我现在了解 API 的区别,但我很好奇这两个类之间的区别是否只是两个不同的 API 用于做同样的事情,或者它们服务于不同的目的,而其中一个恰好使用了 Promises。)任何解释的信息或文档链接都会有所帮助!谢谢。
    • 抱歉,我对发件人或演员不太熟悉。 IMO,虽然演员表对象是核心组件,但CastSession 就像一个带有外观模式的包装器,以提高使用演员表对象的可读性和可用性。您不必担心太多,因为它们在某些方面是可以互换的,只需使用它来完成工作。
    • 好的,听起来不错,谢谢!只要 Stack Overflow 允许,我就会分配积分奖励。我真的很感谢你的帮助!另外,我还发布了其他几个问题...如果您有兴趣,我很想听听您的意见:stackoverflow.com/questions/64829471/…stackoverflow.com/questions/64839760/…
    猜你喜欢
    • 2013-11-16
    • 2016-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多