获取 Chromecast 接收器的实际宽度 UI

Getting actual width of Chromecast receiver UI

我将第二代 Chromecast 连接到显示器。我从 Chromecast 接收 1080p60。

Cast documentation 在几个地方指出 UI 的分辨率为 720p:

While Chromecast displays the receiver page on a 720p graphics plane, other Cast platforms including Android TV may display the page up to 1080p.

还有,关于 media formats 的注释:

Images have a display size limitation of 720p (1280x720). Images should be optimized to 1280x720 or less to avoid scaling down on the receiver device.

确实,如果你在接收器应用程序上打开调试控制台,你可以看到 window.innerWidth1280window.innerHeight720

这让我相信视频是硬件解码到它自己的层,直接到视频输出,并且 browser-based UI 以较低的分辨率呈现并覆盖在它上面.但是后来,我在 DOM 本身中看到了 <video> 元素,想知道它是如何工作的。有那么一瞬间,我以为它可能在控制一些后台硬件播放器,但是这个视频可以用CSS来操作,所以没有任何意义。

我在网络上添加了一张 1920x1080 的测试图像 UI 并进行了捕捉。

我不确定这是否会出现在 Stack Overflow 的图像视图中,但测试图像非常完美。我可以看到每一行,这意味着图像实际上是以 1920x1080 分辨率显示的。

因此,文档似乎并没有说明全部情况。 UI 实际上是以输出分辨率呈现的……在我的例子中是 1920x1080。但它使用 1280x720 的虚拟像素大小。我宁愿访问完整分辨率,所以我添加了适当的视口元标记,就像我在移动设备上所做的那样:

<meta name="viewport" content="width=device-width, initial-scale=1" />

很遗憾,这没有效果!视口仍然是 1280x720,即使它在现实中以更高分辨率渲染。

有什么解决办法吗?

必须获得接收器分辨率,发现 cast.framework.CastReceiverContext.getInstance().canDisplayType 实际上考虑了当前输出分辨率。

这是我获取视频输出的当前显示分辨​​率的快速丑陋技巧。

(() => {
var x = 0, y = 1, i = cast.framework.CastReceiverContext.getInstance();
while(i.canDisplayType("video/mp4", "", ++x, y));
x--;
while(i.canDisplayType("video/mp4", "", x,++y));
y--;
return {width: x, height: y};
})()

这显然可以通过预定义的分辨率或一些二进制搜索变得更漂亮。

欢迎 post 更好的解决方案。 :)