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


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

https://webrtc.github.io/samples/src/content/getusermedia/gum/ FAILS:(

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})

GUM Not Readable error

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

GUM resolved after closing the streaming Chromium

GUM resolved

ils n'ont pas accès au même appareil. J'ai vérifié dans chrome://media-internals

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 .

https://www.onlinemictest.com/webcam-test/ WORKS?!

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

22
demandé sur zabumba 0000-00-00 00:00:00