环境
- 运行 Ubuntu 14.04.5 LTS 的主机
- Docker 版本 17.09.0-ce,构建 afdb6d4
- 铬62.0.3202.89
- 2 个网络摄像头:
/dev/video0
,/dev/video1
相机
# v4l2-ctl --list-devices
Venus USB2.0 Camera (usb-0000:00:1a.0-1.2.2):
/dev/video1
USB 2.0 Camera (usb-0000:00:1a.0-1.3):
/dev/video0
我需要分享网络摄像头Ubuntu 14.04
主持人到Ubuntu 16.04
码头集装箱并能够getUserMedia
从分别在主机和容器上运行的每个 chromium 实例上的每个摄像头获取视频流 (WebRTC )。
为了测试getUserMedia
,我正在浏览https://www.onlinemictest.com/webcam-test/
如何重现
Dockerfile
Dockerfile
FROM ubuntu:16.04
# Install chromium
RUN apt-get update \
&& apt-get install sudo chromium-browser alsa-base -y \
&& rm -rf /var/lib/apt/lists/*
# Create a normal user to run chromium as
RUN useradd --create-home browser \
&& adduser browser video \
&& adduser browser audio \
&& usermod -aG sudo browser
USER browser
WORKDIR /home/browser
CMD ["/usr/bin/chromium-browser"]
docker-compose up
$ more docker-compose.yml
version: '3'
services:
chromium:
build:
context: .
dockerfile: Dockerfile
image: ubuntu-cr:0.1
privileged: true
environment:
DISPLAY: $DISPLAY
XAUTHORITY: /.Xauthority
volumes:
- /tmp/.X11-unix:/tmp/.X11-unix
- ~/.Xauthority:/.Xauthority:ro
1. 在docker容器中启动Chromium
export DISPLAY=:0.0
docker-compose up
图片
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu-cr 0.1 a61f5506b1f9 9 minutes ago 764MB
ubuntu 16.04 747cb2d60bbe 2 months ago 122MB
hello-world latest 05a3bd381fc2 3 months ago 1.84kB
2. 当 Chromium 在 docker 容器中打开时,浏览到https://www.onlinemictest.com/webcam-test/
伟大的!我可以从我的相机中看到视频流!
3. 打开 Chromium 浏览器并访问相同的 URL主持人
:( 我收到错误消息
相机未授权。请检查您的媒体权限设置
如果我首先在主机上启动 Chromium 并浏览到相机测试页面以获取视频流 ( getUserMedia
),我会收到相同的错误。当我按顺序在容器中运行 Chromium 时,我收到相同的错误消息,该消息对应于NavigatorUserMediaError
> TrackStartError
。
我从 Chromium 控制台尝试过
navigator.mediaDevices.getUserMedia({audio: true, video: true})
它给了我一个TrackStartError
已经在另一个 Chromium 实例上运行的 cam 测试。
有关如何配置我的 docker 容器以允许将一个摄像头分配给主机而另一个摄像头专用于 docker 容器的任何指示?
有趣的话题
NotReadableError:无法分配视频源指出发生这种情况可能是因为相机被另一个应用程序使用。
有趣的是,当我在主机上打开 2 个 Chromium 实例(这次没有容器)并指向同一个摄像头测试页面 (
getUserMedia
) 时,它确实设法将相同的视频流获取到 2 个 Chromium 实例。那是当我尝试从发生冲突的容器进行访问时。它可以播放其中之一,但不能同时播放。所以它可能是在 docker 容器上配置的东西。仍然尝试理解为什么会发生这种情况。