Flutter视频会议插件jitsi_meet_rise的使用

支持我们通过Patreon账户支持我们

“Jitsi Meet 插件为 Flutter 提供支持。支持 Android、iOS 和 Web 平台。”

了解更多关于 Jitsi Meet 的信息 这里


目录


配置

IOS

注意:示例在 XCode 12.2 和 Flutter 1.22.4 下可以编译。

Podfile

确保在您的 Podfile 中添加以下条目,声明平台为 11.0 或更高版本,并禁用 BITCODE:

platform :ios, '11.0'

...

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings['ENABLE_BITCODE'] = 'NO'
    end
  end
end

Info.plist

在 Info.plist 中添加 NSCameraUsageDescription 和 NSMicrophoneUsageDescription。

<key>NSCameraUsageDescription</key>
<string>$(PRODUCT_NAME) 我的应用需要访问您的相机进行会议。</string>
<key>NSMicrophoneUsageDescription</key>
<string>$(PRODUCT_NAME) 我的应用需要访问您的麦克风进行会议。</string>

Android

Gradle

将构建工具版本依赖设置为最低 3.6.3:

dependencies {
    classpath 'com.android.tools.build:gradle:3.6.3' <!-- 升级此 -->
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}

将 Gradle Wrapper 设置为最低 5.6.4:

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip <!-- 升级此 -->

AndroidManifest.xml

Jitsi Meet 的 SDK AndroidManifest.xml 会与您的项目冲突,尤其是 application:label 字段。解决方法是在 android/app/src/main/AndroidManifest.xml 中添加 tools 库和 tools:replace="android:label" 到 application 标签。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="yourpackage.com"
    xmlns:tools="http://schemas.android.com/tools"> <!-- 添加此 -->
    <application 
        tools:replace="android:label"  
        android:name="your.application.name"
        android:label="我的应用"
        android:icon="@mipmap/ic_launcher">
        ...
    </application>
...
</manifest>

最低SDK版本 23

android/app/build.gradle 中更新最低 SDK 版本到 23。

defaultConfig {
    applicationId "com.gunschu.jitsi_meet_example"
    minSdkVersion 23 // 必须为 Jitsi 需要
    targetSdkVersion 28
    versionCode flutterVersionCode.toInteger()
    versionName flutterVersionName
}

Proguard

Jitsi 的 SDK 启用了 Proguard,但如果缺少 proguard-rules.pro 文件,您的发布 APK 构建可能会丢失 Flutter Wrapper 和 React Native 代码。在 Flutter 项目的 android/app/build.gradle 文件中添加 Proguard 支持:

buildTypes {
    release {
        // TODO: 添加您的签名配置以用于发布构建。
        // 当前使用调试密钥,以便 `flutter run --release` 可以工作。
        signingConfig signingConfigs.debug
        
        // 添加以下 3 行以启用 Proguard
        minifyEnabled true
        useProguard true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

然后在同一目录下创建一个名为 proguard-rules.pro 的文件。可以参考示例应用的 proguard-rules.pro 文件内容。

注意 如果不创建 proguard-rules.pro 文件,尝试加入会议或会议屏幕打开时会立即崩溃。您会在日志中看到以下错误之一:

## 应用崩溃 ##
java.lang.RuntimeException: Parcel android.os.Parcel@8530c57: Unmarshalling unknown type code 7536745 at offset 104
    at android.os.Parcel.readValue(Parcel.java:2747)
    at android.os.Parcel.readSparseArrayInternal(Parcel.java:3118)
    at android.os.Parcel.readSparseArray(Parcel.java:2351)
    .....

## 会议无法打开,返回上一屏幕 ##
W/unknown:ViewManagerPropertyUpdater: Could not find generated setter for class com.BV.LinearGradient.LinearGradientManager
W/unknown:ViewManagerPropertyUpdater: Could not find generated setter for class com.facebook.react.uimanager.g
W/unknown:ViewManagerPropertyUpdater: Could not find generated setter for class com.facebook.react.views.art.ARTGroupViewManager
W/unknown:ViewManagerPropertyUpdater: Could not find generated setter for class com.facebook.react.views.art.a
.....

WEB

要在 Web 端实现,需要在 web/index.html 中包含 Jitsi JS 库:

<script src="https://meet.jit.si/external_api.js" type="application/javascript"></script>

示例:

<body>
  <!-- 此脚本安装 service_worker.js 以提供 PWA 功能给应用。
       更多信息,请参阅:
       https://developers.google.com/web/fundamentals/primers/service-workers -->
  <script>
    if ('serviceWorker' in navigator) {
      window.addEventListener('load', function () {
        navigator.serviceWorker.register('/flutter_service_worker.js');
      });
    }
  </script>
  <script src="https://meet.jit.si/external_api.js" type="application/javascript"></script>
  <script src="main.dart.js" type="application/javascript"></script>
</body>
</html>

注意 查看 jitsi_meet 插件中的使用示例。


加入会议

示例代码:

_joinMeeting() async {
    try {
      FeatureFlag featureFlag = FeatureFlag();
      featureFlag.welcomePageEnabled = false;
      featureFlag.resolution = FeatureFlagVideoResolution.MD_RESOLUTION; // 限制视频分辨率为 360p
      
      var options = JitsiMeetingOptions()
        ..room = "myroom" // 必填,空格会被去掉
        ..serverURL = "https://someHost.com"
        ..subject = "会议与 Gunschu"
        ..userDisplayName = "我的名字"
        ..userEmail = "myemail@email.com"
        ..userAvatarURL = "https://someimageurl.com/image.jpg" // 或 .png
        ..audioOnly = true
        ..audioMuted = true
        ..videoMuted = true
        ..featureFlag = featureFlag;

      await JitsiMeet.joinMeeting(options);
    } catch (error) {
      debugPrint("error: $error");
    }
  }

JitsiMeetingOptions

字段 是否必填 默认值 描述
room N/A 唯一房间名称,附加到 serverURL。有效字符:字母数字、破折号和下划线。
subject $room 会议名称显示在会议顶部。如果为 null,默认为房间名称,破折号和下划线替换为空格并首字母大写。
userDisplayName “Fellow Jitster” 用户的显示名称。
userEmail none 用户的电子邮件地址。
audioOnly false 开始会议时不带视频。可以在会议中打开。
audioMuted false 开始会议时静音。可以在会议中打开。
videoMuted false 开始会议时关闭视频。可以在会议中打开。
serverURL meet.jitsi.si 指定自己的托管服务器。必须是有效的绝对 URL,格式为 <scheme>://<host>[/<path>],例如 https://someHost.com。默认为 Jitsi Meet 的服务器。
userAvatarURL none 用户的头像 URL。
token none 用于身份验证的 JWT 令牌。
featureFlag 见下文 FeatureFlag 类的对象,用于启用/禁用功能和设置 Jitsi Meet SDK 的视频分辨率。

FeatureFlag

FeatureFlag 允许您限制视频分辨率并启用/禁用 Jitsi Meet SDK 的一些功能。如果未提供任何标志,则使用默认值。

我们正在使用 官方标志列表,取自 Jitsi Meet 存储库。

标志 默认值(Android) 默认值(iOS) 描述
addPeopleEnabled true true 启用蓝色按钮“Add people”,当您独自通话时出现。需要启用 inviteEnabled 标志。
calendarEnabled true auto 启用日历集成。
callIntegrationEnabled true true 启用呼叫集成(iOS 上的 CallKit,Android 上的 ConnectionService)。 注意
closeCaptionsEnabled true true 启用菜单中的字幕选项。
conferenceTimerEnabled true true 启用会议计时器。
chatEnabled true true 启用聊天(按钮和功能)。
inviteEnabled true true 启用菜单中的邀请选项。
iOSRecordingEnabled N/A false 在 iOS 上启用录制功能。
kickOutEnabled true true 启用视频缩略图中的踢出选项。
liveStreamingEnabled auto auto 启用菜单中的直播选项。
meetingNameEnabled true true 显示会议名称。
meetingPasswordEnabled true true 显示菜单中的会议密码选项(如果设置了密码,对话框仍然会显示)。
pipEnabled auto auto 启用画中画模式。
raiseHandEnabled true true 启用菜单中的举手选项。
recordingEnabled auto N/A 启用菜单中的录制选项。
resoulution N/A N/A 设置本地和(最大)远程视频分辨率。覆盖服务器配置。接受值为:LD_RESOLUTION(180p)、MD_RESOLUTION(360p)、SD_RESOLUTION(480p/SD)、HD_RESOLUTION(720p/HD)。
serverURLChangeEnabled true true 启用服务器 URL 更改。
tileViewEnabled true true 启用菜单中的平铺视图选项。
toolboxAlwaysVisible true true 工具栏(按钮和菜单)始终可见(如果不是,则单击显示它)。
videoShareButtonEnabled true true 启用视频共享按钮。
welcomePageEnabled false false 启用欢迎页面。“欢迎页面列出最近的会议和日历约会,旨在被独立应用程序使用。”

关于呼叫集成的备注 Android 上的呼叫集成(称为 ConnectionService)已在官方 Jitsi Meet 应用中被禁用 因为这会造成许多问题。您也应该禁用它以避免这些问题。


JitsiMeetingResponse

字段 类型 描述
isSuccess bool 成功指示符。
message String 成功消息或错误作为字符串。
error dynamic 可选,仅在 isSuccess 为 false 时存在。错误对象。

监听会议事件

支持的事件

名称 描述
onConferenceWillJoin 会议正在加载。
onConferenceJoined 用户已加入会议。
onConferenceTerminated 用户已退出会议。
onPictureInPictureWillEnter 用户进入画中画模式。
onPictureInPictureTerminated 用户退出画中画模式。
onError 发生了错误。

每场会议的事件

要监听每场会议的事件,将 JitsiMeetingListener 传递给 joinMeeting。当触发 onConferenceTerminated 事件时,自动移除监听器。

await JitsiMeet.joinMeeting(options,
  listener: JitsiMeetingListener(onConferenceWillJoin: ({message}) {
    debugPrint("${options.room} 将加入,消息为: $message");
  }, onConferenceJoined: ({message}) {
    debugPrint("${options.room} 已加入,消息为: $message");
  }, onConferenceTerminated: ({message}) {
    debugPrint("${options.room} 已终止,消息为: $message");
  }, onPictureInPictureWillEnter: ({message}) {
    debugPrint("${options.room} 进入画中画模式,消息为: $message");
  }, onPictureInPictureTerminated: ({message}) {
    debugPrint("${options.room} 退出画中画模式,消息为: $message");
  }));

全局会议事件

要监听全局会议事件,只需使用 JitsiMeet.addListener(myListener) 添加监听器。可以通过 JitsiMeet.removeListener(listener)JitsiMeet.removeAllListeners() 移除监听器。

@override
void initState() {
  super.initState();
  JitsiMeet.addListener(JitsiMeetingListener(
    onConferenceWillJoin: _onConferenceWillJoin,
    onConferenceJoined: _onConferenceJoined,
    onConferenceTerminated: _onConferenceTerminated,
    onPictureInPictureWillEnter: _onPictureInPictureWillEnter,
    onPictureInPictureTerminated: _onPictureInPictureTerminated,
    onError: _onError));
}

@override
void dispose() {
  super.dispose();
  JitsiMeet.removeAllListeners();
}

_onConferenceWillJoin({message}) {
  debugPrint("_onConferenceWillJoin 广播");
}

_onConferenceJoined({message}) {
  debugPrint("_onConferenceJoined 广播");
}

_onConferenceTerminated({message}) {
  debugPrint("_onConferenceTerminated 广播");
}

_onPictureInPictureWillEnter({message}) {
  debugPrint("_onPictureInPictureWillEnter 广播,消息为: $message");
}

_onPictureInPictureTerminated({message}) {
  debugPrint("_onPictureInPictureTerminated 广播,消息为: $message");
}

_onError(error) {
  debugPrint("_onError 广播");
}

程序化关闭会议

JitsiMeet.closeMeeting();

更多关于Flutter视频会议插件jitsi_meet_rise的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter视频会议插件jitsi_meet_rise的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


jitsi_meet_rise 是一个用于在 Flutter 应用中集成 Jitsi Meet 视频会议的插件。它基于 Jitsi Meet SDK,允许开发者在应用中轻松实现视频会议功能。

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 jitsi_meet_rise 依赖:

dependencies:
  flutter:
    sdk: flutter
  jitsi_meet_rise: ^0.0.1

然后运行 flutter pub get 来安装依赖。

2. 配置 Android 和 iOS

在使用 jitsi_meet_rise 之前,需要对 Android 和 iOS 项目进行一些配置。

Android 配置

android/app/build.gradle 文件中,确保 minSdkVersion 设置为 23 或更高:

android {
    ...
    defaultConfig {
        ...
        minSdkVersion 23
        ...
    }
    ...
}

iOS 配置

ios/Podfile 文件中,确保 platform :ios 设置为 11.0 或更高:

platform :ios, '11.0'

然后运行 pod install 来更新 iOS 项目。

3. 使用 jitsi_meet_rise 插件

在 Flutter 代码中,你可以使用 jitsi_meet_rise 来启动 Jitsi Meet 视频会议。

import 'package:flutter/material.dart';
import 'package:jitsi_meet_rise/jitsi_meet_rise.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: VideoConferenceScreen(),
    );
  }
}

class VideoConferenceScreen extends StatelessWidget {
  final JitsiMeetRise jitsiMeet = JitsiMeetRise();

  void startVideoConference() async {
    var options = JitsiMeetConferenceOptions(
      room: "your_room_name", // 会议室名称
      serverURL: "https://meet.jit.si", // Jitsi Meet 服务器 URL
      subject: "Video Conference", // 会议主题
      userDisplayName: "John Doe", // 用户显示名称
      userEmail: "john.doe@example.com", // 用户邮箱
      audioMuted: false, // 是否静音
      videoMuted: false, // 是否关闭视频
    );

    await jitsiMeet.joinMeeting(options);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Jitsi Meet Video Conference"),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: startVideoConference,
          child: Text("Start Video Conference"),
        ),
      ),
    );
  }
}

4. 运行应用

现在你可以运行你的 Flutter 应用,并点击按钮启动 Jitsi Meet 视频会议。

5. 处理会议事件

你可以监听会议事件来处理会议的状态变化,例如会议开始、结束等。

jitsiMeet.addListener(JitsiMeetingListener(
  onConferenceWillJoin: (url) {
    print("Conference will join: $url");
  },
  onConferenceJoined: (url) {
    print("Conference joined: $url");
  },
  onConferenceTerminated: (url) {
    print("Conference terminated: $url");
  },
));

6. 自定义 UI

你可以通过 JitsiMeetConferenceOptions 自定义会议界面的外观和行为,例如隐藏工具栏、设置背景颜色等。

var options = JitsiMeetConferenceOptions(
  room: "your_room_name",
  serverURL: "https://meet.jit.si",
  subject: "Video Conference",
  userDisplayName: "John Doe",
  userEmail: "john.doe@example.com",
  audioMuted: false,
  videoMuted: false,
  featureFlags: {
    "welcomePage.enabled": false,
    "toolbox.alwaysVisible": false,
    "pip.enabled": true,
  },
);

7. 结束会议

你可以通过调用 jitsiMeet.closeMeeting() 来手动结束会议。

jitsiMeet.closeMeeting();

8. 权限处理

确保在 AndroidManifest.xmlInfo.plist 中添加必要的权限,例如摄像头和麦克风的访问权限。

Android

android/app/src/main/AndroidManifest.xml 文件中添加以下权限:

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.INTERNET" />

iOS

ios/Runner/Info.plist 文件中添加以下权限:

<key>NSCameraUsageDescription</key>
<string>We need access to your camera for video conferencing.</string>
<key>NSMicrophoneUsageDescription</key>
<string>We need access to your microphone for video conferencing.</string>

9. 调试和问题解决

如果在使用过程中遇到问题,可以查看日志以获取更多信息。你可以在 JitsiMeetConferenceOptions 中启用调试模式:

var options = JitsiMeetConferenceOptions(
  room: "your_room_name",
  serverURL: "https://meet.jit.si",
  subject: "Video Conference",
  userDisplayName: "John Doe",
  userEmail: "john.doe@example.com",
  audioMuted: false,
  videoMuted: false,
  featureFlags: {
    "debug.enabled": true,
  },
);
回到顶部