如何实现3路电话会议视频聊天与WebRTC Native Code for Android?
我正在尝试使用Android的WebRTC Native Code包在Android应用程序中实现3路视频聊天(即不使用WebView)。我使用node编写了一个信令服务器.js并使用客户端应用程序中的Gottox socket.io java客户端库连接到服务器,交换SDP数据包并建立双向视频聊天连接。
但是,现在我遇到了问题,超出了3路通话的范围。WebRTC 本机代码包附带的 AppRTCDemo 应用仅演示双向调用(如果第三方尝试加入聊天室,则会返回“聊天室已满”消息)。
根据这个答案(与Android没有特别关系),我应该通过创建多个PeerConnections来做到这一点,因此每个聊天参与者将连接到其他2个参与者。
但是,当我创建多个 PeerConnectionClient(一个 Java 类,它包装了一个 PeerConection,在 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 或任何信令服务器无关。
如何获取多个对等连接来共享摄像头,以便我可以将同一视频发送给多个对等方?
我的一个想法是实现某种单例相机类来取代可以在多个连接之间共享的VideoCapturerAndroid,但我甚至不确定这是否有效,我想知道在我开始在库内进行黑客攻击之前,是否有一种方法可以使用API进行3路调用。
是否可能,如果是,如何实现?
更新:
我尝试在多个PeerConnectionClients之间共享一个VideoCapturerAndroid对象,仅为第一个连接创建它,然后将其传递到后续连接的初始化函数中,但是当从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 中不会出现任何错误消息。