2013-04-03 293 views
9

我试图从本地安装的Logitech C920摄像机从/dev/video0Gstreamer 1.0v4l2src元素捕获H264流。从Gstreamer摄像头捕获h.264流

v4l2-ctl --list-formats显示,相机能够给H264视频格式:

# v4l2-ctl --list-formats 
ioctl: VIDIOC_ENUM_FMT 
     ... 

     Index  : 1 
     Type  : Video Capture 
     Pixel Format: 'H264' (compressed) 
     Name  : H.264 

     ... 

但管道

# gst-launch-1.0 -vvv v4l2src device=/dev/video0 ! video/x-h264, width=800, height=448, framerate=30/1 ! fakesink

一直给我not-negotiated (-4)错误:

/GstPipeline:pipeline0/GstV4l2Src:v4l2src0.GstPad:src: caps = video/x-h264, width=(int)800, height=(int)448, interlace-mode=(string)progressive, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)30/1 
/GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:src: caps = video/x-h264, width=(int)800, height=(int)448, interlace-mode=(string)progressive, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)30/1 
/GstPipeline:pipeline0/GstFakeSink:fakesink0.GstPad:sink: caps = video/x-h264, width=(int)800, height=(int)448, interlace-mode=(string)progressive, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)30/1 
/GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:sink: caps = video/x-h264, width=(int)800, height=(int)448, interlace-mode=(string)progressive, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)30/1 
ERROR: from element /GstPipeline:pipeline0/GstV4l2Src:v4l2src0: Internal data flow error. 
Additional debug info: 
gstbasesrc.c(2809): gst_base_src_loop(): /GstPipeline:pipeline0/GstV4l2Src:v4l2src0: 
streaming task paused, reason not-negotiated (-4) 
Execution ended after 67687169 ns. 

任何帮助!

回答

9

是您需要的GStreamer强制性?罗技C920在H264模式和gstreamer中也存在很多问题。但是我设法使用VLC作为RTSP服务器使用C920与H264:

$ cvlc -v v4l2:///dev/video0:chroma="H264":width=1024:height=570:fps=30 \ 
     --sout="#rtp{sdp=rtsp://:8554/live}" 

然后,我可以与其他VLC连接到URI的rtsp://本地主机:8554 /现场

如果GStreamer是我只设法使用一个捕获实用程序,你可以在这里找到:https://github.com/csete/bonecam - 目录“捕获”

你必须编译它,但如果你有一些编程技巧,它应该很容易,因为那里只有一个C文件和一个脚本来帮助。刚刚通过的“主机”作为参数传递给脚本:

# Get the bonecam/capture content or git clone the directory, and then 
$ cd bonecam/capture 
$ ./build host 

您可以使用“捕获”实用程序与类似的东西:

$ v4l2-ctl -d /dev/video0 --set-fmt-video=width=1024,height=570,pixelformat=1 
$ v4l2-ctl -d /dev/video0 --set-parm=30 
$ ./bonecam/capture/capture -d /dev/video0 -c 100000 -o | \ 
     gst-launch -e filesrc location=/dev/fd/0 ! legacyh264parse ! rtph264pay ! udpsink host=10.0.0.42 port=5000 

如果你不喜欢指定的帧数获得(“-c”参数与“捕获”),这个工具有一个分支,你可以在这里找到:https://github.com/DeLaGuardo/bonecam

我知道有一个插件归类为“坏”,称为uvch264 gstreamer 0.10,这应该与C920一起工作。但我不知道gstreamer 1.0,我无法测试它。

UPD:

不要忘记添加--rtsp-timeout=-1cvlc命令行像

$ cvlc -v v4l2:///dev/video0:chroma="H264":width=1024:height=570:fps=30 \ 
     --sout="#rtp{sdp=rtsp://:8554/live}" --rtsp-timeout=-1 

没有这个选项只流持续60秒默认。

+0

非常感谢! 'cvlc'就像一个魅力!我在Rasperry Pi上使用它。 –

+0

C920处于H264模式?你确定?由于Raspberry Pi上的USB问题,我在使用Raspberry Pi启用相机的H264模式时遇到了很多问题。由于这个问题,一些H264帧丢失了,所以视频很奇怪。事实上,正因为如此,我在一个Beaglebone上使用了C920。 无论如何,如果它适合你,我想在固件中有一个更新来解决这个问题。 –

+0

我以前有丢帧的USB问题。我在这里安装了新的Rapbian内核(https://github.com/raspberrypi/linux/issues/238)。丢帧问题消失。现在流式传输H264视频非常流畅。 –

1

我一直在尝试做同样的事情,并且得到了同样的错误。我相信我在使用GStreamer 1.0.6。

我发现了什么,甚至可能由于Fergal巴特勒的回答,是以下页面:

http://kakaroto.homelinux.net/2012/09/uvc-h264-encoding-cameras-support-in-gstreamer/

这里Youness阿拉维描述了他作出带来的GStreamer H264摄像机支持uvch264_src元素。

他在GStreamer 1.0中描述了他的文章中的挂起端口。所以在上周我一直在研究这个。事实证明,已将移植到GStreamer 1.0,但仅限于开发者版本(版本1.1.2)。

你可以得到1.1.2版本在这里:

http://gstreamer.freedesktop.org/src/

这就是所谓的 “uvch264src” 现在,它的GST-插件坏的一部分。我认为它也出现在版本1.1.1中,但我没有真正考虑过。

我有点难以安装,我认为主要是由于与PC上安装的GST 1.0软件包发生冲突(所以我自己的错)。但请注意,它依赖于libgudev-1.0-dev和libusb-1.0-0-dev,因此首先安装这些软件包 - 我花了一段时间才算出它是我缺少的那两个。

这里是管道我开始工作,它使用uvch264:

gst-launch-1.0 uvch264src device=/dev/video0 name=src auto-start=true src.vfsrc ! video/x-raw, format=YUY2, width=160, height=90, framerate=5/1 ! xvimagesink src.vidsrc ! queue ! video/x-h264, width=800, height=448, framerate=30/1 ! h264parse ! avdec_h264 ! xvimagesink

如果你不想使用预览视频(从vfsrc垫)只是挂钩src.vfsrc直上一个fakesink。我还应该提到,尽管这条管线对我来说很有用,但我对“在分段事件之前有数据流”有很多警告。所以显然我没有做正确的事,但我不确定是什么。

无论如何,在完成了1.1.2和uvch264src的完全安装和工作之后,我决定再次给v4l2src一个提示。事实证明,v4l2src完全支持H264:/。 (见简短的回答。)


答案很简单:

因此短期回答你的问题是,如果你高兴地从源代码安装1.1.2,你就可以做什么你想以同样的方式尝试去做。你不应该需要uvch264src。我已经测试过你的管道,它在我的安装中工作得很好。我也试过这个简单的管道,以显示在屏幕上的视频,这对我来说工作得很好,以及:

gst-launch-1.0 -e v4l2src device=/dev/video0 ! video/x-h264, width=800, height=448, framerate=30/1 ! avdec_h264 ! xvimagesink sync=false

0

尝试使用videoconvert自动将视频转换成由视频理解的格式沉

gst-launch-1.0 -vvv v4l2src device=/dev/video0 ! videoconvert ! ... 
0

我也得到了一个罗技C920摄像头,并使用了下列管道从摄像机录制H.264视频:

gst-launch-1.0 v4l2src device=/dev/video0 ! video/x-h264,width=1280,height=720,framerate=30/1 ! mpegtsmux ! filesink location=output.ts 

这会要求相机生成H.264数据,然后将其复合到MPEG transport stream容器中,然后写入磁盘。我可以用Totem成功播放结果文件。

上述流水线记录在720p。如果您将请求的格式更改为width=1920,height=1080,相机也可以以1080p录制。