我想使用循环播放的视频片段作为 Google+ Hangout 中的网络摄像头源。我安装了 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 的 h264 视频,并采用 mp4 容器(来自 Youtube)。
答案1
手册页gst-launch
告诉我们,我们需要先解码视频,最简单的方法如下:
gst-launch-0.10 filesrc location=[location] ! decodebin ! v4l2sink device=/dev/video0
gst-launch
不需要以 root 身份运行,也[location]
可以是相对的!
答案2
- 下载它,
- 编译它(
make
并且su -c 'make install'
), - 使用以下方式加载模块
su -c 'modprobe v4l2loopback'
, examples/yuv4mpeg_to_v4l2.c
然后将v4l2loopback 源文件夹文件中的一行从v.fmt.pix.pixelformat = V4L2_PIX_FMT_YUV420;
到
v.fmt.pix.pixelformat = V4L2_PIX_FMT_YVU420;
make
并在此文件夹中执行。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