集成 RTC SDK 后,你可以使用其中接口快速构建基础应用,实现基本实时音视频通话;你也能通过阅读代码,了解音视频通话的最佳实践。
关于完整的项目实现,参考 Demo 工程文件。
本步骤为如何创建一个新项目,如集成到已有项目,请跳过该步骤。
请参考 Create the App 创建一个 Flutter 项目。
在终端中进入项目根目录,运行如下命令安装依赖项:
flutter pub add volc_engine_rtc
这将在你项目的 pubspec.yaml
文件中添加这样的一行:
dependencies: volc_engine_rtc: ^3.44.1
将下载的 SDK 文件夹复制到你的项目文件夹下。
在 pubspec.yaml
文件中添加 volc_engine_rtc
依赖项:
environment: sdk: ">=2.12.0 <3.0.0" # 依赖项 dependencies: flutter: sdk: flutter # 将 <SDK_PATH> 替换为项目下SDK的文件路径 volc_engine_rtc: path: <SDK_PATH>
选择以上任意一种方式添加依赖项后,当需要更新 SDK 版本时,在终端中进入项目根目录,运行如下命令更新依赖项:
flutter pub get
权限获取:
在使用音视频功能前,请先在代码中申请音视频权限,本文采用 permission_handler
组件库为例:
[Permission.camera, Permission.microphone].request()
目标平台项目配置
iOS 平台
打开 Info.plist
文件添加下列权限
Privacy - Microphone Usage Description ,并填入使用麦克风的原因(Value)
Privacy - Camera Usage Description ,并填入使用摄像头的原因(Value)
打开 Podfile
文件添加如下代码
# Uncomment this line to define a global platform for your project # platform :ios, '11.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' source 'https://github.com/CocoaPods/Specs.git' ··· source 'https://github.com/volcengine/volcengine-specs' ···
根据场景需要,为你的项目创建音视频通话的用户界面。若已有用户界面,请跳过此步骤。
如果你想实现基本的音视频通话,我们建议你在项目中添加如下元素:
房间ID
用户 ID
本地视频窗口
远端视频窗口
打开麦克风按钮
打开摄像头按钮
结束通话按钮
在用到 SDK API 的文件中引入头文件。
//引入 byte_rtc_engine_SDK 头文件 import 'package:volc_engine_rtc/volc_engine_rtc.dart';
首先你需要调用 RTCVideo.createRTCVideo
接口,创建一个引擎单例,以使用 RTC 提供的各种音视频能力。
如果当前进程中未创建引擎实例,那么你必须先使用此方法创建实例;
如果当前进程中已创建了引擎实例,再次调用此方法时,会返回已创建的实例。
你需要在该方法中传入以下参数:
参数名 | 类型 | 说明 |
---|---|---|
context | RTCVideoContext | 引擎环境参数 |
static Future<RTCVideo?> createRTCVideo(RTCVideoContext context)
创建引擎实例后,你可以调用RTCVideo.setMaxVideoEncoderConfig
设置视频编码参数修改发布的视频流属性。
你需要在该方法中传入以下参数:
参数名 | 类型 | 说明 |
---|---|---|
maxSolution | VideoEncoderConfig | 视频发布端设置期望发布的最大分辨率视频流参数,包括分辨率、帧率、码率、网络不佳时的回退策略等。 |
Future<int?> setMaxVideoEncoderConfig(VideoEncoderConfig maxSolution)
加入房间前,你需要设置本地视图以在通话中看到本地图像,首先创建RTCViewContext
实例:
参数名 | 类型 | 说明 |
---|---|---|
uid | String | 本地用户 Id |
streamType | StreamIndex | 流类型,默认为主视频流 |
RTCViewContext.localContext( {required this.uid, this.streamType = StreamIndex.main})
再由创建的RTCViewContext
实例构建RTCSurfaceView
视频渲染视图:
参数名 | 类型 | 说明 |
---|---|---|
context | RTCViewContext | 渲染视图环境参数 |
renderMode | VideoRenderMode | 视频渲染模式 |
backgroundColor | int | 用于填充画布空白部分的背景颜色,颜色格式为BGR。取值范围是 `[0x0000000, 0xFFFFFFFF]`。默认值是 `0x00000000`。其中,透明度设置无效。 |
zOrderOnTop | bool | 仅安卓使用,参考Android官方接口文档 |
zOrderMediaOverlay | bool | 仅安卓使用,参考Android官方接口文档 |
onPlatformViewCreated | PlatformViewCreatedCallback | `PlatformView` 被创建时,收到此回调 |
gestureRecognizers | Set<Factory | 应转发哪些手势给 `PlatformView` |
const RTCSurfaceView({ Key? key, required this.context, this.renderMode = VideoRenderMode.hidden, this.backgroundColor = 0, this.zOrderOnTop = false, this.zOrderMediaOverlay = false, this.onPlatformViewCreated, this.gestureRecognizers, })
创建引擎实例后,你需要调用RTCVideo.startVideoCapture
开启视频采集,以在通话中使用视频功能。
Future<void> startVideoCapture()
创建引擎实例后,你需要调用RTCVideo.startAudioCapture
开启音频采集,以在通话中使用音频功能。
Future<void> startAudioCapture()
完成初始化后,你就可以调用RTCVideo``.createRTCRoom
创建房间。
参数名 | 类型 | 说明 |
---|---|---|
roomId | String | 房间 Id |
Future<RTCRoom?> createRTCRoom(String roomId)
成功创建房间后,你就可以调用RTCRoom``.setRTCRoomEventHandler
设置房间事件回调处理。
参数名 | 类型 | 说明 |
---|---|---|
eventHandler | RTCRoomEventHandler | 房间事件回调处理器 |
void setRTCRoomEventHandler(RTCRoomEventHandler eventHandler)
完成房间初始化后,你就可以调用RTCRoom``.joinRoom
加入房间。
你需要在该方法中传入以下参数:
参数名 | 类型 | 说明 |
---|---|---|
token | String | 动态密钥,用于对登录用户进行鉴权验证。 |
userInfo | UserInfo | 用户信息。 |
roomConfig | RoomConfig | 房间信息配置。 |
Future<int?> joinRoom( {required String token, required UserInfo userInfo, required RoomConfig roomConfig})
加入房间后,你需要在 RTCRoomEventHandler.onRoomStateChanged
中处理首次加入房间/重连加入房间的事件。
回调参数说明:
参数名 | 类型 | 说明 |
---|---|---|
roomId | String | 房间 ID。 |
uid | String | 用户 ID。 |
state | int | 用户加入房间回调的状态码。 |
extraInfo | String | 加入房间的类型。 |
typedef OnRoomStateChangedType = void Function( String roomId, String uid, int state, String extraInfo);
加入房间后,你需要在 RTCRoomEventHandler.onUserJoined
中处理远端用户加入房间的事件。
回调参数说明:
参数名 | 类型 | 说明 |
---|---|---|
userInfo | UserInfo | 用户信息。 |
elapsed | int | 保留字段,无意义 |
typedef OnUserJoinedType = void Function(UserInfo userInfo, int elapsed);
加入房间后,你需要在 RTCVideoEventHandler.onFirstRemoteVideoFrameDecoded
中处理第一帧远端视频流在视图上渲染成功后的事件。
回调参数说明:
参数名 | 类型 | 说明 |
---|---|---|
streamKey | RemoteStreamKey | 远端流信息。 |
videoFrameInfo | VideoFrameInfo | 视频帧信息。 |
OnFirstRemoteVideoFrameRenderedType = void Function(RemoteStreamKey streamKey,VideoFrameInfo videoFrameInfo)
在确认收到远端用户的第一帧视频渲染回调后,你需要设置远端视图以在通话中查看远端图像,将接口创建的RTCViewContext
实例用于构建视频渲染视图RTCSurfaceView
。
你需要在该方法中传入以下参数:
参数名 | 类型 | 说明 |
---|---|---|
roomId | String | 房间ID |
uid | String | 视频来源的远端用户 ID |
streamType | StreamIndex | 流类型,默认为主视频流 |
RTCViewContext.remoteContext( {required this.roomId, required this.uid, this.streamType = StreamIndex.main})
加入房间后,你需要在 RTCRoomEventHandler.onUserLeave
的此回调中处理远端用户离开房间的事件。
回调参数说明:
参数名 | 类型 | 说明 |
---|---|---|
uid | String | 离开房间,或切至隐身的远端用户 ID 。 |
reason | int | 用户离开房间的原因。 |
OnUserLeaveType = void Function(String uid,int reason)
在结束通话等场景下,你需要调用 RTCRoom.leaveRoom
离开房间,结束通话过程,释放所有通话相关的资源。
Future<int?> leaveRoom()
在 RTC 房间实例相关的业务场景全部结束后,你可以调用RTCRoom.destroy
销毁房间,并释放所有相关资源。
Future<void> destroy()
在 RTC 引擎实例相关的业务场景全部结束后,你可以调用RTCVideo``.``destroy
销毁由引擎创建的单例,并释放所有相关资源。
Future<void> destroy()
至此,我们实现了基本的音视频通话。