微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

gstreamer 如何选择相机的格式类型

如何解决gstreamer 如何选择相机的格式类型

我的电脑上安装了 gstreamer,我想使用 H264 格式。从这个命令我知道相机支持它:

 # v4l2-ctl -d /dev/video2 --list-formats
ioctl: VIdioC_ENUM_FMT
    Index       : 0
    Type        : Video Capture
    Pixel Format: 'MJPG' (compressed)
    Name        : Motion-JPEG

    Index       : 1
    Type        : Video Capture
    Pixel Format: 'YUYV'
    Name        : YUYV 4:2:2

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

我想用于 gstreamer 的命令如下:

./test-launch --gst-debug=3 '( v4l2src device=/dev/video2 ! video/x-raw,width=640,height=480,framerate=30/1 ! videoconvert ! x264enc tune=zerolatency ! rtph264pay name=pay0 pt=96 )'

我在哪里设置使用 H264? 从命令中,我看到编码器已设置为 x264enc,有效载荷为 h264pay。为什么我需要编码为 x264,因为来自相机的数据已经是 h264 了?

使用这个命令我有这个错误

# ./test-launch --gst-debug=3 '( v4l2src d
evice=/dev/video2 ! video/x-raw,framerate=30/1 ! videoconve
rt ! x264enc tune=zerolatency ! rtph264pay name=pay0 pt=96 )'
stream ready at rtsp://127.0.0.1:8554/test
0:00:56.085259093  4891   0x55ae286140 WARN     GST_ELEMENT_FACTORY gstelementfactory.c:456:gst_element_factory_make: no such element factory "x264enc"!
0:00:56.085377739  4891   0x55ae286140 ERROR           GST_PIPELINE grammar.y:816:priv_gst_parse_yyparse: no element "x264enc"
0:00:56.085404562  4891   0x55ae286140 ERROR           GST_PIPELINE grammar.y:901:priv_gst_parse_yyparse: link has no sink [source=@0x7f740197c0]
0:00:56.088847062  4891   0x55ae286140 ERROR           GST_PIPELINE grammar.y:901:priv_gst_parse_yyparse: link has no source [sink=@0x7f74038210]
0:00:56.092296385  4891   0x55ae286140 WARN        rtspmediafactory rtsp-media-factory.c:1427:default_create_element: recoverable parsing error: no element "x264enc"
0:00:56.123282895  4891   0x7f6c029990 FIXME                default gstutils.c:3902:gst_pad_create_stream_id_internal:<appsrc0:src> Creating random stream-id,consider implementing a deterministic way of creating a stream-id
0:01:04.027984559  4891   0x7f6c029a80 WARN          v4l2bufferpool gstv4l2bufferpool.c:754:gst_v4l2_buffer_pool_start:<v4l2src0:pool:src> Uncertain or not enough buffers,enabling copy threshold
0:01:04.240517944  4891   0x7f6c029a80 WARN                 basesrc gstbasesrc.c:2939:gst_base_src_loop:<v4l2src0> error: Internal data stream error.
0:01:04.240787267  4891   0x7f6c029a80 WARN                 basesrc gstbasesrc.c:2939:gst_base_src_loop:<v4l2src0> error: streaming stopped,reason not-linked (-1)
0:01:04.242162319  4891   0x7f7400f4a0 WARN               rtspmedia rtsp-media.c:2433:default_handle_message: 0x7f7404b180: got error Internal data stream error. (../../../../gstreamer-1.12.2/libs/gst/base/gstbasesrc.c(2939): gst_base_src_loop (): /GstPipeline:media-pipeline/GstBin:bin0/GstV4l2Src:v4l2src0:
streaming stopped,reason not-linked (-1))
0:01:04.242804976  4891   0x55ae286140 WARN               rtspmedia rtsp-media.c:2728:wait_preroll: Failed to preroll pipeline
0:01:04.242955184  4891   0x55ae286140 WARN               rtspmedia rtsp-media.c:3032:gst_rtsp_media_prepare: Failed to preroll pipeline
0:01:04.402276538  4891   0x55ae286140 ERROR             rtspclient rtsp-client.c:977:find_media: client 0x55ae2c5170: can't prepare media
0:01:04.403620496  4891   0x55ae286140 ERROR             rtspclient rtsp-client.c:2696:handle_describe_request: client 0x55ae2c5170: no media
0:01:04.405440236  4891   0x55ae286140 WARN     GST_ELEMENT_FACTORY gstelementfactory.c:456:gst_element_factory_make: no such element factory "x264enc"!
0:01:04.405544819  4891   0x55ae286140 ERROR           GST_PIPELINE grammar.y:816:priv_gst_parse_yyparse: no element "x264enc"
0:01:04.405635132  4891   0x55ae286140 ERROR           GST_PIPELINE grammar.y:901:priv_gst_parse_yyparse: link has no sink [source=@0x7f740197c0]
0:01:04.405832684  4891   0x55ae286140 ERROR           GST_PIPELINE grammar.y:901:priv_gst_parse_yyparse: link has no source [sink=@0x7f74038500]
0:01:04.411951382  4891   0x55ae286140 WARN        rtspmediafactory rtsp-media-factory.c:1427:default_create_element: recoverable parsing error: no element "x264enc"
0:01:04.432344715  4891   0x7f6c0299e0 FIXME                default gstutils.c:3902:gst_pad_create_stream_id_internal:<appsrc1:src> Creating random stream-id,consider implementing a deterministic way of creating a stream-id
0:01:05.191722944  4891   0x7f6c02a000 WARN                    v4l2 gstv4l2object.c:2186:gst_v4l2_object_add_interlace_mode:0x7f7405b090 Failed to determine interlace mode
0:01:05.208055340  4891   0x7f6c02a000 WARN                    v4l2 gstv4l2object.c:2834:gst_v4l2_object_get_nearest_size:<v4l2src1> Unable to try format: No such device
0:01:05.208426434  4891   0x7f6c02a000 WARN  

解决方法

您通过给下游的上限告诉 v4l2source。目前您拥有:

video/x-raw,width=640,height=480,framerate=30/1

告诉它使用未压缩的原始格式。而是尝试这样的事情:

video/x-h264,framerate=30/1

相反。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。