2017-05-07 1 views
0

私はAndroidとWebRTCが新しく、ウェブサイトとAndroidデバイスの間でP2Pビデオ接続を行うのに苦労しています。私はすでに2つのウェブサイト間でこの作業を行っているので、私の問題はAndroid側にあると確信しています。WebRTC Android - createPeerConnection()は常にnullを返します

PeerConnectionFactory.createPeerConnection()を使用して新しいPeerConnectionオブジェクトを作成しようとすると、結果は常にnullになります。私はWebRTCのリリースvesion M58を使用しています。

PeerConnection.IceServer iceServer = new PeerConnection.IceServer("http://stun.stun.l.google.com:19302/"); 
List<PeerConnection.IceServer> servers = new ArrayList<PeerConnection.IceServer>(); 
servers.add(iceServer); 

// Media Constraints 
final MediaConstraints mediaConstraints = new MediaConstraints(); 
mediaConstraints.mandatory.add(new MediaConstraints.KeyValuePair("OfferToReceiveAudio", "true")); 
mediaConstraints.mandatory.add(new MediaConstraints.KeyValuePair("OfferToReceiveVideo", "true")); 
mediaConstraints.optional.add(new MediaConstraints.KeyValuePair("DtlsSrtpKeyAgreement", "true")); 

// Set up remote rendering stuff 
rootEGLBase = EglBase.create(); 
svr = (SurfaceViewRenderer) findViewById(R.id.remote_video); 
svr.init(rootEGLBase.getEglBaseContext(), null); 
svr.setScalingType(RendererCommon.ScalingType.SCALE_ASPECT_FIT); 
svr.setZOrderMediaOverlay(true); 
svr.setEnableHardwareScaler(true); 

remoteProxyRenderer.setTarget(svr); 
remoteRender = remoteProxyRenderer; 

// Create a peer connection factory 
PeerConnectionFactory.initializeAndroidGlobals(this.ctx, true); 
PeerConnectionFactory.Options options = new PeerConnectionFactory.Options(); 
options.networkIgnoreMask = 0; 

PeerConnectionFactory peerConnectionFactory = new PeerConnectionFactory(options); 

// wait until my websocket has connected 
System.out.println("waiting for websocket to be inited..."); 
while (this.ws == null); 
System.out.println("done wait"); 
final WebSocket in_scope_ws = this.ws; 

// create peer connection observer 
PeerConnection.Observer pcObserver = new PeerConnection.Observer() {/* not included - mostly just prints */}; 

// Create peerconnection 
final PeerConnection peerConnection = peerConnectionFactory.createPeerConnection(servers, mediaConstraints, pcObserver); 

ここでは、上記のコードから削除したPeerConnection.Observer匿名実装を示します。私はここで間違ったことをしていると確信していますが、私は最初に働いている/答えの交換を得るまで私はこれを解決するのを待っていると思った。

PeerConnection.Observer pcObserver = new PeerConnection.Observer() { 
    final String TAG = "PEER_CONNECTION_FACTORY"; 

    @Override 
    public void onSignalingChange(PeerConnection.SignalingState signalingState) { 
     Log.d(TAG, "onSignalingChange"); 
    } 

    @Override 
    public void onIceConnectionChange(PeerConnection.IceConnectionState iceConnectionState) { 
     Log.d(TAG, "onIceConnectionChange"); 
    } 

    @Override 
    public void onIceConnectionReceivingChange(boolean b) { 
     Log.d(TAG, "onIceConnectionReceivingChange"); 
    } 

    @Override 
    public void onIceGatheringChange(PeerConnection.IceGatheringState iceGatheringState) { 
     Log.d(TAG, "onIceGatheringChange"); 
    } 

    // not sure what to put here 
    @Override 
    public void onIceCandidate(IceCandidate iceCandidate) { 
     System.out.println("AN ICE CANDIDATE HAS BEEN DISCOVERED"); 
     if (iceCandidate != null && in_scope_ws != null) { 
      try { 
       JSONObject payload = new JSONObject(); 
       payload.put("sdpMLineIndex", iceCandidate.sdpMLineIndex); 
       payload.put("sdpMid", iceCandidate.sdpMid); 
       payload.put("candidate", iceCandidate.sdp); 
       JSONObject candidateObject = new JSONObject(); 
       candidateObject.put("ice", iceCandidate.toString()); 
       in_scope_ws.sendText(candidateObject.toString()); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
      //send ice candidate to server - probably need to convert to string and put in JSON object 
//     in_scope_ws.send("") 
     } 
    } 

    @Override 
    public void onIceCandidatesRemoved(IceCandidate[] iceCandidates) { 
     Log.d(TAG, "onIceCandidatesRemoved"); 
    } 

    // pretty sure this is the only garbage I need right now 
    @Override 
    public void onAddStream(MediaStream mediaStream) { 
     System.out.println("IN ADD STREAM"); 
     if(mediaStream.videoTracks.size()==0) { 
      Log.d("onAddStream", "NO REMOTE STREAM"); 
      System.out.println("NO REMOTE STREAM (PRINTLN)"); 
     } 
     mediaStream.videoTracks.get(0).addRenderer(new VideoRenderer (remoteRender)); 
//    VideoRendererGui.update(remoteRender, 0, 0, 100, 100, RendererCommon.ScalingType.SCALE_ASPECT_FILL, false); 
    } 

    @Override 
    public void onRemoveStream(MediaStream mediaStream) { 
     Log.d(TAG, "onRemoveStream"); 
    } 

    @Override 
    public void onDataChannel(DataChannel dataChannel) { 
     Log.d(TAG, "onDataChannel"); 
    } 

    @Override 
    public void onRenegotiationNeeded() { 
     Log.d(TAG, "onRenegotiationNeeded"); 
    } 

    @Override 
    public void onAddTrack(RtpReceiver rtpReceiver, MediaStream[] mediaStreams) { Log.d(TAG, "onAddTrack"); } 

}; 

答えて

0

あなたがcreatePeerConnection前videoHeight videoWidth、createVideoSource、createAudioSource をcreateLocalMediaStreamして設定する必要があります。

+0

をありがとう、あなたが必要なランタイム権限を付与していることを確認してください!私はそれを試みます。私は片方向のビデオしか必要ないので、ローカルのメディアストリームを作成して無視しますか?それとも私はそれを送って、他の人がそれを使って何もしないと信じていますか? – befron

0

詳細ログを有効にして、問題を追跡できます。

org.webrtc.Logging.enableLogToDebugOutput(Logging.Severity.LS_VERBOSE); 

また(CAMERA、RECORD_AUTDIO)

関連する問題