Sto cercando di implementare la chat video a 3 vie all'interno di un'app Android utilizzando lo WebRTC Native Code package for Android (ovvero non utilizzando una WebView). Ho scritto un server di segnalazione usando node.js e ho usato la libreria Gottox socket.io java client all'interno dell'app client per connettermi al server, scambiare pacchetti SDP e stabilire una connessione di chat video a 2 vie.Come implementare la videochat di videoconferenza a 3 vie con il codice nativo WebRTC per Android?
Tuttavia ora ho problemi ad andare oltre a una chiamata a 3 vie. L'app AppRTCDemo fornita con il pacchetto di codice nativo WebRTC mostra solo le chiamate bidirezionali (se una terza parte tenta di entrare in una stanza viene restituito un messaggio "stanza piena").
Secondo this answer (che non si riferisce specificamente ad Android), dovrei farlo creando più PeerConnections, in modo che ogni partecipante di chat si connetterà agli altri 2 partecipanti.
Tuttavia, quando creo più di un PeerConnectionClient (una classe Java che racchiude un PeerConection, che è implementato sul lato nativo in libjingle_peerconnection_so.so), esiste un'eccezione generata dalla libreria risultante da un conflitto con entrambi di loro cercando di accedere alla videocamera:
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)
Ciò si verifica quando l'inizializzazione del client locale ancor prima di tentare di stabilire una connessione quindi non è legato alla node.js, socket.io o una qualsiasi delle cose server di segnalazione.
Come ottengo più PeerConnections per condividere la fotocamera in modo che possa inviare lo stesso video a più di un pari?
Un'idea che avevo era di implementare una sorta di classe di telecamere singleton per sostituire VideoCapturerAndroid che potrebbe essere condivisa tra più connessioni, ma non sono nemmeno sicuro che funzionerebbe e mi piacerebbe sapere se c'è un modo per effettuare chiamate a 3 vie utilizzando l'API prima di iniziare a fare hacking all'interno della libreria.
E 'possibile e se sì, come?
Aggiornamento:
Ho provato condivisione di un oggetto VideoCapturerAndroid tra più PeerConnectionClients, creando per la prima connessione solo e passando nella funzione di inizializzazione per le successive, ma che portato a questa "Capturer può solo essere preso una volta! " eccezione durante la creazione di un secondo VideoTrack dall'oggetto VideoCapturer per la seconda connessione peer:
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)
che condividono l'oggetto VideoTrack tra PeerConnectionClients ha provocato questo errore dal codice nativo:
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.
Condivisione della MediaStream tra i risultati PeerConnectionClients l'app si chiude bruscamente, senza alcun messaggio di errore visualizzato nel logcat.
Posso chiedere cosa significa "video a 3 vie"? – SilentKnight
@ SilentKnight una videoconferenza con 3 partecipanti – samgak
@ Samgak Ciao. Puoi condividere la soluzione completa? Ho avuto problemi nel collegare più audio. – GensaGames