Flutter即时通讯RTC插件rongcloud_rtc_wrapper_plugin的使用

Flutter即时通讯RTC插件rongcloud_rtc_wrapper_plugin的使用

融云 RTC Wrapper Plugin

GitHub stars Pub version

本文档主要讲解了如何使用融云 RTC Wrapper Plugin,基于融云 iOS/Android 平台的 RTCLib SDK。

前期准备

1 申请开发者账号

在融云官网申请开发者账号。通过管理后台的 “基本信息” -> “App Key” 获取 AppKey。

通过管理后台的 “IM 服务” -> “API 调用” -> “用户服务” -> “获取 Token”,通过用户 ID 获取 IMToken。

2 开通音视频服务

管理后台的 “音视频服务” -> “服务设置” 开通音视频 RTC 3.0,开通两个小时后生效。

依赖 RTC Wrapper Plugin

在项目的 pubspec.yaml 中写如下依赖:

dependencies:
  flutter:
    sdk: flutter
  rongcloud_rtc_wrapper_plugin: 5.12.0

iOS 配置

iOS 需要在 Info.plist 中需要加入对相机和麦克风的权限申请:

<key>NSCameraUsageDescription</key>
<string>使用相机</string>
<key>NSMicrophoneUsageDescription</key>
<string>使用麦克风</string>

还需要添加字段 io.flutter.embedded_views_preview 值为 YES

Android 配置

Android 需要在 AndroidManifest.xml 文件中声明对相机和麦克风的权限:

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

前置接口说明

初始化 IM SDK

RongIMClient.init(RongAppKey);

连接 IM

RongIMClient.connect(IMToken, (code, userId) {
  // 连接成功的回调
});

创建 RTC 引擎

RCRTCEngine engine = await RCRTCEngine.create();

音视频模式接口说明

用户加入房间,渲染并发布资源

加入 RTC 房间

// 设置加入 RTC 房间事件监听
engine.onRoomJoined = (int code, String? message) {
  // 加入房间后的回调
};

// 加入 RTC 房间
RCRTCRoomSetup setup = RCRTCRoomSetup.create(
    type: RCRTCMediaType.audio_video,
    role: RCRTCRole.meeting_member,
);
engine.joinRoom(id, setup);

采集音频

引擎默认开启音频采集

engine.enableMicrophone(true);

采集视频

engine.enableCamera(true);

渲染视频

RCRTCView view = await RCRTCView.create();
engine.setLocalView(view);

发布资源

engine.publish(RCRTCMediaType.audio_video);

渲染远端用户

监听远端用户加入的回调

engine.onUserJoined = (roomId, userId) {
  // 远端用户加入的回调
};

监听远端用户发布资源的回调

engine.onRemotePublished = (roomId, userId, type) {
  // 远端用户发布资源的回调
};

远端用户发布资源后,订阅远端用户资源

engine.subscribe(userId, type);

渲染远端用户资源

RCRTCView view = await RCRTCView.create();
engine.setRemoteView(userId, view);

直播模式接口说明

主播加入房间,渲染并发布资源

加入 RTC 房间

// 设置加入 RTC 房间事件监听
engine.onRoomJoined = (int code, String? message) {
  // 加入房间后的回调
};

// 加入 RTC 房间
RCRTCRoomSetup setup = RCRTCRoomSetup.create(
    type: RCRTCMediaType.audio_video,
    role: RCRTCRole.live_broadcaster,
);
engine.joinRoom(id, setup);

采集音频

引擎默认开启音频采集

engine.enableMicrophone(true);

采集视频

engine.enableCamera(true);

渲染视频

RCRTCView view = await RCRTCView.create();
engine.setLocalView(view);

发布资源

engine.publish(RCRTCMediaType.audio_video);

渲染远端主播

监听远端主播加入的回调

engine.onUserJoined = (roomId, userId) {
  // 远端主播加入的回调
};

监听远端主播发布资源的回调

engine.onRemotePublished = (roomId, userId, type) {
  // 远端主播发布资源的回调
};

远端主播发布资源后,订阅远端主播资源

engine.subscribe(userId, type);

渲染远端主播资源

RCRTCView view = await RCRTCView.create();
engine.setRemoteView(userId, view);

观众加入房间,订阅并渲染MCU资源

加入 RTC 房间

// 设置加入 RTC 房间事件监听
engine.onRoomJoined = (int code, String? message) {
  // 加入房间后的回调
};

// 加入 RTC 房间
RCRTCRoomSetup setup = RCRTCRoomSetup.create(
    type: RCRTCMediaType.audio_video,
    role: RCRTCRole.live_audience,
);
engine.joinRoom(id, setup);

监听MCU资源发布回调

engine.onRemoteLiveMixPublished = (type) {
  // MCU资源发布回调
};

MCU资源发布后,订阅MCU资源

engine.subscribeLiveMix(type);

渲染MCU资源

RCRTCView view = await RCRTCView.create();
engine.setLiveMixView(view);

观众加入房间,订阅并渲染主播资源

加入 RTC 房间

// 设置加入 RTC 房间事件监听
engine.onRoomJoined = (int code, String? message) {
  // 加入房间后的回调
};

// 加入 RTC 房间
RCRTCRoomSetup setup = RCRTCRoomSetup.create(
    type: RCRTCMediaType.audio_video,
    role: RCRTCRole.live_audience,
);
engine.joinRoom(id, setup);

监听远端主播加入的回调

engine.onUserJoined = (roomId, userId) {
  // 远端主播加入的回调
};

监听远端主播发布资源的回调

engine.onRemotePublished = (roomId, userId, type) {
  // 远端主播发布资源的回调
};

远端主播发布资源后,订阅远端主播资源

engine.subscribe(userId, type);

渲染远端主播资源

RCRTCView view = await RCRTCView.create();
engine.setRemoteView(userId, view);

其他接口

离开房间

engine.leaveRoom();

销毁引擎

engine.destroy();

示例代码

example/lib/main.dart

import 'package:context_holder/context_holder.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:rongcloud_rtc_wrapper_plugin_example/data/data.dart';
import 'package:rongcloud_rtc_wrapper_plugin_example/frame/utils/local_storage.dart';
import 'package:wakelock/wakelock.dart';

import 'global_config.dart';
import 'router/router.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  LocalStorage.init().then((value) => runApp(RCRTCFlutter()));
}

class RCRTCFlutter extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    SystemChrome.setPreferredOrientations([
      DeviceOrientation.portraitUp,
      DeviceOrientation.portraitDown,
    ]);

    SystemUiOverlayStyle systemUiOverlayStyle = SystemUiOverlayStyle(
      statusBarColor: Colors.transparent,
      statusBarIconBrightness: Brightness.dark,
    );
    SystemChrome.setSystemUIOverlayStyle(systemUiOverlayStyle);

    Wakelock.enable();

    return MaterialApp(
      navigatorKey: ContextHolder.key,
      title: GlobalConfig.appTitle,
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      initialRoute: RouterManager.CONNECT,
      routes: RouterManager.initRouters(),
    );
  }
}

更多关于Flutter即时通讯RTC插件rongcloud_rtc_wrapper_plugin的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter即时通讯RTC插件rongcloud_rtc_wrapper_plugin的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用rongcloud_rtc_wrapper_plugin插件进行即时通讯RTC功能的代码示例。这个示例将展示如何初始化 RongCloud RTC 插件、加入房间以及发送和接收音频/视频流。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  rongcloud_rtc_wrapper_plugin: ^最新版本号  # 请替换为实际最新版本号

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

2. 配置Android和iOS

确保你在Android和iOS项目中正确配置了RongCloud SDK所需的权限和设置。这通常包括在AndroidManifest.xml中添加必要的权限,以及在iOS的Info.plist中配置RTC相关的设置。

3. 初始化RTC插件

在你的Flutter项目的main.dart文件中,初始化RTC插件并处理相关逻辑:

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

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final RongCloudRTC _rongCloudRTC = RongCloudRTC();

  @override
  void initState() {
    super.initState();
    // 初始化RTC插件
    _initRTC();
  }

  Future<void> _initRTC() async {
    try {
      // 替换为你的AppKey
      String appKey = "your_app_key_here";
      await _rongCloudRTC.init(appKey);
      print("RTC initialized successfully");

      // 加入房间(替换为实际的房间号和用户ID)
      String roomId = "room_123";
      String userId = "user_123";
      await _rongCloudRTC.joinRoom(roomId, userId);
      print("Joined room: $roomId");

      // 监听音视频流事件
      _rongCloudRTC.onRemoteStreamAdded.listen((RemoteStreamEvent event) {
        print("Remote stream added: ${event.userId}");
        // 在这里处理远程流的显示,例如使用Chewie或video_player插件
      });

      _rongCloudRTC.onRemoteStreamRemoved.listen((RemoteStreamEvent event) {
        print("Remote stream removed: ${event.userId}");
      });
    } catch (e) {
      print("RTC initialization failed: $e");
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter RongCloud RTC Demo'),
        ),
        body: Center(
          child: Text('RTC initialized and joined room'),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: () async {
            // 发送本地音视频流(确保麦克风和摄像头权限已授予)
            try {
              await _rongCloudRTC.startLocalStream();
              print("Started local stream");
            } catch (e) {
              print("Failed to start local stream: $e");
            }
          },
          tooltip: 'Start Stream',
          child: Icon(Icons.videocam),
        ),
      ),
    );
  }
}

4. 处理权限

确保在运行时请求麦克风和摄像头权限。这可以通过permission_handler插件来实现:

dependencies:
  permission_handler: ^最新版本号  # 请替换为实际最新版本号

然后在你的代码中请求权限:

import 'package:permission_handler/permission_handler.dart';

Future<void> _requestPermissions() async {
  var status = await Permission.microphone.status;
  if (!status.isGranted) {
    Map<Permission, PermissionStatus> statuses = await [
      Permission.microphone,
      Permission.camera,
    ].request();

    if (statuses[Permission.microphone]!.isGranted &&
        statuses[Permission.camera]!.isGranted) {
      print("Permissions granted");
    } else {
      print("Permissions denied");
    }
  }
}

// 在_initRTC之前调用_requestPermissions

注意

  • 上述代码是一个简单的示例,实际项目中可能需要更复杂的错误处理和状态管理。
  • RongCloud RTC 插件的具体API可能会随着版本更新而变化,请参考官方文档获取最新信息。
  • 确保你的应用已正确配置RongCloud SDK,并遵循其最佳实践。

希望这个示例能帮助你开始使用rongcloud_rtc_wrapper_plugin进行Flutter即时通讯RTC开发!

回到顶部