2016-08-04 5 views
5

Ich muss WebRTC in Android-Anwendung implementieren, dafür verwende ich libjingle Bibliothek, ver-11139. In diesem bekomme ich immer pc(PeerConnection class instance) ist immer Null. Ich habe die Werte vonPeerConnection-Instanz in Android ist immer null?

factory(PeerConnectionFactory) 
iceServers(LinkedList<IceServers> 
mediaConstraints 
Peer.this(PCObserver interface)) 

überprüft, aber alle von ihnen sind nicht null. Warum bekomme ich dann immer das Ergebnis null? Mache ich hier etwas falsch ???

pc = factory.createPeerConnection(iceServers, mediaConstraints, Peer.this); 

Edit:

public CallManager(TagoveApplication context, CustomSocket server, CallType callType) { 
    this.server = server; 
    this.context = context; 
    initializeFactoryFieldTrials(); //initialize peer conn factory field trials 
    PeerConnectionFactory.initializeAndroidGlobals(context, true, true, true); 

    //PeerConnectionFactory.initializeAndroidGlobals(context, true, true, true, VideoRendererGui.getEGLContext()); 
    factory = new PeerConnectionFactory(); 

    iceServers.add(new PeerConnection.IceServer("turn:xxx.xxx.xxx.xxx:xxxx?transport=udp", "xxxxxxxx", "xxxxxxxxx")); 

    iceServers.add(new PeerConnection.IceServer("stun:stunserver.org")); 
    iceServers.add(new PeerConnection.IceServer("stun:stun.ekiga.net")); 
    iceServers.add(new PeerConnection.IceServer("stun:stun.fwdnet.net")); 
    iceServers.add(new PeerConnection.IceServer("stun:stun.ideasip.com")); 
    iceServers.add(new PeerConnection.IceServer("stun:stun.iptel.org")); 
    iceServers.add(new PeerConnection.IceServer("stun:stun.rixtelecom.se")); 
    iceServers.add(new PeerConnection.IceServer("stun:stun.schlund.de")); 

    pcConstraints.mandatory.add(new MediaConstraints.KeyValuePair("OfferToReceiveAudio", "true")); 
    pcConstraints.mandatory.add(new MediaConstraints.KeyValuePair("OfferToReceiveVideo", "true")); 
    pcConstraints.optional.add(new MediaConstraints.KeyValuePair("DtlsSrtpKeyAgreement", "true")); 

    this.callType = callType; 
} 

Erstellen von Peer-Konstruktor:

public Peer(
     String label, 
     PeerConnectionFactory factory, 
     LinkedList<PeerConnection.IceServer> iceServers, 
     MediaConstraints mediaConstraints, 
     PeerCallbacks peerCallbacks, 
     StreamChangeListener listener, 
     boolean incoming){ 

    this.label=label; 
    this.peerCBacks=peerCallbacks; 

    //Create Peer connection using RTCConfiguration 
    Log.d("PCTest","Peer factory value - "+String.valueOf(factory)); 
    Log.d("PCTest","ice servers size - "+iceServers.size()); 
    Log.d("PCTest","media constraints - "+String.valueOf(mediaConstraints)); 

    PeerConnection.RTCConfiguration rtcConfig = new PeerConnection.RTCConfiguration(iceServers); 
    rtcConfig.bundlePolicy = PeerConnection.BundlePolicy.MAXBUNDLE; 
    rtcConfig.rtcpMuxPolicy = PeerConnection.RtcpMuxPolicy.REQUIRE; 
    rtcConfig.keyType = PeerConnection.KeyType.ECDSA; 
    Log.d("",""); 
    this.pc = factory.createPeerConnection(rtcConfig, mediaConstraints, this); 
    Log.d("PCTest","Peer constructor called pc value - "+String.valueOf(this.pc)); 

    this.streamListener=listener; 
    log("new +"+" "+label+ " "+(peerCallbacks!=null? "notNull":"issNull")+" ++ "+incoming); 
} 
+0

Nennen Sie 'PeerConnectionFactory.initializeAndroidGlobals()' Funktion vor der Peerconnection zu schaffen? –

+0

ja ich tat und es kehrte wahr –

+0

Und was ist 'Peer.this'? Ist der Beobachter definiert? –

Antwort

0

Stellen Sie sicher, Fabrik korrekt, so etwas wie dies initialisieren:

private void createPeerConnectionFactoryInternal(Context context) { 
    Log.d(TAG, "Create peer connection factory. Use video: " + peerConnectionParameters.videoCallEnabled); 
    // Initialize field trials. 
    String field_trials = FIELD_TRIAL_AUTOMATIC_RESIZE; 
    // Check if VP9 is used by default. 
    if (peerConnectionParameters.videoCallEnabled && peerConnectionParameters.videoCodec != null && 
      peerConnectionParameters.videoCodec.equals(MediaConfiguration.VideoCodec.VP9.toString())) { 
     field_trials += FIELD_TRIAL_VP9; 
    } 
    PeerConnectionFactory.initializeFieldTrials(field_trials); 

    if (!PeerConnectionFactory.initializeAndroidGlobals(context, true, true, 
      peerConnectionParameters.videoCodecHwAcceleration)) { 
     observer.onPeerConnectionError("Failed to initializeAndroidGlobals"); 
    } 
    factory = new PeerConnectionFactory(); 

    Log.d(TAG, "Peer connection factory created."); 
} 

EDIT: Auch machen sicher, dass Ihre Peer.class hat Observer-Schnittstelle implementiert

EDIT 2: Vielleicht versuchen auf diese Weise: Erstellen Sie neue Klasse in der Klasse:

private class PeerObserver implements PeerConnection.Observer { 

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

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

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

    @Override 
    public void onIceCandidate(IceCandidate candidate) { 
     Log.d(TAG, "onIceCandidate"); 
    } 

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

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

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

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

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

}

und jetzt, vor factory.createPeerConnection füge PeerObserver observer = new hinzu PeerObserver(); und initialisiere PeerConnection pc = factory.createPeerConnection (iceServers, mediaConstraints, observer);

iceServers sholud etwa so aussehen

ArrayList<PeerConnection.IceServer> iceServers = new ArrayList<PeerConnection.IceServer>(); 

iceServers.add (neu PeerConnection.IceServer ("betäuben: stun.l.google.com: 19302"));

+0

Danke für die Antwort ... Ich habe die gleiche Weise, die Sie gezeigt haben, initialisiertAndroidGlobals Funktion gibt True zurück, der Fehler war aufgrund der Observer-Schnittstelle Implementierung in der Klasse, ich habe das getan, aber immer noch der PC ist null ... –

+0

Ich habe Ice-Server in verknüpften Liste kann es Problem in diesem ... –

+0

Ich glaube nicht. Wenn Sie LinkedList iceServers = new LinkedList <>() haben; es ist das gleiche wie ArrayList – Mateusz

0

Antwort ist für amtliche WebRTC Android APIcompile 'org.webrtc:google-webrtc:1.0.+'

sollten Sie richtig TlsCertPolicy verwenden, während IceServers zu schaffen. Wenn Ihre Stun/Turn-Server unsicher sind, z. B. stun:stun1.l.google.com:19302 anstelle von stuns:stun1.l.google.com:19302, sollten Sie die TLS-Zertifikatrichtlinie auf TLS_CERT_POLICY_INSECURE_NO_CHECK setzen. es kann auf diese Weise IceServerBuilder mit erfolgen:

List<PeerConnection.IceServer> iceServers = new ArrayList<>(); 
PeerConnection.IceServer.Builder iceServerBuilder = PeerConnection.IceServer.builder("stun:stun1.l.google.com:19302"); 
iceServerBuilder.setTlsCertPolicy(PeerConnection.TlsCertPolicy.TLS_CERT_POLICY_INSECURE_NO_CHECK); //this does the magic. 
PeerConnection.IceServer iceServer = iceServerBuilder.createIceServer(); 
iceServers.add(iceServer); 
localPeer = peerConnectionFactory.createPeerConnection(iceServers, sdpConstraints,sdpObserver);