Utiliser desktop comme faux webcam sur linux

48

Je veux créer un flux en direct de (une fenêtre sur) mon bureau Linux en utilisant un site de streaming gratuit, en utilisant la vidéo capturée comme une fausse webcam. Il existe de nombreux outils pour cela sur Windows. ffmpeg me permet de capturer les entrées sur une fenêtre spécifique, mais je ne trouve pas le moyen de sortir la vidéo sur un faux périphérique de type webcam utilisable par flash.

Quelqu'un peut-il recommander une méthode (ou un logiciel) pour ce faire?

bkconrad
la source
Tout allait bien jusqu'à ce que vous disiez "faux dispositif de type webcam utilisable par flash".
Ignacio Vazquez-Abrams le
Je ne suis pas sûr de ce que tu veux dire? Par périphérique "de type webcam", je voulais dire quelque chose comme un faux fichier de périphérique / dev / videoN, ou quelque chose de similaire. Je suppose que c’est ainsi que la vidéo capturée serait utilisable par flash.
bkconrad
Exactement. C'est dur.
Ignacio Vazquez-Abrams le

Réponses:

51

Vous pouvez installer v4l2loopback . C'est un module de noyau qui simule une webcam. Chargez-le avec:

modprobe v4l2loopback

Ensuite, vous devez envoyer le flux vidéo au périphérique / dev / video0 en utilisant un programme tel que ffmpeg. Pour capturer le bureau et le transférer vers / dev / video0 avec ffmpeg, vous pouvez utiliser la ligne de commande suivante:

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

Changez la valeur de -r de 15 à autre chose si vous voulez une cadence différente. La résolution est choisie dans le paramètre -s. Si vous souhaitez spécifier un décalage à partir du coin supérieur gauche de l'écran, transmettez-le au paramètre -i sous la forme "-i: 0.0 + x, y", où x et y sont respectivement les décalages horizontal et vertical.

Víctor Fernández
la source
5
Votre image peut être reflétée, je veux dire un retournement horizontal en fonction de votre construction ffmpeg . Utilisez le filtre vidéo -vf hflip . Si vous utilisez déjà un seul vf, placez-les entre guillemets et séparés par une virgule, par exemple -vf 'hflip, scale = 640: 360'.
Marcelo Teixeira Ruggeri le
3
Je reçois quelques erreurs ce [x11grab @ 0x24013c0] Stream #0: not enough frames to estimate rate; consider increasing probesize, [v4l2 @ 0x2409520] ioctl(VIDIOC_G_FMT): Invalid argumentetCould not write header for output file #0 (incorrect codec parameters ?): Invalid argument
Lotus
1
Je reçois exactement les mêmes résultats que @ Lotus avec ffmpeg 3.1.4. Existe-t-il des codecs ou des packages spéciaux requis à côté de v4l2loopback et de ffmpeg?
cguenther
1
@ Lotus, j'ai réussi à contourner le problème lorsque j'utilise un autre périphérique / dev / video. Vous devez vous assurer d'utiliser le périphérique vidéo v4l2 (qui est dans mon cas le / dev / video1). Le décalage peut être causé par un périphérique de webcam réel déjà existant utilisant / dev / video0.
cguenther
2
@ Lotus Assurez-vous que la commande modprobe (en tant que root ou avec sudo) a été exécutée avant de démarrer votre navigateur Chrome. Vérifiez que le module est chargé correctement avec <code> lsmod | grep v4l2loopback </ code>.
Cguenther
7

Utilisez v4l2loopback avec mplayer .

  1. Télécharge le,
  2. le compiler ( makeet su -c 'make install'),
  3. charger le module avec su -c 'modprobe v4l2loopback',
  4. puis changez une ligne dans le fichier examples/yuv4mpeg_to_v4l2.cdu dossier source v4l2loopback de

    v.fmt.pix.pixelformat = V4L2_PIX_FMT_YUV420;
    

    à

    v.fmt.pix.pixelformat = V4L2_PIX_FMT_YVU420;
    
  5. et faire makedans ce dossier.

  6. Puis lancez le depuis le examplesrépertoire comme ceci:

    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
    

    où vous remplacez movie.mp4par le nom de votre fichier vidéo. Et remplacez-le /dev/video0par votre périphérique de bouclage.

MPlayer est capable de lire n'importe quel flux Web, tout type de fichier vidéo, même à partir de stdin! Je viens de le tester avec un fichier de http://www.tagesschau.de qui est un site d'informations allemand.

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

Au lieu de $ TS, vous pouvez mettre un -(qui signifie stdin). Et devant mplayer, votre commande ffmpeg redirige sa sortie vers stdout. Donc, quelque chose comme:

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

N'a pas testé le dernier, car vous n'avez pas expliqué comment votre commande ffmpeg ressemblait.

erik
la source
S'il vous plaît aider: ./yuv4mpeg_to_v4l2 < /dev/video0 &conduit à ./yuv4mpeg_to_v4l2: : missing YUV4MPEG2 header. Comment remplacer /tmp/pipepar /dev/video0?
user123456
3

Quelle distro utilisez-vous? J'ai eu du succès avec WebCamStudio sous Arch combiné au "studio" basé sur le Web Livestream. Cela fait un petit moment que je l'utilise, cependant.

http://www.ws4gl.org/

Qu'essayez-vous de faire exactement? ffmpeg compilé avec x11grab peut enregistrer le bureau. J'ai eu un succès limité en poussant cela vers Ustream, mais encore une fois, cela fait longtemps et je pense que ce que je faisais ne fonctionnera plus.

Si vous souhaitez simplement diffuser un fichier plutôt que votre bureau (je pense que lorsque vous dites "une fenêtre", vous voulez dire "VLC"), je peux vous indiquer la bonne direction pour que cela fonctionne avec Livestream (peut-être Ustream). Je trouve maladroitement comment faire cela par des expériences. Ce n'est pas fantastique mais cela fonctionne avec Livestream.

Justin.tv a également des scripts qui peuvent diffuser depuis VLC vers leur service.

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

Mike Mitchell
la source
Oh wow c'est très intéressant. J'essaie de diffuser le gameplay en direct de certains jeux. Je sais déjà comment capturer dans un fichier vidéo à partir de ffmpeg, je me demande si je peux ouvrir le même fichier en vlc et le diffuser en quelque sorte au fur et à mesure de son écriture. Merci pour l'info.
bkconrad
Le site Web ws4gl.org semble très dépassé et tous les liens pointent vers la Wayback Machine. Je suppose que la dernière version est disponible sur sourceforge.net/projects/webcamstudio
Denilson Sá Maia
"WEBCAMSTUDIO N'EST PLUS MAINTENU": /
Raphael
2

Tout d’abord, apparence.in fait probablement ce que vous voulez sans tracas (je ne suis pas affilié): http://appear.in/

Deuxièmement, vous pouvez diffuser vers Twitch ou d’autres services en utilisant OBS, qui a récemment ajouté le support Linux (!): Https://obsproject.com/

OBS résout également le problème beaucoup plus difficile de multiplexage du son du système et des entrées audio lors de la capture d'écran sur Ubuntu (rien de ce universeque j'ai trouvé dans le référentiel que j'ai trouvé jusqu'à présent).

Je n'ai aucune solution unix-y géniale. Mais ceux qui ont fonctionné pour moi dans le monde réel.

bkconrad
la source
OBS Studio sur Debian: tracker.debian.org/pkg/obs-studio
mardi