Utilizzo del desktop come webcam falsa su Linux


48

Voglio creare un flusso live di (una finestra su) il mio desktop linux usando un sito di streaming gratuito, usando il video catturato come una webcam falsa. Ci sono molti strumenti per questo su Windows. ffmpeg mi permette di catturare input su una finestra specifica, ma non riesco a trovare un modo per trasmettere il video su un falso dispositivo simile a una webcam utilizzabile con il flash.

Qualcuno può raccomandare un metodo (o software) per farlo?


È stato tutto perfetto fino a quando non hai detto "falso dispositivo in stile webcam utilizzabile con il flash".
Ignacio Vazquez-Abrams,

Non sono sicuro di cosa intendi? Per dispositivo "stile webcam" intendevo qualcosa di simile a un file dispositivo falso / dev / videoN o qualcosa di simile. Suppongo che questo sia il modo in cui il video acquisito sarebbe utilizzabile tramite Flash.
bkconrad,

Esattamente. Questa è dura.
Ignacio Vazquez-Abrams,

Risposte:


51

È possibile installare v4l2loopback . È un modulo del kernel che simula una webcam. Caricalo con:

modprobe v4l2loopback

Quindi è necessario inviare il flusso video al dispositivo / dev / video0 usando un programma come ffmpeg. Per acquisire il desktop e inoltrarlo a / dev / video0 con ffmpeg, è possibile utilizzare la seguente riga di comando:

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

Cambia il valore di -r da 15 a qualcos'altro se vuoi un frame rate diverso. La risoluzione è scelta nel parametro -s. Se si desidera specificare un offset dall'angolo in alto a sinistra dello schermo, passarlo nel parametro -i nella forma "-i: 0.0 + x, y", dove xey sono rispettivamente l'offset orizzontale e verticale.


5
L'immagine potrebbe essere specchiata, intendo ottenere una rotazione orizzontale a seconda della build di ffmpeg . Usa filtro video -vf hflip . Se usi già un vf, inseriscili tra virgolette e separati da virgola, come -vf 'hflip, scale = 640: 360'.
Marcelo Teixeira Ruggeri,

3
Sto ottenendo alcuni errori con questo [x11grab @ 0x24013c0] Stream #0: not enough frames to estimate rate; consider increasing probesize, [v4l2 @ 0x2409520] ioctl(VIDIOC_G_FMT): Invalid argumenteCould not write header for output file #0 (incorrect codec parameters ?): Invalid argument
Lotus

1
Ricevo esattamente gli stessi output di @Lotus con ffmpeg 3.1.4. Ci sono speciali codec o pacchetti richiesti oltre a v4l2loopback e ffmpeg?
Cguenther,

1
@Lotus Sono riuscito a risolvere il problema, quando utilizzo un altro dispositivo / dev / video. Dovresti assicurarti di usare il dispositivo video v4l2 (che nel mio caso è / dev / video1). L'offset può essere causato da un dispositivo webcam reale già esistente usando / dev / video0.
Cguenther,

2
@Lotus Assicurati che il comando modprobe (come root o con sudo) sia stato eseguito prima di avviare il tuo browser Chrome. Verificare che il modulo sia caricato correttamente con <code> lsmod | grep v4l2loopback </code>.
Cguenther,

7

Usa v4l2loopback con mplayer .

  1. Scaricalo,
  2. compilarlo ( makee su -c 'make install'),
  3. carica il modulo con su -c 'modprobe v4l2loopback',
  4. quindi modificare una riga nel file examples/yuv4mpeg_to_v4l2.cdella cartella di origine v4l2loopback da

    v.fmt.pix.pixelformat = V4L2_PIX_FMT_YUV420;
    

    a

    v.fmt.pix.pixelformat = V4L2_PIX_FMT_YVU420;
    
  5. e fare makein questa cartella.

  6. Quindi eseguirlo dalla examplesdirectory in questo modo:

    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
    

    dove si sostituisce movie.mp4con il nome del file video. E sostituirlo /dev/video0con il dispositivo di loopback.

MPlayer è in grado di riprodurre qualsiasi flusso web, qualsiasi tipo di file video, anche da stdin! L'ho appena testato con un file da http://www.tagesschau.de che è un sito di notizie tedesco.

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

Invece di $ TS potresti mettere un -(che sta per stdin). E di fronte a mplayer il tuo comando ffmpeg reindirizza il suo output su stdout. Quindi qualcosa come:

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

Non ho testato l'ultimo, perché non hai indicato l'aspetto del tuo comando ffmpeg.


Per favore aiutatemi: ./yuv4mpeg_to_v4l2 < /dev/video0 &porta a ./yuv4mpeg_to_v4l2: : missing YUV4MPEG2 header. Come sostituire /tmp/pipecon /dev/video0?
user123456,

3

Quale distro stai usando? Ho avuto successo con WebCamStudio sotto Arch combinato con lo "studio" basato sul web di Livestream. È da un po 'che non lo uso.

http://www.ws4gl.org/

Cosa stai cercando di fare esattamente? ffmpeg compilato con x11grab può registrare il desktop. Ho avuto un successo limitato spingendolo su Ustream, ma ancora una volta è passato un po 'di tempo e penso che quello che stavo facendo non funzionerà più.

Se vuoi solo trasmettere in streaming un file anziché il tuo desktop (sto pensando quando dici "Una finestra", intendi "VLC"), posso indicarti la giusta direzione per farlo funzionare con Livestream (forse Ustream). Sto goffamente a capire come farlo attraverso la sperimentazione. Non è fantastico ma funziona con Livestream.

Justin.tv ha anche degli script che possono eseguire lo streaming da VLC al loro servizio.

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


Oh wow, questo è molto interessante. Sto cercando di riprodurre in streaming il gameplay live di alcuni giochi. So già come catturare in un file video da ffmpeg, mi chiedo se posso aprire lo stesso file in vlc e in qualche modo trasmetterlo mentre viene scritto. Grazie per le informazioni.
bkconrad,

Il sito Web ws4gl.org sembra molto obsoleto e tutti i collegamenti rimandano alla Wayback Machine. Suppongo che l'ultima versione sia disponibile su sourceforge.net/projects/webcamstudio
Denilson Sá Maia,

"WEBCAMSTUDIO NON È PIÙ MANTENUTO": /
Raphael

2

In primo luogo, look.in probabilmente fa quello che vuoi senza problemi (non sono affiliato): http://appear.in/

In secondo luogo, è possibile eseguire lo streaming su Twitch o altri servizi utilizzando OBS, che ha recentemente aggiunto il supporto linux (!): Https://obsproject.com/

OBS risolve anche il problema molto più difficile del mixaggio dell'audio del sistema e dell'input audio durante l'acquisizione dello schermo su Ubuntu (non risolto da nulla nel universerepository che ho trovato finora).

Non ho fantastiche soluzioni unix-y. Ma quelli hanno funzionato per me nel mondo reale.


OBS Studio su Debian: tracker.debian.org/pkg/obs-studio
myrdd
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.