new PeerConnectionFactory() 在 android 上给出错误

new PeerConnectionFactory() gives error on android

我正在尝试在 Android 上实施 WebRTC DataChannel。我想创建一个简单的 peerconnection 对象,它将打开 DataChannel 以使用 WebRTC 通过网络发送数据。当我尝试创建我的 PeerConnection 对象时出现错误。我了解到我们使用工厂使用 factory.createPeerConnection().

创建 peerconnection 对象

为此,我必须先创建 PeerConnectionFactory 对象。在此之后,我可以使用它来创建 PeerConnection 对象。当我尝试创建 PeerConnectionFactory 对象时出现错误 Could not find method android.media.MediaCodec.setParametersFatal Signal 11 (SIGSEGV) at 0x00000000 (code=1)。我还用 PeerConnectionFactory.initializeAndroidGlobals(this, false, false, false); 尝试了以下代码,这就是我想要做的:

PeerConnectionFactory factory = new PeerConnectionFactory();

peer = new Peer();

这是我的 Peer 对象的样子:

public class Peer implements SdpObserver, PeerConnection.Observer, DataChannel.Observer {

    private PeerConnection pc;
    private DataChannel dc;

    public Peer() {

      this.pc = factory.createPeerConnection(RTCConfig.getIceServer(), 
              RTCConfig.getMediaConstraints(), this);

      dc = this.pc.createDataChannel("sendDataChannel", new DataChannel.Init());

    }

    @Override
    public void onAddStream(MediaStream arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onDataChannel(DataChannel dataChannel) {
        this.dc = dataChannel;

    }

    @Override
    public void onIceCandidate(final IceCandidate candidate) {
        try {
            JSONObject payload = new JSONObject();
            payload.put("type", "candidate");
            payload.put("label", candidate.sdpMLineIndex);
            payload.put("id", candidate.sdpMid);
            payload.put("candidate", candidate.sdp);

            sendSocketMessageDataChannel(payload.toString());


          } catch (JSONException e) {
            e.printStackTrace();
          }

    }

    @Override
    public void onIceConnectionChange(IceConnectionState iceConnectionState) {

    }

    @Override
    public void onIceGatheringChange(IceGatheringState arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onRemoveStream(MediaStream arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onRenegotiationNeeded() {
        // TODO Auto-generated method stub

    }

    @Override
    public void onSignalingChange(SignalingState arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onCreateFailure(String msg) {
        Toast.makeText(getApplicationContext(),
                msg, Toast.LENGTH_SHORT)
                .show();

    }

    @Override
    public void onCreateSuccess(SessionDescription sdp) {
        try {

            JSONObject payload = new JSONObject();
            payload.put("type", sdp.type.canonicalForm());
            payload.put("sdp", sdp.description);

            sendSocketMessageDataChannel(payload.toString());

            pc.setLocalDescription(FilePeer.this, sdp);

          } catch (JSONException e) {
            e.printStackTrace();
          }

    }

    @Override
    public void onSetFailure(String arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onSetSuccess() {
        // TODO Auto-generated method stub

    }

    @Override
    public void onMessage(Buffer data) {
        Log.w("FILE", data.toString());

    }

    @Override
    public void onStateChange() {

        Toast.makeText(getApplicationContext(),
                "State Got Changed", Toast.LENGTH_SHORT)
                .show();

        /*
         byte[] bytes = new byte[10];

         bytes[0] = 0;
         bytes[1] = 1;
         bytes[2] = 2;
         bytes[3] = 3;
         bytes[4] = 4;
         bytes[5] = 5;
         bytes[6] = 6;
         bytes[7] = 7;
         bytes[8] = 8;
         bytes[9] = 9;

         ByteBuffer buf = ByteBuffer.wrap(bytes);



         Buffer b = new Buffer(buf, true);

         dc.send(b);
        */
    }

}

任何人都可以指出在 Android 上实现 DataChannel 的任何示例源代码吗?如果我没有以正确的方式进行操作,也请告诉我。我找不到 Android Native WebRTC 的文档来说明如何操作。我正在尝试实现我在网络上使用 WebRTC 所学到的一切。

如果我的问题不清楚,请告诉我。

这是 Android 的 WebRTC 代码中的一个已知错误。以下线程更多地讨论了这个错误:

https://code.google.com/p/webrtc/issues/detail?id=3416 https://code.google.com/p/webrtc/issues/detail?id=3234

该漏洞目前处于开放状态。但是,现在有一个可用的解决方法。在 Android Globals 中,我们需要将音频和视频参数作为 true 传递:

PeerConnectionFactory.initializeAndroidGlobals(getApplicationContext(), true, true, VideoRendererGui.getEGLContext());

改用这个 PeerConnectionFactory.initializeAndroidGlobals(acontext, TRUE, false, false, NULL);

然后创建工厂。 factory = new PeerConnectionFactory();

然后在您的 class Peer 中创建这样的对等连接:factory.createPeerConnection(iceServers, sdpMediaConstraints, this);.

这对我来说很有用,只为视频流建立了没有 EGLContext 的 DataChannel。

UPDATE:如果您仍然遇到此错误,请转到较新的版本!这是非常不赞成的。

PeerConnectionFactory 不再需要初始化音频和视频引擎才能启用。

PeerConnectionFactory.initializeAndroidGlobals(this, false, false, false);

现在您将能够禁用音频和视频,并使用数据通道