颤动:未处理的异常:无法 RTCPeerConnection::createAnswer:错误(空)
flutter: Unhandled Exception: Unable to RTCPeerConnection::createAnswer: Error (null)
伙计们,我很不明白这个异常,以前有人遇到过这个吗?
我使用的库:
dependencies:
flutter:
sdk: flutter
flutter_webrtc: ^0.2.8
toast: ^0.1.5
web_socket_channel: ^1.1.0
random_string: ^1.1.0
shared_preferences: ^0.5.10
http: ^0.12.0+4
simple_permissions: ^0.1.9
sdp_transform: ^0.2.0
我的意图是尝试使用 flutter_webrtc: ^0.2.8
在 0.0.0.0
中连接一个呼叫,遵循该项目的教程:https://github.com/jamalag/flutter-webrtc-part2.
我用 Flutter 编写代码 (main.dart)
/// Server Changes Here 服务器在此更改
_createPeerConnection() async {
Map<String, dynamic> config = {
"iceServers": [
{"url": "stun:stun.l.google.com:19302"},
],
};
final Map<String, dynamic> offerSdpConstraints = {
"mandatory": {
"OfferToReceiveAudio": true,
"OfferToReceiveVideo": true,
},
"optional": [],
};
_localStream = await _getUserMedia();
RTCPeerConnection pc =
await createPeerConnection(config, offerSdpConstraints);
if (pc != null) print('HERE ==> $pc');
pc.addStream(_localStream);
pc.onIceCandidate = (e) {
if (e.candidate != null) {
print(json.encode(
{
'candidate': e.candidate.toString(),
'sdpMid': e.sdpMid.toString(),
'sdpMlineIndex': e.sdpMlineIndex,
},
));
} else {
print('无效');
}
};
pc.onIceConnectionState = (e) {
print(e);
};
pc.onAddStream = (stream) {
print('addStream:' + stream.id);
_remoteRenderer.srcObject = stream;
};
return pc;
}
_getUserMedia() async {
final Map<String, dynamic> mediaConstraints = {
'audio': false,
'video': {
'facingMode': 'user',
},
};
MediaStream mediaStream = await navigator.getUserMedia(mediaConstraints);
_localRenderer.srcObject = mediaStream;
_localRenderer.mirror = true;
return mediaStream;
}
initRenderers() async {
await _localRenderer.initialize();
await _remoteRenderer.initialize();
}
requestPermission() {
if (Platform.isAndroid) {
AndroidOperatingSystemPermission().requestAndroidUserPermission();
} else if (Platform.isIOS) {
IOSOperatingSystemPermission().requestIOSUserPermission();
} else {
logger('没有这样的操作系统');
}
}
void _setCandidate() async {
String jsonString = sdpController.text;
dynamic session = await jsonDecode('$jsonString');
print(session['candidate']);
dynamic candidate = RTCIceCandidate(
session['candidate'], session['sdpMid'], session['sdpMlineIndex']);
await _peerConnection.addCandidate(candidate);
}
void _setRemoteDescription() async {
String jsonString = sdpController.text;
dynamic session = await jsonDecode('$jsonString');
String sdp = write(session, null);
RTCSessionDescription description =
RTCSessionDescription(sdp, _offer ? 'answer' : 'offer');
print(description.toMap());
// debugPrint(description.toMap().toString(), wrapWidth: 2048);
await _peerConnection.setRemoteDescription(description);
}
void _createOffer() async {
RTCSessionDescription description =
await _peerConnection.createOffer({'offerToReceiveVideo': 1});
var session = parse(description.sdp);
print(json.encode(session));
_offer = true;
// print('__CREATE_OFFER__');
print(
json.encode({
'sdp': description.sdp.toString(),
'type': description.type.toString(),
}),
);
_peerConnection.setLocalDescription(description);
}
void _createAnswer() async {
RTCSessionDescription description =
await _peerConnection.createAnswer({'offerToReceiveVideo': 1});
var session = parse(description.sdp);
debugPrint(json.encode(session), wrapWidth: 2048);
_peerConnection.setLocalDescription(description);
}
我遇到的错误:
2020-09-22 16:54:56.539143+0800 Runner[603:86509] [VERBOSE-2:ui_dart_state.cc(166)] Unhandled Exception: Unable to RTCPeerConnection::createAnswer: Error (null)
#0 RTCPeerConnection.createAnswer (package:flutter_webrtc/rtc_peerconnection.dart:237:7)
<asynchronous suspension>
#1 _CallerAppState._createAnswer (package:/main.dart:190:31)
#2 _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:992:19)
#3 _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:1098:38)
#4 GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:184:24)
#5 TapGestureRecognizer.handleTapUp (package:flutter/src/gestures/tap.dart:524:11)
#6 BaseTapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:284:5)
#7 BaseTapGestureRecognizer.acceptGesture (package:flutter/src/gestures/tap.dart:256:7)
#8 GestureArenaManager.sweep (package:flutter/src/gestures/arena.dart:158:27)
#9 GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:224:20)
#10 GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:200:22)
#11 GestureBinding._handlePointerEvent (package:flutter/src/gestures/binding.dart:158:7)
#12 GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:104:7)
#13 GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:88:7)
#14 _rootRunUnary (dart:async/zone.dart:1206:13)
#15 _CustomZone.runUnary (dart:async/zone.dart:1100:19)
#16 _CustomZone.runUnaryGuarded (dart:async/zone.dart:1005:7)
#17 _invoke1 (dart:ui/hooks.dart:267:10)
#18 _dispatchPointerDataPacket (dart:ui/hooks.dart:176:5)
我尝试解决这个问题的方法,
debugPrint(json.encode(session), wrapWidth: 2048);
打印出清晰而长的输出,我认为这是问题所在。由于我是新手,我需要一些线索。
提前致谢。
我没有使用 _localRenderer.mirror = true;
,而是使用 RTCVideoView(_localRenderer, mirror: true),
我在 YouTube 上关注他并为我工作。
你可以关注他or my code.
伙计们,我很不明白这个异常,以前有人遇到过这个吗?
我使用的库:
dependencies:
flutter:
sdk: flutter
flutter_webrtc: ^0.2.8
toast: ^0.1.5
web_socket_channel: ^1.1.0
random_string: ^1.1.0
shared_preferences: ^0.5.10
http: ^0.12.0+4
simple_permissions: ^0.1.9
sdp_transform: ^0.2.0
我的意图是尝试使用 flutter_webrtc: ^0.2.8
在 0.0.0.0
中连接一个呼叫,遵循该项目的教程:https://github.com/jamalag/flutter-webrtc-part2.
我用 Flutter 编写代码 (main.dart)
/// Server Changes Here 服务器在此更改
_createPeerConnection() async {
Map<String, dynamic> config = {
"iceServers": [
{"url": "stun:stun.l.google.com:19302"},
],
};
final Map<String, dynamic> offerSdpConstraints = {
"mandatory": {
"OfferToReceiveAudio": true,
"OfferToReceiveVideo": true,
},
"optional": [],
};
_localStream = await _getUserMedia();
RTCPeerConnection pc =
await createPeerConnection(config, offerSdpConstraints);
if (pc != null) print('HERE ==> $pc');
pc.addStream(_localStream);
pc.onIceCandidate = (e) {
if (e.candidate != null) {
print(json.encode(
{
'candidate': e.candidate.toString(),
'sdpMid': e.sdpMid.toString(),
'sdpMlineIndex': e.sdpMlineIndex,
},
));
} else {
print('无效');
}
};
pc.onIceConnectionState = (e) {
print(e);
};
pc.onAddStream = (stream) {
print('addStream:' + stream.id);
_remoteRenderer.srcObject = stream;
};
return pc;
}
_getUserMedia() async {
final Map<String, dynamic> mediaConstraints = {
'audio': false,
'video': {
'facingMode': 'user',
},
};
MediaStream mediaStream = await navigator.getUserMedia(mediaConstraints);
_localRenderer.srcObject = mediaStream;
_localRenderer.mirror = true;
return mediaStream;
}
initRenderers() async {
await _localRenderer.initialize();
await _remoteRenderer.initialize();
}
requestPermission() {
if (Platform.isAndroid) {
AndroidOperatingSystemPermission().requestAndroidUserPermission();
} else if (Platform.isIOS) {
IOSOperatingSystemPermission().requestIOSUserPermission();
} else {
logger('没有这样的操作系统');
}
}
void _setCandidate() async {
String jsonString = sdpController.text;
dynamic session = await jsonDecode('$jsonString');
print(session['candidate']);
dynamic candidate = RTCIceCandidate(
session['candidate'], session['sdpMid'], session['sdpMlineIndex']);
await _peerConnection.addCandidate(candidate);
}
void _setRemoteDescription() async {
String jsonString = sdpController.text;
dynamic session = await jsonDecode('$jsonString');
String sdp = write(session, null);
RTCSessionDescription description =
RTCSessionDescription(sdp, _offer ? 'answer' : 'offer');
print(description.toMap());
// debugPrint(description.toMap().toString(), wrapWidth: 2048);
await _peerConnection.setRemoteDescription(description);
}
void _createOffer() async {
RTCSessionDescription description =
await _peerConnection.createOffer({'offerToReceiveVideo': 1});
var session = parse(description.sdp);
print(json.encode(session));
_offer = true;
// print('__CREATE_OFFER__');
print(
json.encode({
'sdp': description.sdp.toString(),
'type': description.type.toString(),
}),
);
_peerConnection.setLocalDescription(description);
}
void _createAnswer() async {
RTCSessionDescription description =
await _peerConnection.createAnswer({'offerToReceiveVideo': 1});
var session = parse(description.sdp);
debugPrint(json.encode(session), wrapWidth: 2048);
_peerConnection.setLocalDescription(description);
}
我遇到的错误:
2020-09-22 16:54:56.539143+0800 Runner[603:86509] [VERBOSE-2:ui_dart_state.cc(166)] Unhandled Exception: Unable to RTCPeerConnection::createAnswer: Error (null)
#0 RTCPeerConnection.createAnswer (package:flutter_webrtc/rtc_peerconnection.dart:237:7)
<asynchronous suspension>
#1 _CallerAppState._createAnswer (package:/main.dart:190:31)
#2 _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:992:19)
#3 _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:1098:38)
#4 GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:184:24)
#5 TapGestureRecognizer.handleTapUp (package:flutter/src/gestures/tap.dart:524:11)
#6 BaseTapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:284:5)
#7 BaseTapGestureRecognizer.acceptGesture (package:flutter/src/gestures/tap.dart:256:7)
#8 GestureArenaManager.sweep (package:flutter/src/gestures/arena.dart:158:27)
#9 GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:224:20)
#10 GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:200:22)
#11 GestureBinding._handlePointerEvent (package:flutter/src/gestures/binding.dart:158:7)
#12 GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:104:7)
#13 GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:88:7)
#14 _rootRunUnary (dart:async/zone.dart:1206:13)
#15 _CustomZone.runUnary (dart:async/zone.dart:1100:19)
#16 _CustomZone.runUnaryGuarded (dart:async/zone.dart:1005:7)
#17 _invoke1 (dart:ui/hooks.dart:267:10)
#18 _dispatchPointerDataPacket (dart:ui/hooks.dart:176:5)
我尝试解决这个问题的方法,
debugPrint(json.encode(session), wrapWidth: 2048);
打印出清晰而长的输出,我认为这是问题所在。由于我是新手,我需要一些线索。
提前致谢。
我没有使用 _localRenderer.mirror = true;
,而是使用 RTCVideoView(_localRenderer, mirror: true),
我在 YouTube 上关注他并为我工作。 你可以关注他or my code.