android - WebRTC Android - createPeerConnection() 总是返回 null

标签 android webrtc

我是 Android 和 WebRTC 的新手,我一直在努力让网站和我的 Android 设备之间建立 p2p 视频连接。我已经在两个网站之间完成了这项工作,所以我很确定我的问题出在 Android 方面。

当我尝试使用 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"); }

};

最佳答案

您可以启用详细日志记录来跟踪问题。

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

还要确保您已授予所需的运行时权限(CAMERA、RECORD_AUTDIO)

关于android - WebRTC Android - createPeerConnection() 总是返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43834636/

相关文章:

android - 无法设置远程报价 sdp : Called with SDP without SDES crypto

android - 将所有正在运行的应用程序的 Activity 放在前面

android - Kotlin 中是否有类似 #region #endregion 的语法?

Android - 如何使一个 View 的中心位于列表项布局内另一个 View 的右上角

android - Opentok 存档问题?

javascript - RTCDataChannel 的 ReadyState 不是 'open'

android - 使用 libjingle 在 android WebRTC 中自定义音频设备

android - 位图的缩放和采样有什么区别?

Android:使标记不可点击

audio - WebAudio 将流连接到目标不起作用