You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派推流至公网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网关侧抓取到下发给树莓派的音频流。
排查与解决步骤
  1. 补全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
    '''
    
  2. 校验SDP协商的媒体方向参数
    • 抓包查看webrtcbin与Janus交互的SDP offer/answer报文,确认树莓派侧发出的SDP中a=sendrecv字段是否正确携带,若被误配置为a=sendonly,Janus会判定树莓派无音频接收需求,不会下发对端音频流。
    • 检查参考代码中on-negotiation-needed、offer-created相关回调逻辑,确认不存在手动篡改SDP媒体方向属性的代码。
  3. 核对Janus房间的订阅规则
    • 确认树莓派发起Janus房间join请求时,subscribe参数是否正确填写了网页客户端对应的feed ID,未配置有效订阅的情况下Janus不会转发对应发布者的媒体流。
    • 查看Janus服务端运行日志,确认树莓派用户加入房间后是否成功完成对网页端音频流的订阅,排查是否存在流不存在、权限不足的报错。
  4. 排查ICE穿透与链路连通性
    • 当前仅配置了公共STUN服务器,若树莓派与Janus网关之间存在对称NAT,STUN无法完成反向链路穿透,会导致下行流无法传输。需要在webrtcbin上补充与Janus网关同网络部署的TURN服务器配置,添加turn-server参数并填写正确的地址、认证信息。
    • 开启GStreamer调试日志,设置日志级别GST_DEBUG=webrtcbin:6,查看ICE连接状态是否最终进入connected状态,排查是否存在下行端口连通性失败的报错。
  5. 确认DTLS与SRTP协商状态
    • 从调试日志确认DTLS握手是否双向完成,排查是否存在证书校验失败、密钥协商超时问题;DTLS协商失败会导致SRTP无法解密对端发来的流,也不会触发接收pad创建逻辑,后续解码链路无法拿到媒体数据。
  6. 补充动态pad连接回调
    部分版本的GStreamer webrtcbin不会自动创建接收流的静态pad,需要手动监听pad-added信号,当检测到对端音频RTP pad创建完成时,动态将其与rtpopusdepay的sink pad连接,避免静态pad不匹配导致的流断连。

内容的提问来源于stack exchange,提问作者Luca Simoni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 09:57:27