基于GStreamer的UDP RTSP流接收端无画面问题排查
我尝试用GStreamer搭建基于UDP的静态图片流推送,流程为单张图片 → UDP流(GStreamer实现)→ 接收端无画面。已通过GStreamer诊断工具验证安装正常,且交换过收发端设备,但接收端始终无法显示画面,终端也无明显错误提示。以下是收发端的配置及输出:
发送端(服务器)
- 运行环境:Ubuntu 16.04,GStreamer 1.8.3
- 配置说明:参考GitHub帖子修改,将
x264enc替换为avenc_h263,本机IP为192.168.3.30 - 执行命令:
gst-launch-1.0 -v multifilesrc location=./IMG_7995.JPG loop=true ! jpegdec ! videoconvert ! videoscale ! videorate ! video/x-raw,framerate=30/1 ! avenc_h263 ! rtph263ppay pt=96 ! udpsink host=192.168.3.30 port=6000
- 终端输出:
** (gst-launch-1.0:11311): CRITICAL **: gst_ffmpeg_cfg_set_property: assertion 'qdata->size == sizeof (gint64)' failed Setting pipeline to PAUSED ... Pipeline is PREROLLING ... /GstPipeline:pipeline0/GstJpegDec:jpegdec0.GstPad:src: caps = "video/x-raw\,\ format\=\(string\)I420\,\ width\=\(int\)4032\,\ height\=\(int\)3024\,\ interlace-mode\=\(string\)progressive\,\ pixel-aspect-ratio\=\(fraction\)1/1\,\ chroma-site\=\(string\)mpeg2\,\ colorimetry\=\(string\)1:4:0:0\,\ framerate\=\(fraction\)0/1"
接收端(客户端)
- 运行环境:Ubuntu 18.04,GStreamer 1.14.5
- 配置说明:参考GStreamer示例修改,将
ffdec_h263替换为avdec_h263,因元素不存在错误移除queue-delay=0 - 执行命令:
gst-launch-1.0 udpsrc port=6000 ! application/x-rtp, clock-rate=90000,payload=96 ! rtph263pdepay ! avdec_h263 ! xvimagesink
- 终端输出:
Setting pipeline to PAUSED ... Pipeline is live and does not need PREROLL ... Setting pipeline to PLAYING ... New clock: GstSystemClock
问题分析与解决建议
1. avenc_h263编码器兼容性问题
发送端出现的gst_ffmpeg_cfg_set_property断言错误,说明GStreamer 1.8.3版本的avenc_h263存在配置兼容性问题,对高分辨率输入(4032×3024)适配性差,可能导致编码器无法正常输出码流。
修复方案:
改用兼容性更好的x264enc编码器,同时限制输出分辨率避免性能瓶颈:
# 发送端修改后命令 gst-launch-1.0 -v multifilesrc location=./IMG_7995.JPG loop=true ! jpegdec ! videoconvert ! videoscale ! video/x-raw,width=1280,height=720,framerate=30/1 ! x264enc tune=zerolatency ! rtph264pay pt=96 ! udpsink host=192.168.3.30 port=6000
接收端对应修改为适配H.264的管线:
gst-launch-1.0 udpsrc port=6000 ! application/x-rtp,clock-rate=90000,payload=96 ! rtph264depay ! avdec_h264 ! videoconvert ! xvimagesink
2. 视频Caps协商异常
发送端jpegdec输出的framerate=0/1,与后续指定的30/1帧率未完成正确协商,导致编码器无法生成稳定码流。需在videoscale后强制指定完整的视频参数,确保Caps传递一致。
修复方案:
移除冗余的videorate,直接在videoscale后添加明确的视频Caps:
! videoscale ! video/x-raw,width=1280,height=720,framerate=30/1 !
3. 接收端缺少格式转换元素
GStreamer 1.14.5中xvimagesink对部分视频格式支持有限,avdec_h263输出的格式可能无法直接显示,需添加videoconvert完成格式适配:
# 接收端修改后命令 gst-launch-1.0 udpsrc port=6000 ! application/x-rtp,clock-rate=90000,payload=96 ! rtph263pdepay ! avdec_h263 ! videoconvert ! xvimagesink
4. 发送端Pipeline预滚未完成
发送端输出停留在Pipeline is PREROLLING ...,说明管线未完成预滚,编码器未触发码流输出。可给multifilesrc添加force-idle=false参数强制激活管线:
multifilesrc location=./IMG_7995.JPG loop=true force-idle=false !
5. UDP目标IP配置问题
如果收发端是不同设备,发送端udpsink的host需改为接收端的IP地址,而非本机IP;若为同一机器则无需修改,跨设备时可改用广播地址(如192.168.3.255)确保接收端能收到流。
内容的提问来源于stack exchange,提问作者Cloud Cho

