electron [Bug]:在macOS上使用getUserMedia而不带chromeMediaSourceId记录多个屏幕错误

yuvru6vn  于 4个月前  发布在  Electron
关注(0)|答案(9)|浏览(80)

预检清单

Electron 版本

25.1.0

您正在使用的操作系统是什么?

macOS

您正在使用的操作系统版本是什么?

macOS 14.0 beta(在 13.4 中也可以重现)

您正在使用的架构是什么?

x64

最后已知的工作 Electron 版本

N/A

预期行为

我编写了一个函数,将整个桌面记录在一个 render.ts 文件中,该文件加载在一个窗口中。
此函数具有 chromeMediaSource 参数(不包括 chromeMediaSourceId)。
这可以正常工作并记录屏幕。所有屏幕都应该被记录。

实际行为

在 macOS 上,当主屏幕在右侧,第二屏幕在左侧时,某些第二屏幕的某些区域无法正确记录,主屏幕也无法正确记录(将屏幕上的应用程序移动以查看此现象)。如果使用 sidecar 通过 iPad 连接,iPad 屏幕将永远不会被记录。
这个问题在 Windows 上无法重现,并且在约束 chromeMediaSourceId 时记录工作正常。
主屏幕:1920 x 1080
第二屏幕:2560 x 1440

测试用例 Gist URL

  • 无响应*

其他信息

所有功能都在 html 代码中:
`

<head>
<meta charset="utf-8">
<title>apegv2-browser-welcome</title>
</head>

<body>
    <script type="text/javascript">
        var lastScreenStream = null;

        openScreen = async () => {
            try {
                if (lastScreenStream) {
                    return;
                }

                lastScreenStream = lastScreenStream = await navigator.mediaDevices.getUserMedia({
                    video: {
                        mandatory: {
                            chromeMediaSource: 'desktop',
                            maxFrameRate: 10,
                        },
                    }
                });

                const screen = document.getElementById('screen');
                let screenElement = null;
                if (screen && screen instanceof HTMLVideoElement) {
                    screenElement = screen;
                    screenElement.srcObject = lastScreenStream;
                    screenElement.width = 1920;
                    screenElement.height = 1080;
                }
            } catch (e) {
                closeScreen();
            }
        }

        closeScreen = async () => {
            try {
                if (lastScreenStream) {
                    lastScreenStream.getTracks().forEach(track => track.stop());
                    lastScreenStream = null;
                    const screen = document.getElementById('screen');
                    let screenElement = null;
                    if (screen && screen instanceof HTMLVideoElement) {
                        screen.srcObject = null;
                        screen = null;
                    }
                }
            } catch (e) {
            }
        }
    </script>

    <button type="button" onclick="openScreen()">open screen sharing</button>
    <button type="button" onclick="closeScreen()">close screen sharing</button>

    <div>
        <video id="screen" autoPlay muted playsInline />
    </div>
</body>

`

5cnsuln7

5cnsuln71#

你好,@chinaofmelon。感谢你报告这个问题并帮助让Electron变得更好!

是否有可能为你制作一个独立的测试用例,只包含重现问题的必要代码?例如,Electron Fiddle是一个制作小型测试用例的很好工具,它可以轻松地将你的测试用例发布到一个gist中,Electron维护者可以使用。

独立的测试用例可以让修复问题更加顺利:它确保每个人都在查看同一个问题,它从方程中删除了所有不必要的变量,而且它还可以为自动化回归测试提供基础。

现在为了这个原因添加了blocked/need-repro标签。在你制作了一个测试用例后,请在后续评论中链接到它。如果上述内容没有得到解决,这个问题将在10天内关闭。

wgeznvg7

wgeznvg73#

有任何更新吗?

mpbci0fu

mpbci0fu4#

此外,在没有chromeMediaSourceId约束的情况下,我只能录制主屏幕(将两个屏幕连接到Macbook)。这个问题发生在2022年MacBook Air M2(14.0 beta)上。

u0sqgete

u0sqgete5#

我正在使用MacOS 14.0 (23A344)和electron 27.0.0遇到相同的问题。从desktopCapturer.getSources传递到chromeMediaSourceIdscreen:1:0screen:2:0会导致Uncaught DOMException: Could not start video source错误。除了electron窗口本身之外,使用任何其他窗口都会抛出相同的错误。

如果不向GUM传递任何chomeMediaSourceId,Electron应用程序窗口本身会返回一个有效的流,主显示流也是可见的。

请electron团队关注这个问题,因为Sonoma的大规模采用将会跟进。如果我得到这样的关注,我很愿意合作。

wyyhbhjk

wyyhbhjk6#

这个问题已经被自动标记为过时。如果这个问题仍然影响到你,请留下任何评论(例如“提升”),我们会保持开放。如果你有任何新的附加信息——特别是,如果这个问题在 latest version of Electronbeta 中仍然可复现——请在你的评论中包含它!

eivgtgni

eivgtgni7#

同样的问题,Electron 28.1.4
chromeMediaSource: 'desktop' "可以工作",但它只显示桌面背景和我的应用程序窗口的冻结图片,但屏幕上没有其他窗口(甚至菜单项),好像需要一些权限才能“看到”其他窗口??视频流中只有光标在移动,但其他所有东西都似乎被冻结了
设置 chromeMediaSourceId: 'screen:1:0' (来自 desktopCapturer.getSources )导致 DOMException: Could not start video source

mgdq6dx1

mgdq6dx18#

这个问题的翻译是:同样的问题,只要'chromeMediaSourceId'存在,就会得到一个错误:'DOMException: 无法启动视频源'。

dxxyhpgq

dxxyhpgq9#

这个问题已经被自动标记为过时。如果这个问题仍然影响到你,请留下任何评论(例如“提升”),我们会保持开放。如果你有任何新的附加信息——特别是,如果这个问题在 latest version of Electronbeta 中仍然可重现——请在你的评论中包含它!

相关问题