首页 > 解决方案 > 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,width=640,height=480,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  

标签: cameragstreamerrtsp

解决方案


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

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

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

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

反而。


推荐阅读