Comment partager & WebRTC stream à partir de/dev / videox device à partir D'un Chrome sur l'hôte et de Chrome dans un conteneur docker
environnement
- Host running Ubuntu 14.04.5 LTS
- Docker version 17.09.0 - ce, build afdb6d4
- Chrome 62.0.3202.89
- 2 webcams:
/dev/video0
,/dev/video1
Caméras
# 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
je dois partager les webcams sur Ubuntu 14.04
hôte au Ubuntu 16.04
Docker container et être en mesure d'obtenir les flux vidéo (WebRTC getUserMedia
) de chaque caméra sur chaque instance de chrome tournant respectivement sur l'hôte et le conteneur ou sur 2 conteneurs docker séparés.
pour tester le getUserMedia
, je navigue vers
- https://www.onlinemictest.com/webcam-test / et
- https://webrtc.github.io/samples/src/content/getusermedia/gum /
comment se reproduire
Dockerfile
FROM ubuntu:16.04
# Install chromium
RUN apt-get update
&& apt-get install sudo chromium-browser alsa-base alsa-utils alsa-oss -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
ENTRYPOINT ["/usr/bin/chromium-browser", "--use-fake-ui-for-media-stream", "--disable-infobars", "--allow-running-insecure-content", "--ignore-certificate-errors"]
CMD ["https://www.stackoverflow.com/"]
docker-composer
$ more docker-compose.yml
version: '3'
services:
chromium_video1:
build:
context: .
dockerfile: Dockerfile
image: ubuntu-cr:0.1
# privileged: true # then you don't need the devices section
# Pass the URL as an argument (CMD) to ENTRYPOINT in the Dockerfile
#command: ["https://www.onlinemictest.com/webcam-test/"] # WORKS
command: ["https://webrtc.github.io/samples/src/content/getusermedia/gum/"] # FAILS
environment:
#DISPLAY: $DISPLAY
DISPLAY:
XAUTHORITY: /.Xauthority
devices:
- /dev/video1
- /dev/dri
# - /dev/snd
volumes:
- /tmp/.X11-unix:/tmp/.X11-unix
- ~/.Xauthority:/.Xauthority:ro
- /var/run/dbus/system_bus_socket:/var/run/dbus/system_bus_socket
cap_add:
- SYS_ADMIN
chromium_video0:
build:
context: .
dockerfile: Dockerfile
image: ubuntu-cr:0.1
# privileged: true
# Pass the URL as an argument (CMD) to ENTRYPOINT in the Dockerfile
#command: ["https://www.onlinemictest.com/webcam-test/"]
command: ["https://webrtc.github.io/samples/src/content/getusermedia/gum/"]
environment:
DISPLAY:
XAUTHORITY: /.Xauthority
devices:
- /dev/video0
- /dev/dri
# - /dev/snd
volumes:
- /tmp/.X11-unix:/tmp/.X11-unix
- ~/.Xauthority:/.Xauthority:ro
- /var/run/dbus/system_bus_socket:/var/run/dbus/system_bus_socket
cap_add:
- SYS_ADMIN
essais supplémentaires avec
command: ["https://appear.in/hello"]
et
command: ["https://test.webrtc.org/"]
mène à la même chose, une fois qu'une caméra commence à diffuser l'autre ne peut pas
Démarrer Chrome dans les conteneurs docker
export DISPLAY=:0.0
docker-compose up
résultats
par https://webrtc.github.io/samples/src/content/getusermedia/gum / = > échoue
si je ferme chromium_video1
, puis chromium_video0
diffuse la vidéo après un rafraîchissement du navigateur (?).
essayé getUserMedia
de la console web:
navigator.mediaDevices.getUserMedia({audio: true, video: true})
mais après la fermeture de Chromium streaming /dev/video1
, maintenant /dev/video0
est lisible. La commande getUserMedia
se résout et la caméra diffuse la vidéo de /dev/video0
ils n'ont pas accès au même appareil. J'ai vérifié dans chrome://media-internals
par https://www.onlinemictest.com/webcam-test / WORKS!!!!!?!?!?!
en utilisant https://www.onlinemictest.com/webcam-test / au lieu de cela, cela fonctionne, nous pouvons voir des flux pour les deux cames. Je crois ce site utilise toujours URL.createObjectURL
.
images
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
ouvrir un navigateur Chromium à la même URL sur le host
: (je reçois le message d'erreur
NotReadableError
tous les conseils sur la façon de configurer mon conteneur docker pour permettre une cam à assigner à l'hôte pendant que l'autre est dédié au conteneur docker?
Intéressant threads
-
NotReadableError: N'a pas attribué les points de videosource que cela peut se produire parce que la caméra est utilisée par une autre application.
-
fait intéressant, quand j'ouvre 2 instances de Chrome sur l'hôte (pas de conteneur cette fois) pointant vers la même page de test de caméra (
getUserMedia
), il parvient à obtenir le même flux vidéo vers les 2 instances Chromium. C'est quand j'essaie d'accéder à partir d'un container qu'il entre en conflit. Il peut jouer soit l'un ou l'autre, mais pas en même temps. Donc il pourrait être quelque chose à configurer sur le panneau conteneur. Toujours est-il qu'il essaie de comprendre pourquoi cela se produit.
mise à JOUR
docker journaux
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
résolu celui-ci en lisant ce thread
Essayé de partager devices
comme suggéré dans les commentaires ci-dessous, en vain
- /dev/video1:/dev/video1:rm
- /dev/video1:/dev/video1:r
- /dev/video1:/dev/video1:rw
Questions
- Ce qui se passe quand un appareil photo est accessible et commence la diffusion en continu? est-il un fichier de verrouillage créé et où? Notez cependant que je n'accède pas à la même caméra.
Sur les sections volumes je partage
- /tmp/.X11-unix:/tmp/.X11-unix
- ~/.Xauthority:/.Xauthority:ro
- /var/run/dbus/system_bus_socket:/var/run/dbus/system_bus_socket
je ne pense pas que ces fichiers sont le problème, mais toujours en train d'enquêter