web-dev-qa-db-fra.com

Fake une webcam en utilisant un périphérique de bouclage vidéo?

Je souhaite utiliser un clip vidéo en boucle comme source de la webcam dans un Hangout Google+. J'ai installé v4l2loopback et créé un périphérique de bouclage vidéo . Mais je n'ai pas trouvé comment écrire les images vidéo sur le périphérique. Le exemple donné est:

gst-launch videotestsrc ! v4l2sink device=/dev/video1

Donc, après avoir lu la page de manuel de gst-launch et essayé de comprendre ce qui se passait, j’ai fait ma faible tentative:

Sudo gst-launch-0.10 filesrc location=/home/briankb/Videos/darthvaderdancing.mp4 ! v4l2sink device=/dev/video0

Ce qui a abouti à:

Setting pipeline to PAUSED ...
libv4l2: error getting pixformat: Invalid argument
Pipeline is PREROLLING ...
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...

(gst-launch-0.10:12622): GStreamer-CRITICAL **: gst_caps_get_structure: assertion `GST_IS_CAPS (caps)' failed
New clock: GstSystemClock

(gst-launch-0.10:12622): GStreamer-CRITICAL **: gst_structure_get_name: assertion `structure != NULL' failed
Caught SIGSEGV accessing address (nil)
#0  0x00007fc1890f0b03 in poll () from /lib/x86_64-linux-gnu/libc.so.6
#1  0x00007fc18962bff6 in ?? () from /lib/x86_64-linux-gnu/libglib-2.0.so.0
#2  0x00007fc18962c45a in g_main_loop_run ()
#3  0x00007fc189b5c4cb in gst_bus_poll ()
#4  0x0000000000404587 in ?? ()
#5  0x0000000000403c34 in ?? ()
#6  0x00007fc18902b76d in __libc_start_main ()
#7  0x00000000004043bd in ?? ()
#8  0x00007fff88253ed8 in ?? ()
#9  0x000000000000001c in ?? ()
#10 0x0000000000000006 in ?? ()
#11 0x00007fff882548c4 in ?? ()
#12 0x00007fff882548d4 in ?? ()
#13 0x00007fff882548dc in ?? ()
#14 0x00007fff88254904 in ?? ()
#15 0x00007fff88254906 in ?? ()
#16 0x00007fff8825490f in ?? ()
#17 0x0000000000000000 in ?? ()
Spinning.  Please run 'gdb gst-launch 12622' to continue debugging, Ctrl-C to quit, or Ctrl-\ to dump core.

Le clip que j'essaie d'utiliser une vidéo h264 à 29,97 ips, 320x240 et dans un conteneur MP4 (il provient de Youtube).

15
isuldor

La page de manuel gst-launch nous indique que nous devons d'abord décoder la vidéo. La manière la plus simple de le faire est la suivante:

gst-launch-0.10 filesrc location=[location] ! decodebin ! v4l2sink device=/dev/video0

gst-launch n'a pas besoin d'être exécuté en tant que root, et [location] peut aussi être relatif!

12
小太郎

Utilisez simplement v4l2loopback avec mplayer .

  1. Télécharge le,
  2. compilez-le (make et 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.c du dossier source v4l2loopback à partir de

    v.fmt.pix.pixelformat = V4L2_PIX_FMT_YUV420;
    

    à

    v.fmt.pix.pixelformat = V4L2_PIX_FMT_YVU420;
    
  5. et faites make dans ce dossier.

  6. Puis exécutez-le à partir du répertoire examples 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.mp4 par le nom de votre fichier vidéo. Et remplacez /dev/video0 par votre périphérique de bouclage.

MPlayer est capable de lire n'importe quel flux Web, tout type de fichier vidéo, etc. Je viens de le tester avec un fichier de http://www.tagesschau.de qui est un site de nouvelles allemand.

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