Android webrtc - ICE URI 中的传输参数无效

Android webrtc - Invalid transport parameter in ICE URI

我已经部署了用于流式传输的服务器 https://github.com/webrtc/apprtc/blob/master/README.md

这是 Android 应用: https://github.com/appsroxcom/WebRTCAndroid

如果我连接不同的浏览器,它可以工作,但 Android 应用程序崩溃。 Android 应用程序似乎没有创建 PeerConnection。 错误是: 2021-10-16 19:11:02.802 9157-9459/com.example.webrtc.android A/libc:致命信号 11 (SIGSEGV),代码 1,tid 9459 中的故障地址 0x0(pool-1-thread- 1)

我看到这个错误的原因是这样的: 2021-10-16 18:47:49.341 32549-32605/com.example.webrtc.android W/ice_server_parsing.cc:(第 182 行):ICE URI 中的传输参数无效:["turn:mydomain.com :3478"]

我不知道如何为 Android 解决这个问题。我尝试了不同的轮流配置,包括带有 ?transport

的配置
"urls": [
  "turn:hostnameForYourTurnServer:19305?transport=udp",
  "turn:hostnameForYourTurnServer:19305?transport=tcp"
],

我该怎么办?

谢谢

apprtcsrc/app_engine/constants.py中,urls是一个json数组

# ICE_SERVER_OVERRIDE  = [
#   {
#     "urls": [
#       "turn:hostname/IpToTurnServer:19305?transport=udp",
#       "turn:hostname/IpToTurnServer:19305?transport=tcp"
#     ],
#     "username": "TurnServerUsername",
#     "credential": "TurnServerCredentials"
#   },
#   {
#     "urls": [
#       "stun:hostname/IpToStunServer:19302"
#     ]
#   }
# ]

但 android 应用将其视为 json 字符串 here

String url = server.getString("urls");

所以您应该将 android 代码更改为

private List<PeerConnection.IceServer> iceServersFromPCConfigJSON(String pcConfig)
      throws JSONException {
    JSONObject json = new JSONObject(pcConfig);
    JSONArray servers = json.getJSONArray("iceServers");
    List<PeerConnection.IceServer> ret = new ArrayList<>();
    for (int i = 0; i < servers.length(); ++i) {
      JSONObject server = servers.getJSONObject(i);
      JSONArray urls = server.getJSONArray("urls");
      String username = server.has("username") ? server.getString("username") : "";
      String credential = server.has("credential") ? server.getString("credential") : "";
      for (int j = 0; j < urls.length(); ++j) {
        String url = urls.getString(j);
        PeerConnection.IceServer turnServer =
                PeerConnection.IceServer.builder(url)
                        .setUsername(username)
                        .setPassword(credential)
                        .createIceServer();
        ret.add(turnServer);
      }
    }
    return ret;
  }