Flutter WebRTC通信插件sip_ua_livekit_webrtc的使用

发布于 1周前 作者 sinazl 来自 Flutter

Flutter WebRTC通信插件sip_ua_livekit_webrtc的使用

简介

注意: 这是使用livekit webrtc的dart sip版本。 转到普通版本

dart-sip-ua

Financial Contributors on Open Collective pub package slack

这是一个用dart-lang实现的SIP UA堆栈,移植自JsSIP


概述

  • 使用纯dart-lang。
  • 基于WebSocket的SIP(在您的Flutter移动应用、桌面网页中使用)。
  • 支持音频/视频通话(flutter-webrtc)和即时消息。
  • 支持标准SIP服务器,如OpenSIPS、Kamailio、Asterisk和FreeSWITCH。
  • 支持RFC2833或INFO发送DTMF。

当前支持的平台

  • ✅ iOS
  • ✅ Android
  • ✅ Web
  • ✅ macOS
  • ✅ Windows
  • ✅ Linux
  • ❌ Fuchsia

安装

Android

ProGuard规则:

-keep class io.flutter.app.** { *; }
-keep class io.flutter.plugin.**  { *; }
-keep class io.flutter.util.**  { *; }
-keep class io.flutter.view.**  { *; }
-keep class io.flutter.**  { *; }
-keep class io.flutter.plugins.**  { *; }

-keep class com.cloudwebrtc.webrtc.** {*;}
-keep class livekit.org.webrtc.** {*;}

快速开始

运行示例:

注册SIP服务器:

  • Asterisk
  • FreeSWITCH
  • OpenSIPS
  • Kamailio
  • 或添加您的服务器示例。

注意事项

感谢JsSIP的原始作者提供了JS版本,这使得移植到dart-lang成为可能。


赞助商

该版本的第一个版本由Suretec Systems Ltd. T/A SureVoIP赞助。


贡献者

该项目离不开社区贡献者的努力。


许可证

dart-sip-ua 在 MIT许可证 下发布。


示例代码

以下是一个完整的示例代码,展示如何使用 sip_ua_livekit_webrtc 插件进行SIP通信。

示例代码:example/lib/main.dart

import 'package:dart_sip_ua_example/src/theme_provider.dart';
import 'package:flutter/foundation.dart' 
    show debugDefaultTargetPlatformOverride;
import 'package:flutter/material.dart';
import 'package:flutter_livekit_webrtc/flutter_livekit_webrtc.dart';
import 'package:sip_ua_livekit_webrtc/sip_ua_livekit_webrtc.dart';
import 'package:logger/logger.dart';
import 'package:provider/provider.dart';

import 'src/about.dart';
import 'src/callscreen.dart';
import 'src/dialpad.dart';
import 'src/register.dart';

void main() {
  // 设置日志级别为警告
  Logger.level = Level.warning;

  // 如果是桌面平台,则设置默认目标平台
  if (WebRTC.platformIsDesktop) {
    debugDefaultTargetPlatformOverride = TargetPlatform.fuchsia;
  }

  runApp(
    MultiProvider(
      providers: [ChangeNotifierProvider(create: (_) => ThemeProvider())],
      child: MyApp(),
    ),
  );
}

typedef PageContentBuilder = Widget Function(
    [SIPUAHelper? helper, Object? arguments]);

// 主应用程序类
class MyApp extends StatelessWidget {
  final SIPUAHelper _helper = SIPUAHelper();

  // 定义路由映射
  Map<String, PageContentBuilder> routes = {
    '/': ([SIPUAHelper? helper, Object? arguments]) => DialPadWidget(helper),
    '/register': ([SIPUAHelper? helper, Object? arguments]) =>
        RegisterWidget(helper),
    '/callscreen': ([SIPUAHelper? helper, Object? arguments]) =>
        CallScreenWidget(helper, arguments as Call?),
    '/about': ([SIPUAHelper? helper, Object? arguments]) => AboutWidget(),
  };

  // 生成路由
  Route<dynamic>? _onGenerateRoute(RouteSettings settings) {
    final String? name = settings.name;
    final PageContentBuilder? pageContentBuilder = routes[name!];
    if (pageContentBuilder != null) {
      if (settings.arguments != null) {
        final Route route = MaterialPageRoute<Widget>(
            builder: (context) => pageContentBuilder(_helper, settings.arguments));
        return route;
      } else {
        final Route route = MaterialPageRoute<Widget>(
            builder: (context) => pageContentBuilder(_helper));
        return route;
      }
    }
    return null;
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: Provider.of<ThemeProvider>(context).currentTheme,
      initialRoute: '/',
      onGenerateRoute: _onGenerateRoute,
    );
  }
}

更多关于Flutter WebRTC通信插件sip_ua_livekit_webrtc的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter WebRTC通信插件sip_ua_livekit_webrtc的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


sip_ua_livekit_webrtc 是一个基于 WebRTC 的 Flutter 插件,用于实现 SIP 协议的音视频通信。它结合了 sip_ualivekit_webrtc 的功能,允许开发者在 Flutter 应用中轻松实现 SIP 呼叫和 WebRTC 音视频通信。

以下是如何使用 sip_ua_livekit_webrtc 插件的基本步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 sip_ua_livekit_webrtc 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  sip_ua_livekit_webrtc: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来获取依赖。

2. 初始化 SIP 客户端

在你的 Flutter 应用中,初始化 SIP 客户端以连接到 SIP 服务器。

import 'package:sip_ua_livekit_webrtc/sip_ua_livekit_webrtc.dart';

void initSipClient() {
  var configuration = UaConfiguration();
  configuration.webSocketUrl = 'wss://your-sip-server.com';  // SIP 服务器的 WebSocket URL
  configuration.sipUri = 'sip:your_username@your-sip-server.com';  // SIP URI
  configuration.displayName = 'Your Display Name';  // 显示名称
  configuration.password = 'your_password';  // SIP 账户密码

  var ua = Ua(configuration);

  ua.onConnected = () {
    print('Connected to SIP server');
  };

  ua.onDisconnected = () {
    print('Disconnected from SIP server');
  };

  ua.onCallReceived = (Call call) {
    print('Incoming call from ${call.remoteIdentity}');
    // 处理来电
  };

  ua.connect();
}

3. 发起呼叫

使用 SIP 客户端发起呼叫。

void makeCall(String callee) {
  var call = ua.makeCall(callee);

  call.onCallStateChanged = (CallState state) {
    print('Call state changed: $state');
  };

  call.onStreamsReceived = (MediaStream localStream, MediaStream remoteStream) {
    // 处理本地和远程音视频流
    // 例如,将流绑定到 Flutter 的 `RTCVideoRenderer` 上
  };
}

4. 处理音视频流

在 Flutter 中显示本地和远程的音视频流。

import 'package:flutter_webrtc/flutter_webrtc.dart';

class VideoCallScreen extends StatefulWidget {
  @override
  _VideoCallScreenState createState() => _VideoCallScreenState();
}

class _VideoCallScreenState extends State<VideoCallScreen> {
  RTCVideoRenderer _localRenderer = RTCVideoRenderer();
  RTCVideoRenderer _remoteRenderer = RTCVideoRenderer();

  @override
  void initState() {
    super.initState();
    _localRenderer.initialize();
    _remoteRenderer.initialize();
  }

  @override
  void dispose() {
    _localRenderer.dispose();
    _remoteRenderer.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        children: [
          Expanded(
            child: RTCVideoView(_localRenderer),  // 显示本地视频流
          ),
          Expanded(
            child: RTCVideoView(_remoteRenderer),  // 显示远程视频流
          ),
        ],
      ),
    );
  }
}

5. 处理呼叫状态

监听呼叫状态的变化,并根据状态更新 UI 或执行其他操作。

call.onCallStateChanged = (CallState state) {
  switch (state) {
    case CallState.CONNECTING:
      print('Call is connecting...');
      break;
    case CallState.CONNECTED:
      print('Call is connected');
      break;
    case CallState.DISCONNECTED:
      print('Call is disconnected');
      break;
    case CallState.FAILED:
      print('Call failed');
      break;
  }
};

6. 挂断呼叫

在需要时挂断呼叫。

void hangUp() {
  call.hangup();
}

7. 处理来电

当有来电时,可以选择接听或拒绝。

ua.onCallReceived = (Call call) {
  showDialog(
    context: context,
    builder: (context) {
      return AlertDialog(
        title: Text('Incoming Call'),
        content: Text('Incoming call from ${call.remoteIdentity}'),
        actions: [
          TextButton(
            onPressed: () {
              call.answer();  // 接听来电
              Navigator.of(context).pop();
            },
            child: Text('Answer'),
          ),
          TextButton(
            onPressed: () {
              call.hangup();  // 拒绝来电
              Navigator.of(context).pop();
            },
            child: Text('Reject'),
          ),
        ],
      );
    },
  );
};

8. 处理错误

监听错误事件并处理。

ua.onError = (error) {
  print('Error: $error');
};

9. 断开连接

在应用退出或不再需要 SIP 连接时,断开连接。

void disconnect() {
  ua.disconnect();
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!