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;
}
我已经部署了用于流式传输的服务器 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;
}