本文档主要讲解了如何使用融云 RTC Flutter Plugin,基于 融云 iOS/Android 平台的 RTCLib SDK
源码地址 Github,任何问题可以通过 Github Issues 提问
融云官网申请开发者账号
通过管理后台的 "基本信息"->"App Key" 获取 AppKey
通过管理后台的 "IM 服务"—>"API 调用"->"用户服务"->"获取 Token",通过用户 id 获取 IMToken
管理后台的 "音视频服务"->"服务设置" 开通音视频 RTC 3.0 ,开通两个小时后生效
在项目的 pubspec.yaml
中写如下依赖
dependencies:
flutter:
sdk: flutter
rongcloud_rtc_plugin: ^5.1.0
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 发送信令
RongIMClient.init(RongAppKey);
RongIMClient.connect(IMToken, (code, userId) {
});
RCRTCEngine.getInstance().init(null);
RCRTCCodeResult result = await RCRTCEngine.getInstance().joinRoom(roomId, roomConfig);
RCRTCCameraOutputStream stream = await RCRTCEngine.getInstance().getDefaultVideoStream();
stream.startCamera();
RCRTCCameraOutputStream stream = await RCRTCEngine.getInstance().getDefaultVideoStream();
RCRTCTextureView view = RCRTCTextureView(
(view, id) {
stream.setTextureView(id);
},
mirror: true,
);
int code = await RCRTCEngine.getInstance().getRoom().localUser.publishDefaultStreams();
List<RCRTCRemoteUser> remoteUserList = RCRTCEngine.getInstance().getRoom().remoteUserList;
循环订阅房间里远端用户的音视频流
for (RCRTCRemoteUser user in remoteUserList) {
RCRTCEngine.getInstance().getRoom().localUser.subscribeStreams(user.streamList);
}
for (RCRTCRemoteUser user in remoteUserList) {
user.streamList.whereType<RCRTCVideoInputStream>().forEach((stream) {
RCRTCTextureView view = RCRTCTextureView(
(view, id) {
stream.setTextureView(id);
},
mirror: false,
);
});
}
当用户加入的时候,不要做订阅渲染的处理
,因为此时该用户可能刚加入房间成功,但是尚未发布音视频流
RCRTCEngine.getInstance().getRoom().onRemoteUserJoined = (user) {
}
RCRTCEngine.getInstance().getRoom().onRemoteUserPublishResource = (user, streams) {
};
RCRTCEngine.getInstance().getRoom().localUser.subscribeStreams(streams);
streams.whereType<RCRTCVideoInputStream>().forEach((stream) {
RCRTCTextureView view = RCRTCTextureView(
(view, id) {
stream.setTextureView(id);
},
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();
更多接口请参考源码