Chrome屏幕共享获取监控信息

问题描述 投票:1回答:2

我实现了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"获取监控信息吗?

google-chrome-extension
2个回答
1
投票

你是对的。您可以添加system.display权限并调用chrome.system.display.getDisplayLayout(callbackFuncion(DisplayLayout))并处理回调中的DisplayLayout.position以获取布局,并使用chrome.system.display.getInfo处理回调中的displayInfo数组。你应该寻找'isPrimary'的价值


1
投票

这是一个为期一年的问题,但是我遇到了相同的信息后才发现它,我终于想出了如何确定用户在Chrome中选择用于屏幕共享的显示器。

首先:此信息不会来自您在Chrome中为屏幕共享而构建的扩展程序,因为:

  • chrome.desktopCapture.chooseDesktopMedia API回调只返回一个sourceId,它是一个表示流ID的字符串,然后您可以使用它来调用getMediaSource API来构建媒体流。
  • chrome.system.display.getInfo将为您提供显示列表,是的,但是从该信息中您无法分辨哪一个被共享,并且无法将sourceId与为每个显示返回的任何字段相匹配。

所以...我发现的解决方案来自MediaStream对象本身。一旦你有了流,在调用getMediaSource后,你需要获得视频轨道,在那里你会找到一个名为“label”的属性。此标签可让您了解用户选择的屏幕。

您可以使用以下内容获取视频轨道:

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中,它们显示为“Screen i”:

video track (Firefox)


此外,如果您查看Chrome chrome://webrtc-internals,您会看到这是他们在addStream事件中显示的内容:

Chrome webrtc-internals addStream event


就是这样!这不是理想的,因为这是一个标签,不仅仅是一个真正的屏幕标识符,但是,这是一个可以使用的东西。确定屏幕后,您可以在Chrome中使用chrome.system.display.getInfo获取该显示的信息。

© www.soinside.com 2019 - 2024. All rights reserved.