树莓派推流至公网Janus视频房间 无法接收Web端音频求助
问题背景
- 实现目标:将树莓派流推送到公网Janus网关的视频房间,基于Python3调用GStreamer完成Chrome网页客户端与树莓派4设备的1对1音频连接,开发参考gstwebrtc-demos项目中的janusvideoroom.py逻辑实现。
- 当前使用的GStreamer管道配置:
PIPELINE_DESC = ''' webrtcbin name=sendrecv stun-server=stun://stun.l.google.com:19302 alsasrc device=hw:1 ! audioconvert ! audioresample ! queue ! opusenc ! rtpopuspay ! queue ! application/x-rtp,media=audio,encoding-name=OPUS,payload=96 ! sendrecv. '''
- 已确认前提:树莓派本地音频输出硬件、驱动工作正常,可正常播放MP4测试流。
故障现象
- 正向链路工作正常:连接成功建立,网页客户端可正常识别树莓派用户上线,能清晰听到树莓派上传的音频流。
- 反向链路异常:网页客户端发送给树莓派的音频无法正常播放,且无法从Janus网关侧抓取到下发给树莓派的音频流。
排查与解决步骤
- 补全webrtcbin的入站媒体处理链路
你当前的管道仅配置了出站音频发送逻辑,完全没有添加webrtcbin接收对端媒体流后的解码、输出分支,webrtcbin不会自动将收到的RTP流路由到本地音频输出设备,这是最高发的漏配问题。
修正后的管道需要补充入站处理段,参考配置如下:PIPELINE_DESC = ''' webrtcbin name=sendrecv stun-server=stun://stun.l.google.com:19302 # 原有出站发送链路保留 alsasrc device=hw:1 ! audioconvert ! audioresample ! queue ! opusenc ! rtpopuspay ! queue ! application/x-rtp,media=audio,encoding-name=OPUS,payload=96 ! sendrecv. # 新增入站接收、解码、输出链路 sendrecv. ! queue ! rtpopusdepay ! opusdec ! audioconvert ! audioresample ! alsasink device=hw:1 ''' - 校验SDP协商的媒体方向参数
- 抓包查看webrtcbin与Janus交互的SDP offer/answer报文,确认树莓派侧发出的SDP中
a=sendrecv字段是否正确携带,若被误配置为a=sendonly,Janus会判定树莓派无音频接收需求,不会下发对端音频流。 - 检查参考代码中
on-negotiation-needed、offer-created相关回调逻辑,确认不存在手动篡改SDP媒体方向属性的代码。
- 抓包查看webrtcbin与Janus交互的SDP offer/answer报文,确认树莓派侧发出的SDP中
- 核对Janus房间的订阅规则
- 确认树莓派发起Janus房间join请求时,
subscribe参数是否正确填写了网页客户端对应的feed ID,未配置有效订阅的情况下Janus不会转发对应发布者的媒体流。 - 查看Janus服务端运行日志,确认树莓派用户加入房间后是否成功完成对网页端音频流的订阅,排查是否存在流不存在、权限不足的报错。
- 确认树莓派发起Janus房间join请求时,
- 排查ICE穿透与链路连通性
- 当前仅配置了公共STUN服务器,若树莓派与Janus网关之间存在对称NAT,STUN无法完成反向链路穿透,会导致下行流无法传输。需要在webrtcbin上补充与Janus网关同网络部署的TURN服务器配置,添加
turn-server参数并填写正确的地址、认证信息。 - 开启GStreamer调试日志,设置日志级别
GST_DEBUG=webrtcbin:6,查看ICE连接状态是否最终进入connected状态,排查是否存在下行端口连通性失败的报错。
- 当前仅配置了公共STUN服务器,若树莓派与Janus网关之间存在对称NAT,STUN无法完成反向链路穿透,会导致下行流无法传输。需要在webrtcbin上补充与Janus网关同网络部署的TURN服务器配置,添加
- 确认DTLS与SRTP协商状态
- 从调试日志确认DTLS握手是否双向完成,排查是否存在证书校验失败、密钥协商超时问题;DTLS协商失败会导致SRTP无法解密对端发来的流,也不会触发接收pad创建逻辑,后续解码链路无法拿到媒体数据。
- 补充动态pad连接回调
部分版本的GStreamer webrtcbin不会自动创建接收流的静态pad,需要手动监听pad-added信号,当检测到对端音频RTP pad创建完成时,动态将其与rtpopusdepay的sink pad连接,避免静态pad不匹配导致的流断连。
内容的提问来源于stack exchange,提问作者Luca Simoni
相关产品推荐
相关产品推荐

