12

/dev/video0我正在尝试使用element从本地安装的 Logitech C920 摄像头捕获 H264 流Gstreamer 1.0 v4l2src

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.

任何帮助!

4

5 回答 5

13

gstreamer 是否满足您的需求?我在 H264 模式下的 Logitech C920 和 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://localhost:8554/live

如果 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”参数和“capture”),您可以在此处找到此实用程序的一个分支:https ://github.com/DeLaGuardo/bonecam

我知道有一个分类为“坏”的插件,称为 gstreamer 0.10 的 uvch264,它应该适用于 C920。但我不知道 gstreamer 1.0,我无法测试它。

升级版:

不要忘记添加--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 秒。

于 2013-04-08T11:54:39.717 回答
3

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

我发现,甚至可能感谢 Fergal Butler 的回答,是以下页面:

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

在这里,Youness Alaoui 描述了他制作的 uvch264_src 元素,用于为 GStreamer 带来 H264 摄像头支持。

他在他的文章中将 GStreamer 1.0 的移植描述为待处理。所以在过去的一周里,我一直在研究这个。事实证明,它现在被移植到 GStreamer 1.0,但仅限于开发人员版本(版本 1.1.2)。

您可以在此处获取 1.1.2 版本:

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

它现在被称为“uv​​ch264src”,它是 gst-plugins-bad 的一部分。我认为它也存在于 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 pad),只需将 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

于 2013-07-23T09:44:00.460 回答
1

我还有一台罗技 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 传输流容器中,并写入磁盘。我可以使用 Totem 成功播放生成的文件。

上述管道以 720p 记录。如果您将请求的格式更改为 ,相机还可以以 1080p 录制width=1920,height=1080

于 2017-09-05T02:34:21.810 回答
0

我不相信 v4l2src 目前支持 h264。看这里:

http://www.oz9aec.net/index.php/gstreamer/473-using-the-logitech-c920-webcam-with-gstreamer

和这里:

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

于 2013-04-04T17:06:49.227 回答
0

尝试使用 videoconvert 自动将视频转换为视频接收器可以理解的格式

gst-launch-1.0 -vvv v4l2src device=/dev/video0 ! videoconvert ! ...
于 2016-01-21T12:32:32.913 回答