Google Chrome 无头错误“不支持”当使用 getDisplayMedia 尝试从 Puppeteer 中的 Chrome 选项卡录制屏幕时

Hir*_*koo 8 google-chrome headless screen-capture google-chrome-headless puppeteer

我正在使用带有 Chromium 80 的 Puppeteer 最新版本,我正在尝试从 chrome headless 页面录制视频并打开所有这些标志:

{
  headless: true,
  devtools: false,
  args: [
    '--no-sandbox',
    '--allow-insecure-localhost',
    '--enable-usermedia-screen-capturing',
    '--use-fake-ui-for-media-stream', // In headless: false it will capture display rather than tab and in headless: true doesn't work
    '--auto-select-desktop-capture-source=[RECORD]', //[RECORD] is the title of my localhost page trying to screen capture
    '--remote-debugging-port=9222',
    '--window-size=1440,900',
  ],
  ignoreDefaultArgs: [
    '--mute-audio',
    '--disable-media-session-api',
  ]
}
Run Code Online (Sandbox Code Playgroud)

在 Windows 上,如果是headless : false这样,它将捕获 chrome 选项卡(有时会崩溃)。但是,如果这headless : true甚至在 Windows 上,它就会说它是Not supported. 如果--use-fake-ui-for-media-stream标志打开,则是另一回事,无论是headless真是假,它都会捕获我的一个显示。

现在我想在没有显示的 linux 服务器上使用它,我只想让 chromeheadless : true捕获我的 chrome 选项卡。我知道它可以做到这一点,因为我可以headless : true在 DevTools 中看到处于模式下的屏幕。如果它在 DevTools 上创建显示,它必须能够在屏幕截图上创建显示。我想必须在 Puppeteer 上打开其他标志,所以它被允许这样做。我正在使用navigator.mediaDevices.getDisplayMedia以获取屏幕数据。

我也试过这个视频配置,但它不起作用(崩溃),显然只适用于扩展,我需要从后台获取源 ID:

screenStream = await navigator.mediaDevices.getDisplayMedia({
        video: {
            //mandatory: {
            //    chromeMediaSource: 'tab', // Not using this!
            //}
        },
        audio: false
});
Run Code Online (Sandbox Code Playgroud)

有没有人知道Puppeteer也应该考虑哪些标志?

请注意,我不想在我的 chrome headless 中使用 xvfb 和 Selenium (WebDrive) 或任何扩展。

小智 1

这个问题被报告为一个 bug Here,GitHub 上的人们也遇到了同样的问题。这似乎是一个错误,目前尚不清楚他们何时会修复它。

与此同时,您可以使用显然可以在无头和有头模式下工作的puppeteer-video-recorder插件

它可以在无头 Chrome 中录制视频吗?

是的,它确实。

但由于它使用FFMPEG视频的创建似乎很慢。无论如何,我希望你能使用它并且对你有所帮助。