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.setParameters
和 Fatal 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);
现在您将能够禁用音频和视频,并使用数据通道
我正在尝试在 Android 上实施 WebRTC DataChannel。我想创建一个简单的 peerconnection 对象,它将打开 DataChannel 以使用 WebRTC 通过网络发送数据。当我尝试创建我的 PeerConnection 对象时出现错误。我了解到我们使用工厂使用 factory.createPeerConnection()
.
为此,我必须先创建 PeerConnectionFactory 对象。在此之后,我可以使用它来创建 PeerConnection 对象。当我尝试创建 PeerConnectionFactory 对象时出现错误 Could not find method android.media.MediaCodec.setParameters
和 Fatal 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);
现在您将能够禁用音频和视频,并使用数据通道