Flutter视频会议插件kooboo_openvidu的使用
Flutter视频会议插件kooboo_openvidu的使用
kooboo_openvidu
是一个用于在 Flutter 应用中集成视频会议功能的插件。该插件实现了 OpenVidu SDK 的 Dart 接口。
开始使用
Session
构造函数
class Session {
/// 构造函数
///
/// @param url 由后端提供, 用户进入直播间的token
Session(String url);
}
connect
/// 说明: 与服务器建立连接
///
/// @param userName 用户名, 不可重复
void connect(String userName);
disconnect
/// 说明: 与服务器断开连接,并清理资源
void disconnect();
startLocalPreview
/// 说明: 开启本地视频预览 (无需与服务器建立连接)
///
/// @param mode frontCamera: 前置摄像头, backCamera: 后置摄像头, srceen: 屏幕, audio: 语音通话
/// @param videoParams 视频参数, 预置了VideoParams.low, VideoParams.middle, VideoParams.high, 也可自定义创建
void startLocalPreview(String mode, VideoParams videoParams);
stopLocalPreview
/// 说明: 关闭本地视频预览
void stopLocalPreview();
switchCamera
/// 说明: 切换前后摄像头
void switchCamera();
publishLocalStream
/// 说明: 发布本地流到服务器 (stopLocalPreview之后调用)
///
/// @param video 是否开启视频
/// @param audio 是否开启音频
void publishLocalStream(bool video, bool audio);
publishVideo
/// 说明: 改变发布视频状态
///
/// @param enable true为发布视频, false为停止发送视频
void publishVideo(bool enable);
publishAudio
/// 说明: 改变发布音频状态
///
/// @param enable true为发布音频, false为停止发送音频
void publishAudio(bool enable);
subscribeRemoteStream
/// 说明: 订阅远端用户流
///
/// @param id 对方id
/// @param video 是否开启视频
/// @param audio 是否开启视音频
/// @param speakerphone 是否开启扬声器播放声音, 默认是听筒
void subscribeRemoteStream(String id, bool video, bool audio, bool speakerphone);
setRemoteVideo
/// 说明: 设置是否开启远端流的视频 (目前ios13以上的无效, 等待flutter_webrtc官方修复)
///
/// @param id 对方id
/// @param enable 是否开启视频
void setRemoteVideo(String id, bool enable);
setRemoteAudio
/// 说明: 设置是否开启远端流的音频 (目前ios13以上的无效, 等待flutter_webrtc官方修复)
///
/// @param id 对方id
/// @param enable 是否开启音频
void setRemoteAudio(String id, bool enable);
setRemoteSpeakerphone
/// 说明: 设置是否开启远端流的扬声器播放
///
/// @param id 对方id
/// @param enable 是否开启扬声器
void setRemoteSpeakerphone(String id, bool enable);
on
/// 说明: 设置事件回调
///
/// @param event 事件名, 可参阅Event枚举
/// @param handler 回调
void on(String event, Function handler);
事件
/// 说明: 事件枚举
enum Event {
joinRoom, // 自己成功进入房间
userJoined, // 远端用户进入房间
userPublished, // 远端用户发布了视频流, 此时还没有收到流, 需要手动订阅 _session.subscribeRemoteStream
error, // 出现错误, 出现错误后需要重新申请token后重连房间
addStream, // 收到了远端流
removeStream, // 远端流被移除
publishVideo, // 内部事件
publishAudio, // 内部事件
uioActive, // 内部事件
videoActive // 内部事件
}
错误
/// 说明: 错误枚举
enum Error {
NotPermissionError, // 无设备权限
TokenError, // token验证失败
NetworkError, // 网络错误
OtherError // 其他未知错误
}
完整示例代码
以下是一个完整的示例代码,演示如何使用 kooboo_openvidu
插件进行视频会议。
import 'package:flutter/material.dart';
import 'package:kooboo_openvidu/kooboo_openvidu.dart';
void main() => runApp(MyApp());
class MyApp extends StatefulWidget {
[@override](/user/override)
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
Session? session;
String? localPreviewUrl;
bool isVideoEnabled = true;
bool isAudioEnabled = true;
[@override](/user/override)
void initState() {
super.initState();
initializeOpenVidu();
}
void initializeOpenVidu() async {
final url = "YOUR_BACKEND_PROVIDED_URL"; // 替换为你的后端提供的URL
final userName = "User1"; // 替换为你想要的用户名
session = Session(url);
session?.on(Event.joinRoom, (data) {
print("Successfully joined the room");
});
session?.on(Event.error, (data) {
print("Error occurred: $data");
});
session?.on(Event.userPublished, (data) {
print("Remote user published stream");
session?.subscribeRemoteStream(data['id'], true, true, false);
});
await session?.connect(userName);
await session?.startLocalPreview('backCamera', VideoParams.high);
await session?.publishLocalStream(true, true);
}
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('OpenVidu Flutter Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
onPressed: () {
if (isVideoEnabled) {
session?.publishVideo(false);
setState(() {
isVideoEnabled = false;
});
} else {
session?.publishVideo(true);
setState(() {
isVideoEnabled = true;
});
}
},
child: Text(isVideoEnabled ? 'Disable Video' : 'Enable Video'),
),
ElevatedButton(
onPressed: () {
if (isAudioEnabled) {
session?.publishAudio(false);
setState(() {
isAudioEnabled = false;
});
} else {
session?.publishAudio(true);
setState(() {
isAudioEnabled = true;
});
}
},
child: Text(isAudioEnabled ? 'Disable Audio' : 'Enable Audio'),
),
ElevatedButton(
onPressed: () {
session?.disconnect();
},
child: Text('Disconnect'),
),
],
),
),
),
);
}
}
更多关于Flutter视频会议插件kooboo_openvidu的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
1 回复
更多关于Flutter视频会议插件kooboo_openvidu的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
kooboo_openvidu
是一个用于 Flutter 的视频会议插件,它基于 OpenVidu 平台。OpenVidu 是一个开源的 WebRTC 平台,用于构建视频会议和实时通信应用程序。kooboo_openvidu
插件封装了 OpenVidu 的功能,使得在 Flutter 应用中集成视频会议变得更加简单。
安装插件
首先,你需要在 pubspec.yaml
文件中添加 kooboo_openvidu
插件依赖:
dependencies:
flutter:
sdk: flutter
kooboo_openvidu: ^0.0.1 # 请使用最新版本
然后运行 flutter pub get
来安装依赖。
基本用法
以下是一个简单的示例,展示如何使用 kooboo_openvidu
插件加入一个视频会议:
import 'package:flutter/material.dart';
import 'package:kooboo_openvidu/kooboo_openvidu.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: VideoConferenceScreen(),
);
}
}
class VideoConferenceScreen extends StatefulWidget {
[@override](/user/override)
_VideoConferenceScreenState createState() => _VideoConferenceScreenState();
}
class _VideoConferenceScreenState extends State<VideoConferenceScreen> {
OpenVidu _openVidu;
bool _isVideoOn = false;
bool _isAudioOn = false;
[@override](/user/override)
void initState() {
super.initState();
_openVidu = OpenVidu(apiUrl: 'https://your.openvidu.server.com');
_initVideoConference();
}
Future<void> _initVideoConference() async {
try {
await _openVidu.connect(
sessionName: 'your-session-name', token: 'your-token');
setState(() {
_isVideoOn = true;
_isAudioOn = true;
});
} catch (e) {
print('Error connecting to video conference: $e');
}
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Video Conference'),
),
body: Column(
children: [
Expanded(
child: _isVideoOn
? OpenViduView(
openVidu: _openVidu,
)
: Center(child: Text('Video is off')),
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
IconButton(
icon: Icon(
_isVideoOn ? Icons.videocam : Icons.videocam_off,
),
onPressed: () {
setState(() {
_isVideoOn = !_isVideoOn;
_openVidu.toggleVideo(_isVideoOn);
});
},
),
IconButton(
icon: Icon(
_isAudioOn ? Icons.mic : Icons.mic_off,
),
onPressed: () {
setState(() {
_isAudioOn = !_isAudioOn;
_openVidu.toggleAudio(_isAudioOn);
});
},
),
],
),
],
),
);
}
[@override](/user/override)
void dispose() {
_openVidu.dispose();
super.dispose();
}
}