使用视频环回设备伪造网络摄像头?


16

我想将循环播放的视频片段用作Google+环聊中的网络摄像头源。我安装了v4l2loopback并创建了一个视频环回设备。但是我还没有弄清楚如何将视频帧写入设备。给定的示例是:

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

因此,在阅读了gst-launch的手册页并尝试了解发生了什么之后,我做了微弱的尝试:

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

结果是:

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.

我正在尝试使用29.97 fps,320x240并在mp4容器(来自Youtube)中的h264视频的剪辑。

Answers:


12

gst-launch手册页告诉我们,我们需要将视频解码第一,和这样做的最简单的方法是这样的:

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

gst-launch不需要以root身份运行,也[location]可以是相对的!


11

只需将v4l2loopback与mplayer一起使用

  1. 下载它,
  2. 编译(makesu -c 'make install'),
  3. 加载与所述模块su -c 'modprobe v4l2loopback'
  4. 然后从以下位置更改examples/yuv4mpeg_to_v4l2.cv4l2loopback源文件夹的文件中的一行

    v.fmt.pix.pixelformat = V4L2_PIX_FMT_YUV420;
    

    v.fmt.pix.pixelformat = V4L2_PIX_FMT_YVU420;
    
  5. make在此文件夹中执行。

  6. 然后从这样的examples目录运行它:

    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
    

    在其中替换movie.mp4为视频文件的名称。并替换/dev/video0为您的环回设备。

MPlayer可以播放任何网络流,各种视频文件等。我刚刚用德国新闻网站http://www.tagesschau.de的文件进行了测试。

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

这个答案说要更改v.fmt.pix.pixelformat = V4L2_PIX_FMT_YVU420; 完全一样,这是否意味着不需要更改?
kkron

2
@kkron:逐字符比较两行(前后),您会注意到其中的区别。;-)提示:YUV和YVU。
erik 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.