抖动:未处理的异常:无法进行RTCPeerConnection :: createAnswer:错误空

问题描述

伙计们,我不太明白这个例外,之前有人遇到过吗?

我使用的图书馆:

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

我的意图是按照该项目的教程https://github.com/jamalag/flutter-webrtc-part2尝试使用0.0.0.0Flutter_webrtc: ^0.2.8中建立呼叫。

我用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