navigator.mediaDevices.getDisplayMedia({audio: true, video: true}) gcloud 上的 docker 内

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

我正在尝试在服务器上运行的 docker 内使用 google meet 视频通话的音频来录制屏幕,显示媒体要么返回 dom 错误,要么什么也不返回。

我知道在无头模式下运行时尝试对 chrome/chromium 使用 getMediaDevices 时存在错误,这就是我在 headfull 模式下使用 chrome 的原因。

有人知道问题可能是什么吗?

谢谢

Dockerfile

FROM debian:bullseye

ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update
RUN apt-get install -y xvfb ffmpeg curl wget gnupg2 apt-utils pulseaudio socat alsa-utils gcc g++ make x264 
    #\ libgles2 libdbus-glib-1-2 libxrandr-dev libxcursor-dev

RUN curl -fsSL https://deb.nodesource.com/setup_16.x | bash -
RUN apt-get install -y nodejs

RUN apt-get install -y chromium
#RUN chromium-browser --product
RUN whereis chromium

RUN adduser root pulse-access

ENV DBUS_SESSION_BUS_ADDRESS="unix:path=/var/run/dbus/system_bus_socket"

RUN mkdir /var/run/dbus
# Moved the lines to run.sh script since the dbus-daemon doens't seem to start when the image loads
# RUN dbus-uuidgen > /etc/machine-id
# RUN dbus-daemon --config-file=/usr/share/dbus-1/system.conf --print-address

RUN rm -rf /var/run/pulse /var/lib/pulse /root/.config/pulse

COPY run.sh /
RUN chmod +x /run.sh

ENV DISPLAY=:1

WORKDIR /usr/src/app
COPY package*.json ./

RUN npm install

COPY . .
EXPOSE 8080

ENTRYPOINT ["sh", "/run.sh"]

运行.sh

#!/bin/sh echo 'Starting DBus...'

dbus-uuidgen > /etc/machine-id dbus-daemon --config-file=/usr/share/dbus-1/system.conf --print-address

echo 'DBUS session address ->' $DBUS_SESSION_BUS_ADDRESS

pulseaudio -D --exit-idle-time=-1 --system --disallow-exit --disallow-module-loading

xvfb-run -s "-screen 0 1920x1080x24 -ac -nolisten tcp -dpi 96 +extension RANDR" node assistant-v2.js

部分.js代码

...
const options = {
    headless: true,
    executablePath: env.CHROME_PATH,
    args: [
        '--use-fake-ui-for-media-stream', // doesn't ask to access the microphone and camera!
        '--disable-web-security',
        '--no-sandbox',
        '--disable-gpu',
        '--enable-webgl-image-chromium',
        '--start-maximized',
        '--start-fullscreen',
        '--enable-webgl-developer-extensions',
        '--enable-webgl-draft-extensions',
        '--use-gl=egl', // removes de gpu graphics errors???
        //'--use-fake-device-for-media-stream' // shows an ugly video as camera input
    ],
    ignoreDefaultArgs: ["--enable-automation"],
    devtools: false,
};

await page.evaluate((env) => {
    ...
    const stream = await navigator.mediaDevices.getDisplayMedia({
        audio: true,
        video: {
            cursor: "never",
            frameRate: parseInt(env.RECORDING_FRAMERATE),
            width: {
                ideal: parseInt(env.RECORDING_WIDTH),
                max: parseInt(env.RECORDING_WIDTH),
            },
            height: {
                ideal: parseInt(env.RECORDING_HEIGHT),
                max: parseInt(env.RECORDING_HEIGHT),
            },
        },
    });
    ...
}, env);

Docker 日志:

Starting DBus...
unix:path=/run/dbus/system_bus_socket,guid=2cfd47617e82651c6157cfd26385eeca
DBUS session address -> unix:path=/var/run/dbus/system_bus_socket
N: [pulseaudio] main.c: Running in system mode, forcibly disabling SHM mode.
PAGE_LOG:  [Report Only] This document requires 'TrustedScript' assignment.
PAGE_LOG:  [Report Only] This document requires 'TrustedScript' assignment.
....
Joined meeting!
Error: Evaluation failed: DOMException: Could not start video source
    at ExecutionContext._ExecutionContext_evaluate (/usr/src/app/node_modules/puppeteer-core/lib/cjs/puppeteer/common/ExecutionContext.js:229:15)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
    at async ExecutionContext.evaluate (/usr/src/app/node_modules/puppeteer-core/lib/cjs/puppeteer/common/ExecutionContext.js:107:16)
    at async /usr/src/app/assistant-v2.js:246:13

如果我在 puppeteer 选项中启用

'--use-fake-device-for-media-stream'
,它会获取视频流,但仅限于假设备媒体流:

以下是带有

--use-fake-device-for-media-stream enabled
的日志:

PAGE_LOG:  video track id:  8a4da4d8-ce87-4535-8bf6-0c12b85f353f 
PAGE_LOG:  video track kind:  video 
PAGE_LOG:  video track kind:  screen:-3:0 
PAGE_LOG:  audio track id:  6e68abab-6202-48de-ae5c-05dcd81fe208 
PAGE_LOG:  audio track kind:  audio
docker puppeteer gcloud
1个回答
0
投票

我遇到了同样的问题。在单独的虚拟机上,记录可以工作,但在 Docker 内部,由于某种原因,我无法捕获所需的源。你成功解决问题了吗?

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