Usar el escritorio como cámara web falsa en Linux

48

Quiero hacer una transmisión en vivo de (una ventana en) mi escritorio de Linux usando un sitio de transmisión gratuito, usando el video capturado como una cámara web falsa. Hay muchas herramientas para esto en Windows. ffmpeg me permite capturar la entrada en una ventana específica, pero no puedo encontrar una manera de emitir el video a un dispositivo falso estilo webcam que se puede usar con flash.

¿Alguien puede recomendar un método (o software) para hacer esto?

bkconrad
fuente
Todo estaba lleno de fuerza hasta que dijiste "dispositivo falso estilo webcam utilizable por flash".
Ignacio Vazquez-Abrams
¿No estoy seguro de lo que quieres decir? Por dispositivo de "estilo de cámara web" me refería a algo como un archivo de dispositivo falso / dev / videoN, o algo similar. Supongo que así es como el video capturado sería utilizable por flash.
bkconrad
Exactamente. Eso es difícil.
Ignacio Vazquez-Abrams

Respuestas:

51

Puede instalar v4l2loopback . Es un módulo del núcleo que simula una cámara web. Cárgalo con:

modprobe v4l2loopback

Luego debe enviar la transmisión de video al dispositivo / dev / video0 usando un programa como ffmpeg. Para capturar el escritorio y reenviarlo a / dev / video0 con ffmpeg, puede usar la siguiente línea de comando:

ffmpeg -f x11grab -r 15 -s 1280x720 -i :0.0+0,0 -vcodec rawvideo -pix_fmt yuv420p -threads 0 -f v4l2 /dev/video0

Cambie el valor de -r de 15 a otra cosa si desea una velocidad de fotogramas diferente. La resolución se elige en el parámetro -s. Si desea especificar un desplazamiento desde la esquina superior izquierda de la pantalla, páselo en el parámetro -i en la forma "-i: 0.0 + x, y", donde x e y son el desplazamiento horizontal y vertical respectivamente.

Víctor Fernández
fuente
55
Su imagen puede estar reflejada, es decir, obtener volteo horizontal dependiendo de su construcción ffmpeg . Use el filtro de video -vf hflip . Si ya usa un vf, colóquelos entre comillas y separados por comas, como -vf 'hflip, scale = 640: 360'.
Marcelo Teixeira Ruggeri
3
Me estoy poniendo un par de errores con este [x11grab @ 0x24013c0] Stream #0: not enough frames to estimate rate; consider increasing probesize, [v4l2 @ 0x2409520] ioctl(VIDIOC_G_FMT): Invalid argumentyCould not write header for output file #0 (incorrect codec parameters ?): Invalid argument
Lotus
1
Estoy obteniendo exactamente los mismos resultados que @Lotus con ffmpeg 3.1.4. ¿Se requieren códecs o paquetes especiales además de v4l2loopback y ffmpeg?
cguenther
1
@ Lotus logré solucionar el problema cuando uso otro dispositivo / dev / video. Debe asegurarse de usar el dispositivo de video v4l2 (que en mi caso es / dev / video1). El desplazamiento puede ser causado por un dispositivo de cámara web real ya existente que usa / dev / video0.
cguenther
2
@Lotus Asegúrese de que el comando modprobe (como root o con sudo) se haya ejecutado antes de iniciar su navegador Chrome. Verifique que el módulo esté cargado correctamente con <code> lsmod | grep v4l2loopback </code>.
cguenther
7

Use v4l2loopback con mplayer .

  1. Descargalo,
  2. compilarlo ( makey su -c 'make install'),
  3. cargar el módulo con su -c 'modprobe v4l2loopback',
  4. luego cambie una línea en el archivo examples/yuv4mpeg_to_v4l2.cde la carpeta de origen v4l2loopback de

    v.fmt.pix.pixelformat = V4L2_PIX_FMT_YUV420;
    

    a

    v.fmt.pix.pixelformat = V4L2_PIX_FMT_YVU420;
    
  5. y hacer makeen esta carpeta.

  6. Luego ejecútelo desde el examplesdirectorio así:

    mkfifo /tmp/pipe  # only needed once, as long as you do not delete the file /tmp/pipe
    ./yuv4mpeg_to_v4l2 < /tmp/pipe &
    mplayer movie.mp4 -vf scale=480:360 -vo yuv4mpeg:file=/tmp/pipe
    

    donde reemplazas movie.mp4con el nombre de tu archivo de video. Y reemplace /dev/video0con su dispositivo de bucle invertido.

MPlayer puede reproducir cualquier transmisión web, todo tipo de archivos de video, ¡incluso desde stdin! Lo acabo de probar con un archivo de http://www.tagesschau.de que es un sitio de noticias alemán.

TS=$(wget "http://www.tagesschau.de/multimedia/video/" -q -O - | grep --regexp='http.*\.webm"' | sed -e 's%.*href="%%' -e 's%\.webm".*%\.webm%')
./yuv4mpeg_to_v4l2 < /tmp/pipe &
mplayer $TS -vf scale=480:360 -vo yuv4mpeg:file=/tmp/pipe

En lugar de $ TS, podría poner un -(que significa stdin). Y frente a mplayer, su comando ffmpeg redirige su salida a stdout. Entonces algo como:

./yuv4mpeg_to_v4l2 < /tmp/pipe &
fmpeg -someOptions ... -o - | mplayer - -vf scale=480:360 -vo yuv4mpeg:file=/tmp/pipe

No probé el último, porque no dijiste cómo se ve tu comando ffmpeg.

erik
fuente
Por favor ayuda: ./yuv4mpeg_to_v4l2 < /dev/video0 &conduce a ./yuv4mpeg_to_v4l2: : missing YUV4MPEG2 header. ¿Cómo reemplazar /tmp/pipepor /dev/video0?
user123456
3

¿Qué distro está usando? He tenido éxito con WebCamStudio en Arch combinado con el "estudio" basado en la web Livestream. Sin embargo, ha pasado un tiempo desde que lo usé.

http://www.ws4gl.org/

¿Qué estás tratando de hacer exactamente? ffmpeg compilado con x11grab puede grabar el escritorio. He tenido un éxito limitado al enviar eso a Ustream, pero nuevamente ha pasado un tiempo y creo que lo que estaba haciendo ya no funcionará.

Si solo desea transmitir un archivo en lugar de su escritorio (estoy pensando cuando dice "Una ventana", quiere decir, "VLC"), puedo orientarlo en la dirección correcta para que funcione con Livestream (tal vez Ustream). Estoy descubriendo torpemente cómo hacer esto a través de la experimentación. No es fantástico, pero funciona con Livestream.

Justin.tv también tiene scripts que pueden transmitir desde VLC a su servicio.

http://apiwiki.justin.tv/mediawiki/index.php/Linux_Broadcasting_API

Mike Mitchell
fuente
Oh wow, esto es muy interesante. Estoy tratando de transmitir el juego en vivo de algunos juegos. Ya sé cómo capturar en un archivo de video desde ffmpeg, me pregunto si puedo abrir ese mismo archivo en vlc y transmitirlo de alguna manera mientras se está escribiendo. Gracias por la info.
bkconrad
El sitio web ws4gl.org parece muy desactualizado, y todos los enlaces apuntan a Wayback Machine. Supongo que la última versión está disponible en sourceforge.net/projects/webcamstudio
Denilson Sá Maia
"WEBCAMSTUDIO YA NO SE MANTENGA MÁS": /
Raphael
2

Primero, parece que probablemente haga lo que quiera sin ningún problema (no estoy afiliado): http://appear.in/

En segundo lugar, puede transmitir a Twitch u otros servicios utilizando OBS, que recientemente agregó soporte para Linux (!): Https://obsproject.com/

OBS también resuelve el problema mucho más difícil de mezclar el sonido del sistema y la entrada de audio durante la captura de pantalla en Ubuntu (no resuelto por nada en el universerepositorio que he encontrado hasta ahora).

No tengo ninguna solución increíble de Unix-y. Pero eso funcionó para mí en el mundo real.

bkconrad
fuente
OBS Studio en Debian: tracker.debian.org/pkg/obs-studio
myrdd