使用GStreamer时如何将rtph264pay的RTP负载类型改为35?
解决GStreamer rtph264pay设置pt=35被覆盖为96的问题
从你的调试日志和描述来看,核心问题是GStreamer的RTP协商机制优先采用了对等端caps中指定的payload类型,而非你手动设置的pt=35。当你设置0-95之间的pt值时(这类值包含部分预定义的RTP负载类型),GStreamer的协商逻辑会默认匹配H264对应的标准动态负载类型96,从而覆盖你的手动设置;而95以上属于纯动态负载类型范围,没有预定义冲突,所以设置能正常生效。
非侵入式解决办法:添加Caps Filter强制指定RTP负载类型
你完全不需要修改GStreamer的源码或pt属性的设置函数,只需要在rtph264pay之后添加一个caps filter,强制指定RTP流的payload为35,就能覆盖协商逻辑的默认行为。
修改后的命令行:
video/x-h264,width=352,height=288,framerate=(fraction)25/1 ! identity sleep-time=15000 sync=true ! h264parse ! rtph264pay config-interval=1 pt=35 ! application/x-rtp,payload=35 ! queue ! udpsink sync=true
Python代码中的对应修改:
在你的gst.parse_launch()字符串中加入! application/x-rtp,payload=35片段,示例如下:
pipeline = gst.parse_launch('video/x-h264,width=352,height=288,framerate=(fraction)25/1 ! identity sleep-time=15000 sync=true ! h264parse ! rtph264pay config-interval=1 pt=35 ! application/x-rtp,payload=35 ! queue ! udpsink sync=true')
原理说明
添加这个caps filter后,会强制约束下游的RTP流必须使用payload=35,阻断了协商逻辑中使用peer caps默认值的路径。此时GStreamer会严格遵循你指定的负载类型,Wireshark抓包就能看到payload类型为35,调试日志也会显示使用你设置的pt值而非peer的96。
内容的提问来源于stack exchange,提问作者Kristofer
相关产品推荐
相关产品推荐

