Flutter视频会议插件jitsi_meet_v1的使用

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

Flutter视频会议插件jitsi_meet_v1的使用

支持我们使用我们的Patreon账户。

Jitsi Meet 插件用于 Flutter。支持 Android、iOS 和 Web 平台。

“Jitsi Meet 是一个开源(Apache)的 WebRTC JavaScript 应用程序,它使用 Jitsi Videobridge 提供高质量、安全且可扩展的视频会议。”

更多关于 Jitsi Meet 的信息可以在这里找到: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

将 NSCameraUsageDescription 和 NSMicrophoneUsageDescription 添加到您的 Info.plist。

<key>NSCameraUsageDescription</key>
<string>$(PRODUCT_NAME) MyApp needs access to your camera for meetings.</string>
<key>NSMicrophoneUsageDescription</key>
<string>$(PRODUCT_NAME) MyApp needs access to your microphone for meetings.</string>

Android
Gradle

设置 build tools gradle 的依赖项至少为 3.6.3:

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

设置 distribution 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 并添加工具库和 application 标签中的 tools:replace=“android:label”。

<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="My Application"
        android:icon="@mipmap/ic_launcher">
        ...
    </application>
...
</manifest>
最低 SDK 版本 23

在 android/app/build.gradle 中更新您的最低 SDK 版本至 23。

defaultConfig {
    applicationId "com.gunschu.jitsi_meet_example"
    minSdkVersion 23 //Required for Jitsi
    targetSdkVersion 28
    versionCode flutterVersionCode.toInteger()
    versionName flutterVersionName
}
Proguard

Jitsi 的 SDK 启用了 Proguard,但如果没有 proguard-rules.pro 文件,您的发布 apk 将缺少 Flutter 包装器和 react-native 代码。在您的 Flutter 项目的 android/app/build.gradle 文件中添加 Proguard 支持。

buildTypes {
    release {
        // TODO: Add your own signing config for the release build.
        // Signing with the debug keys for now, so `flutter run --release` works.
        signingConfig signingConfigs.debug
        
        // Add below 3 lines for proguard
        minifyEnabled true
        useProguard true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

然后在同一目录下添加一个名为 proguard-rules.pro 的文件。参见示例应用的 proguard-rules.pro 文件以了解应粘贴的内容。

注意: 如果您不创建 proguard-rules.pro 文件,则尝试加入会议或会议屏幕尝试打开时应用程序会崩溃。您将在 logcat 中看到以下错误之一。

## App crashes ##
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)
    .....
## Meeting won't open and you go to previous screen ##
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 部分的 index.html 中包含 Jitsi Js 库。

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

示例:

<body>
  <!-- This script installs service_worker.js to provide PWA functionality to
       application. For more information, see:
       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; // Limit video resolution to 360p
      
      var options = JitsiMeetingOptions()
        ..room = "myroom" // Required, spaces will be trimmed
        ..serverURL = "https://someHost.com"
        ..subject = "Meeting with Gunschu"
        ..userDisplayName = "My Name"
        ..userEmail = "myemail@email.com"
        ..userAvatarURL = "https://someimageurl.com/image.jpg" // or .png
        ..audioOnly = true
        ..audioMuted = true
        ..videoMuted = true
        ..featureFlag = featureFlag;

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

JitsiMeetingOptions

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

FeatureFlag

特征标志允许您限制视频分辨率并启用/禁用 Jitsi Meet SDK 的一些功能。如果您不对 JitsiMeetingOptions 提供任何标志,默认值将被使用。

我们使用的是 官方列表中的标志

Flag Default (Android) Default (iOS) Description
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

Field Type Description
isSuccess bool 成功指示器。
message String 成功消息或错误作为字符串。
error dynamic 可选,仅在 isSuccess 为 false 时存在。错误对象。

监听会议事件

支持的事件

Name Description
onConferenceWillJoin 会议正在加载。
onConferenceJoined 用户已加入会议。
onConferenceTerminated 用户已退出会议。
onPictureInPictureWillEnter 用户进入画中画模式。
onPictureInPictureTerminated 用户退出画中画模式。
onError 发生了监听会议事件的错误。

每场会议的事件

要监听每场会议的事件,在加入会议时传递一个 JitsiMeetingListener。当触发 onConferenceTerminated 事件时,监听器将自动移除。

await JitsiMeet.joinMeeting(options,
  listener: JitsiMeetingListener(onConferenceWillJoin: ({message}) {
    debugPrint("${options.room} will join with message: $message");
  }, onConferenceJoined: ({message}) {
    debugPrint("${options.room} joined with message: $message");
  }, onConferenceTerminated: ({message}) {
    debugPrint("${options.room} terminated with message: $message");
  }, onPictureInPictureWillEnter: ({message}) {
	debugPrint("${options.room} entered PIP mode with message: $message");
  }, onPictureInPictureTerminated: ({message}) {
	debugPrint("${options.room} exited PIP mode with message: $message");
  }));

全局会议事件

要监听全局会议事件,只需使用 JitsiMeet.addListener 添加一个 JitsiMeetingListener。您可以使用 JitsiMeet.removeListener 或 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 broadcasted");
}

_onConferenceJoined({message}) {
  debugPrint("_onConferenceJoined broadcasted");
}

_onConferenceTerminated({message}) {
  debugPrint("_onConferenceTerminated broadcasted");
}

_onPictureInPictureWillEnter({message}) {
debugPrint("_onPictureInPictureWillEnter broadcasted with message: $message");
}

_onPictureInPictureTerminated({message}) {
debugPrint("_onPictureInPictureTerminated broadcasted with message: $message");
}

_onError(error) {
  debugPrint("_onError broadcasted");
}

程序化关闭会议

JitsiMeet.closeMeeting();

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

1 回复

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


当然,以下是如何在Flutter项目中集成和使用 jitsi_meet_v1 插件来启动 Jitsi Meet 视频会议的示例代码。

1. 添加依赖

首先,你需要在你的 pubspec.yaml 文件中添加 jitsi_meet_v1 依赖:

dependencies:
  flutter:
    sdk: flutter
  jitsi_meet_v1: ^x.y.z  # 请将 x.y.z 替换为当前最新版本号

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

2. 导入插件

在你需要使用 Jitsi Meet 的 Dart 文件中导入插件:

import 'package:jitsi_meet_v1/jitsi_meet_v1.dart';

3. 配置 Jitsi Meet

在 Flutter 项目中配置 Jitsi Meet,包括设置 URL 和其他可选参数。以下是一个简单的示例:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Jitsi Meet Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              _launchJitsiMeet();
            },
            child: Text('Join Meeting'),
          ),
        ),
      ),
    );
  }

  void _launchJitsiMeet() {
    final options = JitsiMeetOptions(
      room: 'https://meet.jit.si/YourMeetingRoomName', // 替换为你的会议URL
      userName: 'YourUserName', // 可选参数,设置用户名称
      userInfo: Map<String, String>.fromEntries([
        MapEntry('email', 'user@example.com'), // 可选参数,设置用户信息
      ]),
      audioOnly: false, // 可选参数,是否为仅音频模式
      interfaceConfig: Map<String, dynamic>.fromEntries([
        MapEntry('TOOLBAR_BUTTONS', [
          'microphone',
          'camera',
          'hangup',
        ]),
      ]),
    );

    JitsiMeet.launch(options);
  }
}

4. 运行应用

确保你的 Flutter 环境配置正确,然后运行应用:

flutter run

现在,当你点击 “Join Meeting” 按钮时,应用会启动 Jitsi Meet 视频会议。

注意事项

  1. 权限:确保你的应用具有访问互联网和相机/麦克风的权限。
  2. Jitsi Meet 服务器:你可以使用 Jitsi Meet 的公共服务器 meet.jit.si,或者你可以自己部署 Jitsi Meet 服务器。
  3. 自定义:你可以根据需要进一步自定义 JitsiMeetOptions,比如设置主题、工具栏按钮等。

这样,你就成功地在 Flutter 应用中集成了 jitsi_meet_v1 插件,并可以启动 Jitsi Meet 视频会议了。

回到顶部