【发布时间】:2015-12-31 22:41:05
【问题描述】:
我正在尝试使用 WebRTC Native Code package for Android(即不使用 WebView)在 Android 应用程序中实现 3 路视频聊天。我使用 node.js 编写了一个信令服务器,并使用客户端应用程序中的 Gottox socket.io java client 库连接到服务器、交换 SDP 数据包并建立双向视频聊天连接。
但是,现在我遇到了超出三方通话的问题。 WebRTC 本机代码包附带的 AppRTCDemo 应用仅演示了 2 向调用(如果第 3 方尝试加入房间,则会返回“房间已满”消息)。
根据this answer(与Android 无关),我应该通过创建多个PeerConnections 来做到这一点,因此每个聊天参与者都会连接到其他2 个参与者。
但是,当我创建多个 PeerConnectionClient(一个包装 PeerConection 的 Java 类,它在 libjingle_peerconnection_so.so 中的本机端实现)时,由于与两者发生冲突,库内部会引发异常他们试图访问相机:
E/VideoCapturerAndroid(21170): startCapture failed
E/VideoCapturerAndroid(21170): java.lang.RuntimeException: Fail to connect to camera service
E/VideoCapturerAndroid(21170): at android.hardware.Camera.native_setup(Native Method)
E/VideoCapturerAndroid(21170): at android.hardware.Camera.<init>(Camera.java:548)
E/VideoCapturerAndroid(21170): at android.hardware.Camera.open(Camera.java:389)
E/VideoCapturerAndroid(21170): at org.webrtc.VideoCapturerAndroid.startCaptureOnCameraThread(VideoCapturerAndroid.java:528)
E/VideoCapturerAndroid(21170): at org.webrtc.VideoCapturerAndroid.access$11(VideoCapturerAndroid.java:520)
E/VideoCapturerAndroid(21170): at org.webrtc.VideoCapturerAndroid$6.run(VideoCapturerAndroid.java:514)
E/VideoCapturerAndroid(21170): at android.os.Handler.handleCallback(Handler.java:733)
E/VideoCapturerAndroid(21170): at android.os.Handler.dispatchMessage(Handler.java:95)
E/VideoCapturerAndroid(21170): at android.os.Looper.loop(Looper.java:136)
E/VideoCapturerAndroid(21170): at org.webrtc.VideoCapturerAndroid$CameraThread.run(VideoCapturerAndroid.java:484)
在尝试建立连接之前初始化本地客户端时会发生这种情况,因此它与 node.js、socket.io 或任何信号服务器无关。
如何让多个 PeerConnections 共享摄像头,以便我可以将同一视频发送给多个同行?
我的一个想法是实现某种单例相机类来替换可以在多个连接之间共享的 VideoCapturerAndroid,但我什至不确定这是否可行,我想知道是否有办法在我开始在图书馆内部进行黑客攻击之前,使用 API 进行 3 向调用。
有可能吗?如果可以,怎么做?
更新:
我尝试在多个 PeerConnectionClients 之间共享一个 VideoCapturerAndroid 对象,只为第一个连接创建它并将其传递给后续连接的初始化函数,但这导致了这个“Capturer 只能使用一次!”从 VideoCapturer 对象为第二个对等连接创建第二个 VideoTrack 时出现异常:
E/AndroidRuntime(18956): FATAL EXCEPTION: Thread-1397
E/AndroidRuntime(18956): java.lang.RuntimeException: Capturer can only be taken once!
E/AndroidRuntime(18956): at org.webrtc.VideoCapturer.takeNativeVideoCapturer(VideoCapturer.java:52)
E/AndroidRuntime(18956): at org.webrtc.PeerConnectionFactory.createVideoSource(PeerConnectionFactory.java:113)
E/AndroidRuntime(18956): at com.example.rtcapp.PeerConnectionClient.createVideoTrack(PeerConnectionClient.java:720)
E/AndroidRuntime(18956): at com.example.rtcapp.PeerConnectionClient.createPeerConnectionInternal(PeerConnectionClient.java:482)
E/AndroidRuntime(18956): at com.example.rtcapp.PeerConnectionClient.access$20(PeerConnectionClient.java:433)
E/AndroidRuntime(18956): at com.example.rtcapp.PeerConnectionClient$2.run(PeerConnectionClient.java:280)
E/AndroidRuntime(18956): at android.os.Handler.handleCallback(Handler.java:733)
E/AndroidRuntime(18956): at android.os.Handler.dispatchMessage(Handler.java:95)
E/AndroidRuntime(18956): at android.os.Looper.loop(Looper.java:136)
E/AndroidRuntime(18956): at com.example.rtcapp.LooperExecutor.run(LooperExecutor.java:56)
尝试在 PeerConnectionClients 之间共享 VideoTrack 对象导致本机代码出现此错误:
E/libjingle(19884): Local fingerprint does not match identity.
E/libjingle(19884): P2PTransportChannel::Connect: The ice_ufrag_ and the ice_pwd_ are not set.
E/libjingle(19884): Local fingerprint does not match identity.
E/libjingle(19884): Failed to set local offer sdp: Failed to push down transport description: Local fingerprint does not match identity.
在 PeerConnectionClients 之间共享 MediaStream 会导致应用突然关闭,而 Logcat 中不会出现任何错误消息。
【问题讨论】:
-
请问“3路视频”是什么意思?
-
@SilentKnight 3 人视频电话会议
-
@Samgak 嗨。你能分享完整的解决方案吗?我无法连接多个音频。
标签: java android android-camera webrtc videochat