You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter用Twilio作TURN服务器实现WebRTC投屏时遇空指针异常

问题:WebRTC投屏应用PeerConnection空指针异常且打印语句无输出

我正在开发一款投屏应用,采用Twilio作为TURN服务器结合WebRTC技术。调用mirrorScreen()方法时,出现错误:

Attempt to invoke virtual method 'java.util.List org.webrtc.PeerConnection.getTransceivers()' on a null object reference
(翻译:尝试在空对象引用上调用虚拟方法java.util.List org.webrtc.PeerConnection.getTransceivers())

为追踪执行流程添加了多条打印语句,但均未执行。相关代码如下:

mirrorScreen() async {
FlutterBackground.enableBackgroundExecution();

  RTCPeerConnection connect =
      await _createPeerConnection().then((conn) {
    print(
        'connected---------------------------------------------------------------------- successfully');
    inspect(conn);
    return conn;
  });

  print('connnnnnnnnnnnected');
}

_createPeerConnection() async {
  try {
    Map<String, dynamic> config = {
      "iceServers": [
        {
          'url': 'turn:global.turn.twilio.com:3478?transport=tcp',
          'username': 'Test SID',
          'credentials': 'Test Auth Token'
        },
      ],
    };

    final Map<String, dynamic> offerSdpConstraints = {
      "mandatory": {
        "OfferToReceiveAudio": true,
        "OfferToReceiveVideo": true,
      },
      "optional": [],
    };

    RTCPeerConnection pc =
        await createPeerConnection(config, offerSdpConstraints);

    return pc;
  } catch (e) {
    print('errro');
  }
}

附言:所有打印语句均未执行


问题分析与解决步骤

1. 修复异常捕获与返回值问题

当前_createPeerConnection的catch块仅打印拼写错误的errro,且未明确返回值。一旦createPeerConnection抛出异常,方法会隐式返回null,后续调用connect的方法就会触发空指针。同时要打印完整异常信息便于排查:

_createPeerConnection() async {
  try {
    // 原有配置代码...
    RTCPeerConnection pc = await createPeerConnection(config, offerSdpConstraints);
    return pc;
  } catch (e, stackTrace) {
    print('创建PeerConnection失败: $e');
    print('堆栈追踪: $stackTrace');
    return null; // 明确返回null,避免隐式返回导致的流程混乱
  }
}

2. 重构mirrorScreen的异步逻辑

混用await和.then会导致执行流程混乱,且未判断conn是否为null,直接使用会触发空指针。重构后增加null检查:

mirrorScreen() async {
  FlutterBackground.enableBackgroundExecution();

  RTCPeerConnection? connect = await _createPeerConnection();
  if (connect == null) {
    print('PeerConnection创建失败');
    return;
  }
  print('connected---------------------------------------------------------------------- successfully');
  inspect(connect);
  print('connnnnnnnnnnnected');
}

3. 修正Twilio TURN服务器配置

Twilio的TURN服务器不能直接使用Account SID和Auth Token作为username和credentials,需要通过Twilio API生成临时凭证。同时部分WebRTC库要求使用urls而非url,兼容写法如下:

Map<String, dynamic> config = {
  "iceServers": [
    {
      'urls': 'turn:global.turn.twilio.com:3478?transport=tcp',
      'username': '生成的临时用户名',
      'credential': '生成的临时凭证'
    },
  ],
};

4. 更新SDP约束配置(可选)

部分Flutter WebRTC库已废弃offerSdpConstraints的mandatory格式,建议改用收发器配置媒体接收规则:

// 移除原有offerSdpConstraints参数,创建PeerConnection后添加收发器
RTCPeerConnection pc = await createPeerConnection(config);
// 配置音频接收
await pc.addTransceiver(
  kind: RTCRtpMediaType.RTCRtpMediaTypeAudio,
  init: RTCRtpTransceiverInit(direction: TransceiverDirection.RecvOnly),
);
// 配置视频接收
await pc.addTransceiver(
  kind: RTCRtpMediaType.RTCRtpMediaTypeVideo,
  init: RTCRtpTransceiverInit(direction: TransceiverDirection.RecvOnly),
);

内容的提问来源于stack exchange,提问作者Abdul Rehman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 05:50:27