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();
  }
}
回到顶部