Falsa webcam usando um dispositivo de loopback de vídeo?

14

Eu quero usar um videoclipe em loop como minha fonte de webcam em um Hangout do Google+. Instalei o v4l2loopback e criei um dispositivo de loopback de vídeo . Mas ainda não descobri como escrever os quadros de vídeo no dispositivo. O exemplo especificado é:

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

Então, depois de ler a página de manual do gst-launch e tentar entender o que estava acontecendo, fiz minha fraca tentativa:

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

O que resultou em:

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.

O clipe que eu estou tentando usar um vídeo h264 em 29,97 fps, 320x240, e em um contêiner mp4 (é do Youtube).

    
por isuldor 19.05.2012 / 08:13

2 respostas

11

As% man_de% manpages nos dizem que precisamos decodificar o vídeo primeiro, e a maneira mais fácil de fazer isso é assim:

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

gst-launch não precisa ser executado como root, e gst-launch também pode ser relativo!

    
por 小太郎 01.07.2012 / 05:22
11

Use v4l2loopback com o mplayer .

  1. Faça o download,
  2. compila ( make e su -c 'make install' ),
  3. carregue o módulo com su -c 'modprobe v4l2loopback' ,
  4. altere uma linha no arquivo examples/yuv4mpeg_to_v4l2.c da pasta de origem v4l2loopback de

    v.fmt.pix.pixelformat = V4L2_PIX_FMT_YUV420;
    

    para

    v.fmt.pix.pixelformat = V4L2_PIX_FMT_YVU420;
    
  5. e faça make nesta pasta.

  6. Em seguida, execute-o no diretório examples da seguinte forma:

    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
    

    onde você substitui movie.mp4 pelo nome do seu arquivo de vídeo. E substitua /dev/video0 pelo seu dispositivo de loopback.

O MPlayer é capaz de reproduzir qualquer webstreams, todos os tipos de arquivos de vídeo e assim por diante. Acabei de testá-lo com um arquivo do link que é um site de notícias alemão.

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
    
por erik 26.02.2013 / 12:18