我正在尝试在服务器上运行的 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 内部,由于某种原因,我无法捕获所需的源。你成功解决问题了吗?