我实现了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"
获取监控信息吗?
你是对的。您可以添加system.display权限并调用chrome.system.display.getDisplayLayout(callbackFuncion(DisplayLayout))并处理回调中的DisplayLayout.position以获取布局,并使用chrome.system.display.getInfo处理回调中的displayInfo数组。你应该寻找'isPrimary'的价值
这是一个为期一年的问题,但是我遇到了相同的信息后才发现它,我终于想出了如何确定用户在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个屏幕)。以下是控制台中打印的对象的捕获:
它不仅适用于Chrome,也适用于实现它的其他浏览器!在Firefox中,它们显示为“Screen i”:
此外,如果您查看Chrome chrome://webrtc-internals
,您会看到这是他们在addStream
事件中显示的内容:
就是这样!这不是理想的,因为这是一个标签,不仅仅是一个真正的屏幕标识符,但是,这是一个可以使用的东西。确定屏幕后,您可以在Chrome中使用chrome.system.display.getInfo
获取该显示的信息。