如何分享&;来自主机上Chromium和docker容器中Chromium的/dev/videoX设备的WebRTC流 环境 运行Ubuntu 14.04.5 LTS的主机 Docker版本17.09.0-ce,构建afdb6d4 铬62.0.3202.89 2个网络摄像头:/dev/video0,/dev/video1 摄像机

如何分享&;来自主机上Chromium和docker容器中Chromium的/dev/videoX设备的WebRTC流 环境 运行Ubuntu 14.04.5 LTS的主机 Docker版本17.09.0-ce,构建afdb6d4 铬62.0.3202.89 2个网络摄像头:/dev/video0,/dev/video1 摄像机,docker,webrtc,ubuntu-14.04,dockerfile,chromium,Docker,Webrtc,Ubuntu 14.04,Dockerfile,Chromium,我需要将Ubuntu 14.04主机上的网络摄像头共享到Ubuntu 16.04docker容器中,并能够获取视频流(WebRTCgetUserMedia)从主机和容器上运行的每个chromium实例上的每个摄像头,或从2个单独的docker容器上运行的每个chromium实例 要测试getUserMedia,我浏览到 及 如何繁殖 Dockerfile 码头工人整理 其他尝试与 及 导致同样的事情,一旦一个摄像头开始流,另一个就不能 在docker容器中启动铬 结果 使用=>失败

我需要将
Ubuntu 14.04
主机上的网络摄像头共享到
Ubuntu 16.04
docker容器中,并能够获取视频流(WebRTC
getUserMedia
)从主机和容器上运行的每个chromium实例上的每个摄像头,或从2个单独的docker容器上运行的每个chromium实例

要测试
getUserMedia
,我浏览到


如何繁殖 Dockerfile 码头工人整理 其他尝试与 及

导致同样的事情,一旦一个摄像头开始流,另一个就不能

在docker容器中启动铬 结果 使用=>失败

如果我关闭
chromiu-video1
,则
chromiu-video0
会在浏览器刷新后流式播放视频(?)

已从web控制台尝试
getUserMedia

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

但是在关闭chromium streaming
/dev/video1
之后,现在
/dev/video0
是可读的。
getUserMedia
命令解析,摄像机从
/dev/video0

他们没有访问同一设备。我登记了
chrome://media-internals

使用作品!!!!!?!?!?! 相反,当使用它时,我们可以看到两个凸轮的流。我相信那个特定的站点仍然在使用
URL.createObjectURL

图像 在主机上打开同一URL的Chromium浏览器 :(我收到了错误消息

NotReadableError

关于如何配置我的docker容器以允许一个cam分配给主机,而另一个专用于docker容器的任何指针

有趣的线索
  • 指出这可能是因为相机被其他应用程序使用

  • 有趣的是,当我在主机上打开两个Chromium实例(这次没有容器)指向同一个摄像头测试页面(
    getUserMedia
    ),它确实能够将相同的视频流传输到2个Chromium实例。当我尝试从一个容器访问时,它会发生冲突。它可以播放其中一个,但不能同时播放。因此,它可能需要在docker容器上进行配置。不过,我还是想了解为什么会发生这种情况

更新 码头工人日志 解决了这个问题,读了这个

尝试按照下面的评论中的建议共享
设备
,但无效

- /dev/video1:/dev/video1:rm 
- /dev/video1:/dev/video1:r  
- /dev/video1:/dev/video1:rw
问题
  • 当摄像头被访问并开始流媒体时会发生什么?是否创建了锁定文件以及在何处创建了锁定文件?但是请注意,我并没有访问同一台摄像头
在我正在共享的卷部分

- /tmp/.X11-unix:/tmp/.X11-unix
- ~/.Xauthority:/.Xauthority:ro
- /var/run/dbus/system_bus_socket:/var/run/dbus/system_bus_socket

我不认为这些文件是问题所在,但仍在调查

如果您只需要单独的Chrome会话,您只需从以下内容开始:

chromium-browser --user-data-dir=/tmp/chrome1 
另一个例子是

chromium-browser --user-data-dir=/tmp/chrome2
Docker只是一种记录和重复设置特定环境的方法。它添加的附加安全层非常小,特别是在您传递额外权限的情况下,尤其是与Chrome经过良好测试的安全性相比

如果需要更多的隔离,可以创建单独的用户:

 # run these lines individualy, just press Enter for everything, don't set passwords for them, they won't be able to log in. 
 sudo adduser chrome1
 sudo adduser chrome2 

 # if you want to give each access to only one of the cams you can try this
 sudo chown chrome1:chrome1 /dev/video0 
 sudo chown chrome2:chrome2 /dev/video1
 # keeping in mind unplugging and replugging the camera might reset the permissions unless you update the relevant /etc files

 # to allow anyone to use your X
 xhost +

 # run the two separate browsers
 sudo su - chrome1 -c chromium-browser & 
 sudo su - chrome2 -c chromium-browser &

你试过在容器中安装整个
/dev
吗?你是怎么做到的?我使用了
特权
选项,这是等效的。你可以自己尝试使用我的
Dockerfile
docker compose.xml
。你会看到一旦容器启动,
/dev
就可以访问了……对吗?@zabumba,可以您尝试使用
-/dev/video1:/dev/video1:rm
-/dev/video1:/r
-/dev/video1:/dev/video1:rw
,看看这是否有帮助?我认为可能发生的情况是,连接到容器的设备具有排他性help@zabumba,我想你应该向docker提出一个问题。什么这里可能发生的情况是设备被docker锁定,不允许与其他东西共享。这可能是一个bug(根据您)和一个限制(根据docker)我需要
/dev/video0
一个chromium上可用的cam和
/dev/video1
另一个chromium上可用的cam,但我不希望chromium的两个实例都能访问两个cam。我不明白。
添加用户
目的和目的是什么?thx抱歉,我无意中点击了,你尝试过类似的东西吗:sudo adduser-D chrome1;sudo adduser-D chrome2;sudo chown chrome1:chrome1/dev/video0;sudo chown chrome2:chrome2/dev/video1;sudo su-chrome1-c chromium browser&sudo su-chrome2-c chromium browser&sudo su-chrome2-c chromium browser创建2个用户并相应地设置
/dev/videoX
上的权限。是的!有趣的主意!我会尝试。如果他们要去的话,你如果你在Ubuntu、Debian或Arch上,你希望他们在重新插入时拥有正确的权限,你必须创建如下文件:-ie.KERNEL==“video0”,SUBSYSTEM==“video4linux”,SUBSYSTEM==“usb”,ATTRS{idVendor}==“05a9”,ATTRS{idProduct}==“4519”,SYMLINK+=“video-cam1”,OWNER=“chrome1”,GROUP=“chrome1”(附加所有者和组)并更改第二行…插入相应设备后,您可以从“dmesg”或从/sys获取供应商和产品id
 navigator.mediaDevices.getUserMedia({audio: true, video: true})
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
chromium_video1  | libGL error: failed to open drm device: No such file or directory
chromium_video1  | libGL error: failed to load driver: i965
chromium_video0  | libGL error: failed to open drm device: No such file or directory
chromium_video0  | libGL error: failed to load driver: i965
- /dev/video1:/dev/video1:rm 
- /dev/video1:/dev/video1:r  
- /dev/video1:/dev/video1:rw
- /tmp/.X11-unix:/tmp/.X11-unix
- ~/.Xauthority:/.Xauthority:ro
- /var/run/dbus/system_bus_socket:/var/run/dbus/system_bus_socket
chromium-browser --user-data-dir=/tmp/chrome1 
chromium-browser --user-data-dir=/tmp/chrome2
 # run these lines individualy, just press Enter for everything, don't set passwords for them, they won't be able to log in. 
 sudo adduser chrome1
 sudo adduser chrome2 

 # if you want to give each access to only one of the cams you can try this
 sudo chown chrome1:chrome1 /dev/video0 
 sudo chown chrome2:chrome2 /dev/video1
 # keeping in mind unplugging and replugging the camera might reset the permissions unless you update the relevant /etc files

 # to allow anyone to use your X
 xhost +

 # run the two separate browsers
 sudo su - chrome1 -c chromium-browser & 
 sudo su - chrome2 -c chromium-browser &