Flutter WebRTC通信插件sip_ua_livekit_webrtc的使用
Flutter WebRTC通信插件sip_ua_livekit_webrtc的使用
简介
注意: 这是使用livekit webrtc的dart sip版本。 转到普通版本
dart-sip-ua
这是一个用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.** {*;}
快速开始
运行示例:
- dart-sip-ua-example
- 或者添加您的示例。
注册SIP服务器:
- Asterisk
- FreeSWITCH
- OpenSIPS
- Kamailio
- 或添加您的服务器示例。
注意事项
感谢JsSIP的原始作者提供了JS版本,这使得移植到dart-lang成为可能。
赞助商
该版本的第一个版本由Suretec Systems Ltd. T/A SureVoIP赞助。
贡献者
该项目离不开社区贡献者的努力。
- SureVoIP - 赞助商
- CloudWebRTC - 原始作者
- Robert Sutton - 贡献者
- Gavin Henry - 贡献者
- Perondas - 贡献者
许可证
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
更多关于Flutter WebRTC通信插件sip_ua_livekit_webrtc的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
sip_ua_livekit_webrtc
是一个基于 WebRTC 的 Flutter 插件,用于实现 SIP 协议的音视频通信。它结合了 sip_ua
和 livekit_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();
}