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

GCP下用Kurento、Coturn Docker镜像实现RTSP转WebRTC刷新浏览器拉流失败问题

问题排查与解决方案

1. 优先排查前端WebRTC会话清理逻辑

  • 浏览器刷新时,旧的RTCPeerConnection实例没有正常调用close()方法销毁,导致前一次会话的TURN绑定信息残留在浏览器ICE缓存中,第二次发起拉流时浏览器复用了已失效的ICE状态,跳过了TURN握手流程
  • 验证方法:打开Chrome浏览器chrome://webrtc-internals面板,刷新页面前后对比ICE候选、TURN绑定状态,确认第二次拉流时是否未触发STUN/TURN请求
  • 修复方案:在React组件的useEffect清理钩子/页面beforeunload事件中,主动调用所有RTCPeerConnection实例的close()方法,清空本地ICE缓存、SDP会话信息

2. 排查Kurento Media Server侧资源残留问题

  • 前一次拉流会话结束后,Kurento没有正常销毁对应的WebRtcEndpoint、媒体管道资源,导致相同用户/相同流标识的第二次会话请求被判定为重复请求,未触发新的TURN协商流程
  • 验证方法:开启Kurento debug日志,刷新页面前后对比/kurento/api/jsonrpc请求日志,确认第二次拉流时Kurento是否创建了新的WebRtcEndpoint实例
  • 修复方案:
    • 后端Node.js服务监听客户端断开事件(如WebSocket断开、心跳超时),主动调用Kurento API释放对应媒体管道资源
    • 给docker-compose.yml中kms服务添加以下环境变量,强制超时自动释放闲置端点:
      - KMS_WEBRTC_ENDPOINT_AUDIO_CLOSE_TIMEOUT=5
      - KMS_WEBRTC_ENDPOINT_VIDEO_CLOSE_TIMEOUT=5
      

3. 修正Coturn配置缺陷

当前turnserver.conf缺少必要的会话老化配置,导致旧的绑定关系未及时清理,新的同IP客户端请求被拦截:

  • 在turnserver.conf中添加以下配置:
    # 会话老化时间,单位秒,清理失效的TURN绑定
    stale-nonce=300
    allocation-lifetime=120
    # 允许同一IP创建多个会话
    no-strict-origin
    
  • 另外检查GCP防火墙规则,确认3478/udp、3478/tcp、49152-65535/udp(Coturn默认中继端口范围)全部对外部访问开放

4. 排查信令交互逻辑问题

  • 第二次拉流时,前端可能未正确向后端请求新的SDP Offer/Answer,而是复用了前一次会话的SDP信息,导致ICE协商跳过了TURN流程
  • 验证方法:抓取WebSocket/HTTP信令请求,对比第一次、第二次拉流时的SDP内容、ICE候选列表是否一致
  • 修复方案:每次拉流请求都强制生成新的SDP Offer,强制重新收集ICE候选,禁用ICE候选复用逻辑

快速验证方法

修改配置后按以下顺序测试:

  1. 重启所有Docker服务
  2. 首次拉流验证正常
  3. 刷新页面立即拉流,若无法播放,查看chrome://webrtc-internals中ICE状态、Coturn日志是否有新的请求进入
  4. 若Coturn无新请求,100%是前端会话未清理问题;若有请求但失败,是Kurento或Coturn配置问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 14:15:01