Janus 网关视频室在 60 秒后取消连接

Janus gateway videoroom cancels connection after 60 seconds

"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 的 WebSocket 连接中断相匹配API。

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

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

不确定这里出了什么问题。

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

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

RTFM:Janus 的 websocket 连接需要每 <60 秒保持活动状态。

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

您需要使用相同的“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);