如何让GStreamer应用实现正常的RTSP视频流输出?
解决GStreamer自建RTSP服务的问题
1. 修复gst_element_make_from_uri断言错误
这个断言错误大概率是URI格式不对,或者你用错了创建元素的方式:
- 检查代码里传去
gst_element_make_from_uri的URI字符串,必须是完整合法格式,比如RTSP服务要写成rtsp://0.0.0.0:80/stream。 - 摄像头输入类元素(比如
v4l2src)不支持从URI创建,别用这个函数,直接用gst_element_factory_make实例化就行。
2. 解决Caps格式导致的无输出问题
你去掉Caps单引号后程序能跑但没输出,说明代码里的Caps处理有误:
- GStreamer代码里设置Caps不需要加单引号,直接用
gst_caps_from_string传纯字符串,比如:GstCaps *caps = gst_caps_from_string("video/x-raw,width=1280,height=720,format=NV12"); - 要确保Caps正确绑定到元素上,用
gst_element_link_filtered或者gst_element_set_caps来关联,别像命令行那样随便拼接字符串。
3. 强制摄像头输出指定分辨率和格式
摄像头实际输出1280x1080-NV21和你要求的1280x720-NV12不匹配,这是无输出的核心原因,按下面的方法解决:
- 实例化
v4l2src后直接设置设备路径,再用Caps强制约束输出:GstElement *src = gst_element_factory_make("v4l2src", "camera-src"); g_object_set(src, "device", "/dev/video0", NULL); GstCaps *caps = gst_caps_from_string("video/x-raw,width=1280,height=720,format=NV12,framerate=30/1"); gst_element_link_filtered(src, downstream_element, caps); gst_caps_unref(caps); - 如果摄像头不支持直接输出NV12,就加格式转换元素,比如
videoconvert或者nvvidconv(NVIDIA硬件加速用):// 在摄像头源和下游元素之间插转换环节 GstElement *convert = gst_element_factory_make("videoconvert", "conv"); // 先约束摄像头输出它支持的格式(比如NV21),再转成NV12 GstCaps *src_caps = gst_caps_from_string("video/x-raw,width=1280,height=720,format=NV21"); gst_element_link_filtered(src, convert, src_caps); gst_caps_unref(src_caps); GstCaps *dst_caps = gst_caps_from_string("video/x-raw,width=1280,height=720,format=NV12"); gst_element_link_filtered(convert, downstream_element, dst_caps); gst_caps_unref(dst_caps); - 先跑
v4l2-ctl --list-formats-ext命令查摄像头支持的所有参数,确认你要的分辨率和格式是否在列表里,不在的话要么换参数,要么加转换。
额外调试技巧
- 启动程序前设置
export GST_DEBUG=3,打开GStreamer调试日志,能看到管道元素的链接状态、Caps协商失败的具体原因,方便定位问题。 - 把你能正常运行的gst-launch命令拆成代码里的元素逐个构建,对比两者的管道结构、属性设置,确保完全一致。
内容的提问来源于stack exchange,提问作者bob
相关产品推荐
相关产品推荐

