2017-05-07 41 views
0

我是Android和WebRTC的新手,我一直在努力獲得在網站和我的android設備之間工作的p2p視頻連接。我已經在兩個網站之間開展了這項工作,所以我相當確定我的問題在於Android方面。WebRTC Android - createPeerConnection()總是返回null

當我嘗試使用PeerConnectionFactory.createPeerConnection()創建新的PeerConnection對象時,結果始終爲空。我正在使用WebRTC的發行版本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前createLocalMediaStream並設置videoHeight videoWidth,createVideoSource,createAudioSource 。

+0

謝謝!我會嘗試的。我只需要一種方式的視頻,那麼我只是創建我的本地媒體流並忽略它?或者我只是發送它並相信另一端不要對它做任何事情? – befron

0

您可以啓用詳細日誌記錄來追蹤問題。

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

另外,還要確保您已授予所需的運行權限(CAMERA,RECORD_AUTDIO)

相關問題