融云 RTC Flutter Plugin

GitHub stars Pub version

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

Flutter 官网

融云 iOS RTC 文档

融云 Android RTC 文档

源码地址 Github,任何问题可以通过 Github Issues 提问

前期准备

1 申请开发者账号

融云官网申请开发者账号

通过管理后台的 "基本信息"->"App Key" 获取 AppKey

通过管理后台的 "IM 服务"—>"API 调用"->"用户服务"->"获取 Token",通过用户 id 获取 IMToken

2 开通音视频服务

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

依赖 RTC Flutter Plugin

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

dependencies:
  flutter:
    sdk: flutter
  rongcloud_rtc_plugin: ^5.1.4+7

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

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

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

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" />

从 1.1.0 开始为方便排查 Android 问题将 RTC Flutter SDK Android 的包名改为 io.rong.flutter.rtclib

项目依赖关系

如图 RTC 依赖于 IM 发送信令

音视频模式处理流程

1.用户加入房间,渲染并发布流的处理过程

2.渲染已经在房间的远端用户的处理过程

3.渲染后续进入房间的远端用户的处理过程

音视频模式接口说明

1.用户加入房间,渲染并发布流

1.1.初始化 IM SDK

RongIMClient.init(RongAppKey);

1.2.连接 IM

RongIMClient.connect(IMToken, (code, userId) {
});

1.3.初始化RTC SDK

RCRTCEngine.getInstance().init(null);

1.4.加入 RTC 房间

RCRTCRoomConfig roomConfig = RCRTCRoomConfig(
  RCRTCRoomType.Normal,
  RCRTCLiveType.AudioVideo,
  RCRTCLiveRoleType.Broadcaster,
);
RCRTCCodeResult result = await RCRTCEngine.getInstance().joinRoom(roomId, roomConfig);

1.5.开始采集视频

RCRTCCameraOutputStream stream = await RCRTCEngine.getInstance().getDefaultVideoStream();
stream.startCamera();

1.6.渲染当前用户视频流到 view 上

RCRTCCameraOutputStream stream = await RCRTCEngine.getInstance().getDefaultVideoStream();
RCRTCTextureView view = RCRTCTextureView(
  (view, id) {
    stream.setTextureView(id);
  },
  fit: BoxFit.contain,
  mirror: true,
);

1.7.发布当前用户音视频流

int code = await RCRTCEngine.getInstance().getRoom().localUser.publishDefaultStreams();

2.渲染已经在房间的远端用户

2.1.获取已经在房间里的远端用户列表

List<RCRTCRemoteUser> remoteUserList = RCRTCEngine.getInstance().getRoom().remoteUserList;

2.2.订阅远端用户的音视频流

循环订阅房间里远端用户的音视频流

for (RCRTCRemoteUser user in remoteUserList) {
	RCRTCEngine.getInstance().getRoom().localUser.subscribeStreams(user.streamList);
}

2.3.渲染远端用户的视频流到 view 上

for (RCRTCRemoteUser user in remoteUserList) {
  user.streamList.whereType<RCRTCVideoInputStream>().forEach((stream) {
    RCRTCTextureView view = RCRTCTextureView(
      (view, id) {
        stream.setTextureView(id);
      },
      fit: BoxFit.contain,
      mirror: false,
    );
  });
}

3.渲染后续进入房间的远端用户

3.1.监听远端用户加入的回调

当用户加入的时候,不要做订阅渲染的处理,因为此时该用户可能刚加入房间成功,但是尚未发布音视频流

RCRTCEngine.getInstance().getRoom().onRemoteUserJoined = (user) {
}

3.2.监听远端用户发布流的回调

RCRTCEngine.getInstance().getRoom().onRemoteUserPublishResource = (user, streams) {
};

3.3.远端用户发布流成功,则通过 streams 订阅该用户的音视频流

RCRTCEngine.getInstance().getRoom().localUser.subscribeStreams(streams);

3.4.渲染该用户的视频流到 view 上

streams.whereType<RCRTCVideoInputStream>().forEach((stream) {
  RCRTCTextureView view = RCRTCTextureView(
    (view, id) {
      stream.setTextureView(id);
    },
    fit: BoxFit.contain,
    mirror: false,
  );
});

直播模式处理流程

如果使用直播模式,请参考此文档

纯音频模式处理流程

如果使用纯音频模式,请参考此文档

其他接口

配置接口

配置视频流

RCRTCCameraOutputStream stream = await RCRTCEngine.getInstance().getDefaultVideoStream();
stream.setVideoConfig(config);

离开房间

int code = await RCRTCEngine.getInstance().leaveRoom();

取消发布当前用户音视频流

RCRTCEngine.getInstance().getRoom().localUser.unPublishDefaultStreams();

取消订阅远端用户的音视频流

int code = await RCRTCEngine.getInstance().getRoom().localUser.unsubscribeStreams(streams);

当前用户静音

RCRTCMicOutputStream stream = await RCRTCEngine.getInstance().getDefaultAudioStream();
stream.mute(mute);

切换本地摄像头

RCRTCCameraOutputStream stream = await RCRTCEngine.getInstance().getDefaultVideoStream();
bool isFront = await stream.switchCamera();

更多接口请参考源码