使用GStreamer通过UDP传输RAW视频出现协商失败问题求助
问题分析与解决方案
核心问题根源
出现not-negotiated错误的本质是源端发送的RAW视频RTP流的Caps参数与接收端预期的参数不匹配,具体原因有两点:
- 源端未强制约束解码后RAW视频的格式、帧率等关键参数,
avdec_h264输出的原始视频格式可能并非接收端要求的I420,导致rtpvrawpay打包的RTP流Caps信息不符合接收端预期。 - 接收端的Caps参数冗余(包含动态生成的
ssrc、timestamp等),且未与源端实际输出的RAW视频参数严格对齐。
修正后的管道命令
源端管道(强制约束RAW视频参数)
gst-launch-1.0 -v -e filesrc location=input.avi ! h264parse ! avdec_h264 ! videoconvert ! video/x-raw,format=I420,width=1280,height=720,framerate=60/1 ! rtpvrawpay ! udpsink host=192.168.1.167 port=7001
- 新增
videoconvert+ 明确的video/x-rawCaps,确保解码后输出的是接收端需要的I420格式、1280x720分辨率、60帧/秒的RAW视频,让rtpvrawpay能基于标准参数打包RTP流。
接收端管道(简化并对齐Caps参数)
gst-launch-1.0 -v -e udpsrc port=7001 ! "application/x-rtp,media=video,clock-rate=90000,encoding-name=RAW,sampling=YCbCr-4:2:0,depth=8,width=1280,height=720,framerate=60/1,payload=96" ! rtpvrawdepay ! videoconvert ! video/x-raw,format=I420 ! filesink location=output.y4m
- 移除所有动态生成的参数(如
ssrc、timestamp-offset),只保留固定的、与源端对齐的关键Caps参数;同时简化udpsrc的写法(无需uri,直接用port更简洁)。
额外注意事项
RAW视频的码率极高(1280x720@60的I420格式码率约83Mbps),即使协商成功后,局域网UDP可能出现丢包问题,可通过以下方式优化:
- 源端
udpsink添加buffer-size=67108864参数增大发送缓冲区 - 接收端
udpsrc添加buffer-size=67108864参数增大接收缓冲区
内容的提问来源于stack exchange,提问作者dandan13
相关产品推荐
相关产品推荐

