捕获屏幕 -- chrome.desktopCapture.chooseDesktopMedia 失败 -- PNacl扩展

3
我正在尝试以以下方式使用 desktopCapture API
chrome.desktopCapture.chooseDesktopMedia(
            ["screen", "window"], onAccessApproved);

当我设置断点并检查时,chrome.desktopCapture显示为未定义。我的清单文件中的权限如下:

"permissions": ["desktopCapture", "notifications" ]

此API失败的常见原因在此处列出:

  • 应用程序的manifest.json文件中缺少权限
  • API定义在比当前运行时更高版本的Chrome上,文档继承自ChromeApi

但我没有这些问题。

  • 我的Chrome版本是43.0.2357.124 m
  • Pepper版本是43

顺便提一下,我正在尝试开发一个使用PNacl捕获屏幕的Chrome扩展,并从此处下载的media_stream_video示例中借鉴了一些内容。但我甚至还没有发送消息到pexe端,我仍然卡在chrome.desktopCapture.chooseDesktopMedia返回undefined的地方。


发生了什么事 - 错误信息,流无效? - Amit G
另一种捕获当前可见选项卡的方法 https://developer.chrome.com/extensions/tabs#method-captureVisibleTab - Amit G
控制台中记录的确切错误是-- “Uncaught TypeError: Cannot read property 'chooseDesktopMedia' of undefined”基本上,这个语句不起作用 'chrome.desktopCapture.chooseDesktopMedia( "screen", "window"], onAccessApproved);'因为chrome.desktopCapture显示为未定义。从这可以感觉到捕获屏幕“desktopCapture”的权限尚未被授予。 - jster
@AmitG - 从captureVisibleTab的描述来看,它似乎用于图像捕获。我正在尝试录制屏幕并将其保存到Chrome文件中(我知道我无法从扩展访问本地文件系统,但我可以存储到“Chrome文件”)。 - jster
1
你忘了另一个失败条件。大多数API无法从内容脚本中使用。这是你的问题吗?此外,你的问题与NaCl方面没有任何关系,你可能需要将其删除,因为它不相关。 - Xan
嗨@Xan,你确定这与NacL无关吗?我问的原因是: 1.测试原始desktopCapture示例。 2.添加pexe文件- makefile、media_stream_video.cc、common.js 3.修改index.html以包含common.js然后调用 chrome.desktopCapture.chooseDesktopMedia 就停止工作了。修改后的代码在这里 - jster
1个回答

1
你需要在扩展程序的后台脚本中调用chrome.desktopCapture.chooseDesktopMedia这个示例展示了一个简单的方法来使用该扩展程序获取屏幕媒体。
请记住,这是基于回调的,所以你可以从回调中访问流ID。
这在你的页面上下文中运行(完整示例在这里):
    // check that the extension is installed
    if (sessionStorage.getScreenMediaJSExtensionId) {
        // send a message to your extension requesting media
        chrome.runtime.sendMessage(sessionStorage.getScreenMediaJSExtensionId,
            {type:'getScreen', id: 1}, null,
            function (data) {
                if (data.sourceId === '') { // user canceled
                    // handle error
                } else {
                    constraints.video.mandatory.chromeMediaSourceId = data.sourceId;
                    getUserMedia(constraints, callback);
                }
            }
        );
    }

这将在您的扩展上下文中运行(完整示例请参见此处):

chrome.runtime.onMessageExternal.addListener(function (message, sender, callback) {
    switch(message.type) {
        case 'getScreen':
            var pending = chrome.desktopCapture.chooseDesktopMedia(message.options || ['screen', 'window'],
                                                               sender.tab, function (streamid) {
                // communicate this string to the app so it can call getUserMedia with it
                message.type = 'gotScreen';
                message.sourceId = streamid;
                callback(message);
                return false;
            });
            return true; // retain callback for chooseDesktopMedia result
    }
});

谢谢,我会尝试。顺便说一下,这是我开始使用的原始示例。这是我的修改后的代码。我的修改如下:
  1. 测试了原始的desktopCapture...运行良好。
  2. 添加了- common.jsbackground.jsmedia_stream_video.ccMakefile
  3. index.html中添加了<script src="common.js"></script>
这就是我所做的,然后调用chrome.desktopCapture.chooseDesktopMedia(["screen", "window"], onAccessApproved);就停止工作了。
- jster
这仍然无法正常工作,如果 iFrame 尝试共享桌面。 - user285594
@jster,你介意分享一下你得到的最终代码吗?我已经卡了一个星期,试图构建一个原型来实现所描述的功能。 - Mohammad Abu Musa
如果您只想捕获桌面作为图像,是否有更简单的方法来实现?https://developer.chrome.com/extensions/tabCapture#type-CaptureOptions始终可用,但这仅适用于Chrome 选项卡 - Diode Dan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接