picture - Cómo compartir & WebRTC stream desde un dispositivo/dev/videoX desde un Chromium en el host y Chromium en un contenedor docker
upload camera capture html (1)
Si solo quieres sesiones separadas de Chrome, puedes comenzar con:
chromium-browser --user-data-dir=/tmp/chrome1
y otra instancia con
chromium-browser --user-data-dir=/tmp/chrome2
Docker es solo una forma de documentar y repetir la configuración de un entorno muy específico. La capa adicional de seguridad que agrega es mínima, especialmente con los permisos adicionales que está transmitiendo y especialmente en comparación con la seguridad realmente bien probada de Chrome.
Si necesita un poco más de aislamiento, puede crear usuarios separados:
# 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 &
Ambiente
- Host ejecutando Ubuntu 14.04.5 LTS
- Versión Docker 17.09.0-ce, compilación afdb6d4
- Cromo 62.0.3202.89
- 2 webcams:
/dev/video0
,/dev/video1
Camaras
# 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
Necesito compartir las cámaras web en el host Ubuntu 14.04
con el contenedor de la Ubuntu 16.04
acoplable Ubuntu 16.04
y poder obtener las transmisiones de video (WebRTC getUserMedia
) de cada cámara en cada instancia de cromo que se ejecute respectivamente en el host y el contenedor o en 2 contenedores separados de la docker.
Para probar el getUserMedia
, estoy navegando a
- https://www.onlinemictest.com/webcam-test/ y
- https://webrtc.github.io/samples/src/content/getusermedia/gum/
Como reproducirse
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-componer hasta
$ 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
Intentos adicionales con
command: ["https://appear.in/hello"]
y
command: ["https://test.webrtc.org/"]
lleva a lo mismo, una vez que una cámara comienza a transmitir la otra no puede
Arranque el cromo en contenedores docker.
export DISPLAY=:0.0
docker-compose up
RESULTADOS
Usando https://webrtc.github.io/samples/src/content/getusermedia/gum/ => FAILS
Si cierro chromium_video1
, chromium_video0
transmite el video después de una actualización del navegador (?).
getUserMedia
desde la consola web:
navigator.mediaDevices.getUserMedia({audio: true, video: true})
pero después de cerrar la transmisión de cromo /dev/video1
, ahora /dev/video0
es legible. El comando getUserMedia
resuelve y la cámara transmite video desde /dev/video0
No están accediendo al mismo dispositivo. Me registré en chrome://media-internals
Usando https://www.onlinemictest.com/webcam-test/ WORKS !!!!!?!?!?!
Cuando se usa https://www.onlinemictest.com/webcam-test/ lugar, funciona, podemos ver transmisiones para ambas cámaras. Creo que ese sitio en particular sigue usando URL.createObjectURL
.
imagenes
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
Abra un navegador Chromium en la misma URL en el host
:( me sale el mensaje de ERROR
NotReadableError
¿Algún puntero sobre cómo configurar mi contenedor de ventana acoplable para permitir que una cámara se asigne al host mientras que la otra está dedicada al contenedor de ventana acoplable?
Hilos interesantes
NotReadableError: Error al asignar los puntos de la fuente de videos que esto puede estar sucediendo porque la cámara está siendo utilizada por otra aplicación.
Curiosamente, cuando abro 2 instancias de Chromium en el host (sin contenedor esta vez) que apunta a la misma página de prueba de la cámara (
getUserMedia
), logra obtener la misma transmisión de video a las 2 instancias de Chromium. Ahí es cuando trato de acceder desde un contenedor que entra en conflicto. Puede jugar uno u otro, pero no al mismo tiempo. Así que podría ser algo para configurar en el contenedor docker. Aún así, tring para entender por qué esto está sucediendo.
ACTUALIZAR
registros de la ventana acoplable
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
Resuelto este leyendo este thread
Intenté compartir devices
como se sugiere en los comentarios a continuación, sin éxito
- /dev/video1:/dev/video1:rm
- /dev/video1:/dev/video1:r
- /dev/video1:/dev/video1:rw
Preguntas
- ¿Qué sucede cuando se accede a una cámara y comienza la transmisión? ¿hay un archivo de bloqueo creado y dónde? Tenga en cuenta sin embargo que no estoy accediendo a la misma cámara.
En las secciones de volúmenes que estoy compartiendo.
- /tmp/.X11-unix:/tmp/.X11-unix
- ~/.Xauthority:/.Xauthority:ro
- /var/run/dbus/system_bus_socket:/var/run/dbus/system_bus_socket
No creo que estos archivos sean el problema, pero siguen investigando.