【问题标题】:Janus gateway videoroom cancels connection after 60 secondsJanus 网关视频室在 60 秒后取消连接
【发布时间】:2020-09-05 01:20:30
【问题描述】:
"peerConnection new connection state: connected"
{
   "janus": "webrtcup",
   "session_id": 3414770196795261,
   "sender": 4530256184020316
}
{
   "janus": "media",
   "session_id": 3414770196795261,
   "sender": 4530256184020316,
   "type": "audio",
   "receiving": true
}

... 1 minute passes

"peerConnection new connection state: disconnected"
{
   "janus": "timeout",
   "session_id": 3414770196795261
}
"peerConnection new connection state: failed"

查看pastebin查看完整日志。

我正在尝试加入我的 Janus 服务器上的视频室。所有请求似乎都成功了,我的设备显示连接的 WebRTC 状态大约一分钟,然后连接因超时而被取消。
WebRTC 连接中断似乎与与 Janus 的 API 中断的 WebSocket 连接相匹配。

我尝试每 10 秒添加一个心跳 WebSocket 消息,但这没有帮助。我是

  1. 加入房间
  2. 接收我当地的 SDP plus 候选人
  3. 使用所述 SDP 配置房间
  4. 收到 janus 的答复
  5. 通过我的 WebRTC 对等连接接受该答案。

不知道这里出了什么问题。

我还尝试在 Janus 配置中设置 STUN 服务器,但无济于事。同样的问题。

也将服务器日志添加到 pastebin。

【问题讨论】:

    标签: webrtc sdp janus-gateway


    【解决方案1】:

    RTFM:Janus 的 websocket 连接需要每

    需要指出的一个重要方面与 WebSockets Janus 通道的保持活动消息有关。只要 60 秒内没有不活动,Janus 会话就会保持活动状态:如果在该时间范围内没有收到任何消息,则服务器会断开会话。会话中的正常活动通常足以防止这种情况发生;对于消息传递方面的更长时间的不活动,在纯 HTTP 上,会话通常通过常规的长轮询请求保持活动状态,只要涉及会话,这些请求就充当活动。当使用 WebSockets 时,这种帮助显然是不可能的,其中单个通道既用于发送请求,也用于接收事件和响应。出于这个原因,应该定期触发一条用于保持 Janus 会话活动的临时消息。 Link.

    【讨论】:

      【解决方案2】:

      您需要发送具有相同“session_id”的“keepalive”消息以保持会话继续进行。 Janus 在 60 秒后关闭会话。

      寻找实现:https://janus.conf.meetecho.com/docs/rest.html

      或者按我的方式做:我在一个可运行的处理程序中每 30 秒做一次。

      private Handler mHandler;
      private Runnable fireKeepAlive = new Runnable() {
          @Override
          public void run() {
      
              String transactionId = getRandomStringId();
              JSONObject request = new JSONObject();
              try {
                  request.put("janus", "keepalive");
                  request.put("session_id", yourSessionId);
                  request.put("transaction", transactionId);
              } catch (JSONException e) {
                  e.printStackTrace();
              }
              myWebSocketConnection.sendTextMessage(request.toString());
      
              mHandler.postDelayed(fireKeepAlive, 30000);
          }
      };
      

      然后在 OnCreate() 中

      mHandler = new Handler();
      

      然后在 WebSocket 连接打开的地方调用它:

      mHandler.post(fireKeepAlive);
      

      一定要在销毁时移除回调

      mHandler.removeCallbacks(fireKeepAlive);
      

      【讨论】:

      • 正确答案,但语言错误。我没有使用JS。可能仍然对其他偶然发现此问题的人有所帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-07
      • 2013-01-02
      • 2016-12-16
      • 2023-03-03
      • 2015-03-31
      • 2020-03-31
      相关资源
      最近更新 更多