如何从主机上的Chromium和Docker容器中的Chromium从/ dev / videoX设备共享和stream式传输

环境

  • 主机运行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 泊坞窗容器,并且能够从主机和容器上分别运行的每个铬实例上的每个摄像头获取videostream(WebRTC getUserMedia )。

要testinggetUserMedia ,我正在浏览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工人组成

 $ 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 

2.在Docker容器中打开Chromium时,浏览至https://www.onlinemictest.com/webcam-test/

大! 我可以看到我的相机的videostream!

3.将Chromium浏览器打开到主机上的相同URL

:(我收到错误消息

相机未经授权。 请检查您的媒体权限设置

如果我先在主机上启动Chromium并浏览到相机testing页以获取videostream( getUserMedia ),则会出现相同的错误。 当按顺序运行容器中的Chromium时,我得到相同的ERROR消息,对应于NavigatorUserMediaError > TrackStartError

我尝试从Chromium控制台

navigator.mediaDevices.getUserMedia({audio: true, video: true})

当camtesting已经在另一个Chromium实例上运行时,它给了我一个TrackStartError

任何关于如何configuration我的docker集装箱的指针允许一个凸轮分配给主机,而另一个专用于docker集装箱?

有趣的线程

  • NotReadableError:由于相机被其他应用程序使用而无法分配video源点,因此可能会发生这种情况。

  • 有趣的是,当我在主机上打开2个Chromium实例(这次没有容器)时,指向同一个相机testing页面( getUserMedia ),它确实设法获取相同的videostream到2个Chromium实例。 那是当我尝试从容器中访问它的冲突。 它可以播放任何一个,但不能同时播放。 所以这可能是在Docker容器上configuration的东西。 不过,要弄清楚为什么会发生这种情况。