【发布时间】:2022-01-10 13:57:21
【问题描述】:
我们为 webrtc 双向视频和音频流设置了以下设置:
移动
Android 应用程序使用Google WebRTC 实现 java 包装器。测试了这两个库:
implementation 'org.webrtc:google-webrtc:1.0.+'
implementation 'com.github.webrtc-sdk:android:92.4515.03' // https://github.com/webrtc-sdk/android
RPi
带有WebRTC plugin 的Gstreamer 基于gst-examples 并进行了一些修改。
浏览器
还稍微修改了gst-examples Javascript 实现。它基于原生浏览器 WebRTC 支持。
转
在 Docker 中工作的 Coturn 服务器 (coturn/coturn)。
问题
当从 RPi 调用浏览器或手机调用浏览器时,无论是在本地网络还是通过 Internet(通过 TURN 服务器),一切正常。但是,当尝试通过 Internet 连接 RPi 和 Android 设备时,它会卡住(本地网络也可以)。设备相互通信,协商 SDP 和 ICE 候选,TURN 服务器正确打开连接,但没有音频/视频。
查看Android日志时,第一个区别是没有触发ICE连接变化:
PeerConnectionObserver: onStandardizedIceConnectionChange: CHECKING
也没有
PeerConnectionObserver: onConnectionChange: CONNECTING
这发生在 ICE 候选人交换之前。发送 ICE 候选后,不会与其他设备进行进一步通信,也不会触发任何状态更改。例如在工作案例中的这些:
PeerConnectionObserver: onSelectedCandidatePairChanged: org.webrtc.CandidatePairChangeEvent@a856333
PeerConnectionObserver: onStandardizedIceConnectionChange: CONNECTED
PeerConnectionObserver: onConnectionChange: CONNECTED
PeerConnectionObserver: onIceConnectionChange CONNECTED
[Internal data channel]: onStateChange
PeerConnectionObserver: onDataChannel org.webrtc.DataChannel@b76f6f0
[External data channel]: onStateChange
coturn 日志根本没有显示任何可疑之处。
在进一步调查此问题时提供任何提示或帮助。
编辑 在@RSATom 的建议下,我们更仔细地查看了正在发送的 ICE 和 SDP 消息,并没有发现任何差异。对于通过 Internet 和本地的移动 RPi 通信,SDP 是相同的。唯一的区别是随机生成的 id。 ICE 也没有太大区别。第一个发送者(提议者)是相同的,而回答者则略有不同,因为它包含 TURN 详细信息:
通过互联网
video0:0:candidate:228040959 1 udp 2122260223 10.111.215.156 53556 typ host generation 0 ufrag 3SNh network-id 3 network-cost 900::UNKNOWN
video0:0:candidate:559267639 1 udp 2122202367 ::1 48566 typ host generation 0 ufrag 3SNh network-id 2::UNKNOWN
video0:0:candidate:1510613869 1 udp 2122129151 127.0.0.1 41279 typ host generation 0 ufrag 3SNh network-id 1::UNKNOWN
video0:0:candidate:1876313031 1 tcp 1518222591 ::1 46051 typ host tcptype passive generation 0 ufrag 3SNh network-id 2::UNKNOWN
video0:0:candidate:344579997 1 tcp 1518149375 127.0.0.1 60259 typ host tcptype passive generation 0 ufrag 3SNh network-id 1::UNKNOWN
video0:0:candidate:842163049 1 udp 1686052607 31.0.91.196 6742 typ srflx raddr 10.111.215.156 rport 53556 generation 0 ufrag 3SNh network-id 3 network-cost 900:stun:3.70.23.20:3478:UNKNOWN
video0:0:candidate:593469510 1 udp 41885439 172.31.0.169 14307 typ relay raddr 31.0.91.196 rport 6742 generation 0 ufrag 3SNh network-id 3 network-cost 900:turn:3.70.23.20:3478?transport=udp:UNKNOWN
通过本地 WiFi
video0:0:candidate:2858526953 1 udp 2122260223 192.168.0.21 38123 typ host generation 0 ufrag rwx/ network-id 3 network-cost 10::UNKNOWN
video0:0:candidate:559267639 1 udp 2122202367 ::1 52058 typ host generation 0 ufrag rwx/ network-id 2::UNKNOWN
video0:0:candidate:1510613869 1 udp 2122129151 127.0.0.1 39469 typ host generation 0 ufrag rwx/ network-id 1::UNKNOWN
video0:0:candidate:842163049 1 udp 1686052607 178.235.191.135 13607 typ srflx raddr 192.168.0.21 rport 38123 generation 0 ufrag rwx/ network-id 3 network-cost 10:stun:3.70.23.20:3478:UNKNOWN
video0:0:candidate:1876313031 1 tcp 1518222591 ::1 51551 typ host tcptype passive generation 0 ufrag rwx/ network-id 2::UNKNOWN
video0:0:candidate:344579997 1 tcp 1518149375 127.0.0.1 41007 typ host tcptype passive generation 0 ufrag rwx/ network-id 1::UNKNOWN
video0:0:candidate:593469510 1 udp 41885439 172.31.0.169 13744 typ relay raddr 178.235.191.135 rport 13607 generation 0 ufrag rwx/ network-id 3 network-cost 10:turn:3.70.23.20:3478?transport=udp:UNKNOWN
ICE 消息的顺序似乎没有保留。
完整日志的差异(互联网左侧,本地右侧):https://www.diffchecker.com/elEA6rkJ
ICE 消息差异:https://www.diffchecker.com/C1TzPcMm
【问题讨论】:
-
您使用的是什么 GStreamer 版本?某些版本中存在一些错误...
-
1.18.5 这似乎是最新版本。但是版本控制是一团糟
-
你使用“notify::ice-gathering-state”通知吗?如果是,它甚至在 1.18.5 中都已损坏。
-
我错了
notify::ice-gathering-state已在 1.17.1...
标签: android webrtc gstreamer turn