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

GStreamer WebRTC作为被叫方无法向浏览器发送音视频流求助

解决GStreamer WebRTC作为被叫方(浏览器发起Offer)时无法推送音视频流的问题

核心问题根源

当浏览器作为Offer发起方、GStreamer的webrtcbin作为Answer回复方时,流推送失败通常源于三个核心问题:

  • Answer SDP未正确声明媒体发送方向
  • 音视频流未正确连接到webrtcbin的发送Pad
  • ICE候选协商未完成或配置错误

关键代码调整

1. 正确处理浏览器Offer与Answer生成流程

确保收到浏览器Offer后,先设置远程描述,再生成并发送Answer,代码示例(基于官方demo修改):

def handle_browser_offer(self, offer_sdp_str):
    # 解析浏览器传来的Offer SDP
    sdp_type = gi.repository.GstWebRTC.WebRTCSDPType.OFFER
    offer = gi.repository.GstWebRTC.WebRTCSessionDescription.new(sdp_type, offer_sdp_str)
    
    # 设置webrtcbin的远程描述
    self.webrtcbin.emit('set-remote-description', offer)
    
    # 触发Answer生成
    promise = gi.repository.Gst.Promise.new()
    self.webrtcbin.emit('create-answer', None, promise)
    promise.interrupt()
    promise.wait()
    
    # 获取并发送Answer到浏览器
    reply = promise.get_reply()
    answer = reply.get_value('answer')
    self.webrtcbin.emit('set-local-description', answer)
    self.send_sdp_to_browser(answer.sdp)

2. 确保音视频流正确对接webrtcbin

预先构建音视频采集/编码管道,并确保管道处于PLAYING状态,且流正确连接到webrtcbin的发送Pad:

# 示例视频管道
video_pipeline = Gst.parse_launch("""
    videotestsrc pattern=ball ! queue ! 
    videoconvert ! video/x-raw,format=I420 ! 
    x264enc tune=zerolatency bitrate=500 speed-preset=superfast ! 
    rtph264pay config-interval=1 ! queue ! webrtcbin.
""")
# 示例音频管道
audio_pipeline = Gst.parse_launch("""
    audiotestsrc ! queue ! 
    audioconvert ! audioresample ! audio/x-raw,rate=48000,channels=2 ! 
    opusenc ! rtpopuspay ! queue ! webrtcbin.
""")
# 启动管道
video_pipeline.set_state(Gst.State.PLAYING)
audio_pipeline.set_state(Gst.State.PLAYING)

注意:不要等到Answer生成后再启动管道,应提前启动确保媒体流就绪。


SDP内容检查要点

对比浏览器Offer和webrtcbin Answer的SDP,重点关注:

  1. 媒体方向匹配:
    • 浏览器Offer的m=video/m=audio行应包含a=recvonly(表示浏览器要接收流)
    • webrtcbin Answer的对应m=行必须包含a=sendonly或a=sendrecv(表示要向浏览器发送流)
  2. Codec一致性:Answer中的Codec编号必须与Offer中浏览器支持的Codec完全匹配,比如浏览器Offer中列出VP8(编号96),Answer就不能只返回H.264。

示例正确的Answer SDP片段:

m=video 9 UDP/TLS/RTP/SAVPF 96
a=sendonly
a=rtpmap:96 VP8/90000


调试日志排查方向

从GStreamer调试日志(建议设置GST_DEBUG=webrtcbin:6,rtp*:6)中重点查找:

  • 是否有on-ice-candidate信号触发,且候选地址已发送到浏览器
  • 是否出现no compatible codecs found错误(Codec不匹配)
  • 是否有pad linked successfully的日志(确认媒体流与webrtcbin连接正常)
  • 是否有ICE连通成功的日志(比如ICE connection state changed to connected)

额外注意事项

  • GStreamer 1.20.3版本中,webrtcbin作为被叫方时,需确保在设置远程描述前,管道已处于READY或PLAYING状态
  • 公网环境下必须配置STUN服务器,确保ICE候选能穿透NAT,两端RTCPeerConnection的ICE服务器配置要一致
  • 浏览器端需确保ontrack回调绑定正确,且未被其他逻辑覆盖

内容的提问来源于stack exchange,提问作者Jim Jin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 13:20:35