Chrome屏幕共享获取监控信息

时间:2017-07-24 06:28:47

标签: google-chrome-extension

我实施了Chrome扩展程序,使用chrome.desktopCapture.chooseDesktopMedia来检索屏幕ID。 这是我的后台脚本:

chrome.runtime.onConnect.addListener(function (port) {
    port.onMessage.addListener(messageHandler);

    // listen to "content-script.js"
    function messageHandler(message) {
        if(message == 'get-screen-id') {
            chrome.desktopCapture.chooseDesktopMedia(['screen', 'window'], port.sender.tab, onUserAction);
        }
    }

    function onUserAction(sourceId) {

        //Access denied
        if(!sourceId || !sourceId.length) {
            return port.postMessage('permission-denie');
        }

        port.postMessage({
            sourceId: sourceId
        });
    }
});

我需要获得共享的显示器信息(分辨率,横向或纵向)。

我的问题是:如果客户使用多台显示器,我如何确定他选择的显示器? 我可以添加例如" system.display"我的扩展程序的权限,并从"chrome.system.display.getInfo"获取监控信息?

2 个答案:

答案 0 :(得分:1)

你是对的。您可以添加system.display许可和呼叫chrome.system.display.getDisplayLayout(callbackFuncion(DisplayLayout))和处理DisplayLayout.position回调获得的布局和chrome.system.display.getInfo处理displayInfo的阵列在回调中。你应该寻找' isPrimary'值

答案 1 :(得分:1)

这是一个古老的问题,但是由于遇到了同样的信息,所以我碰到了这个问题,我终于设法弄清楚了如何识别用户选择哪个监视器在Chrome中进行屏幕共享。

首先:此信息不会来自您可能在Chrome中用于屏幕共享的扩展程序,因为:

  • chrome.desktopCapture.chooseDesktopMedia API回调仅返回一个sourceId,这是一个表示流ID的字符串,然后可以用来调用getMediaSource API来构建媒体流。
  • chrome.system.display.getInfo将为您提供显示列表,是的,但是从该信息中您无法确定正在共享哪个显示,并且无法将sourceId与任何显示进行匹配每次显示返回的字段数。

所以... 我找到的解决方案来自MediaStream对象本身。获得流之后,在调用getMediaSource之后,您需要获取视频轨道,然后在其中找到一个名为“标签”的属性。该标签使您可以了解用户选择了哪个屏幕。

您可以通过以下方式获得视频轨道:

const videoTrack = mediaStream.getVideoTracks()[0];

(在此处检查getVideoTracks API:https://developer.mozilla.org/en-US/docs/Web/API/MediaStream/getVideoTracks)。

如果您打印该对象,则将看到“标签”字段。在Chrome中,屏幕1显示为“ 0:0”,而屏幕2显示为“ 1:0”,并且我假设屏幕i将为“ i-1:0”(我只测试了2个屏幕)。 这是在控制台中打印的该对象的捕获:

video track (Chrome)


不仅适用于Chrome,而且适用于其他实现该功能的浏览器!在Firefox中,它们显示为“屏幕i”:

video track (Firefox)


此外,如果您检查Chrome浏览器chrome://webrtc-internals,则会看到它们在addStream事件中显示的内容:

Chrome webrtc-internals addStream event


就是这样!这不是理想的,因为它是标签,而不是真实的屏幕标识符,但是可以使用。识别完屏幕后,您就可以在Chrome中使用chrome.system.display.getInfo来获取该显示的信息。