实现音视频通话
CallLib 是在 RTCLib 基础上,额外封装了一套音视频呼叫功能 SDK,包含了单人音视频呼叫的各种场景和功能,通过集成它,您可以自由的实现音视频呼叫场景的各种玩法。
前置条件
-
注册开发者账号。注册成功后,控制台会默认自动创建您的首个应用,默认生成开发环境下的 App Key,使用国内数据中心。
-
获取开发环境的应用 App Key。如不使用默认应用,请参考 如何创建应用,并获取对应环境 App Key 和 App Secret。
注意
每个应用具有两个不同的 App Key,分别对应开发环境与生 产环境,两个环境之间数据隔离。在您的应用正式上线前,可切换到使用生产环境的 App Key,以便上线前进行测试和最终发布。
-
完成开通音视频服务。请开通音视频通话服务。
步骤 1:权限配置
Android
-
在
AndroidManifest.xml
中声明 SDK 需要的所有权限。xml<!-- 音视频需要网络权限 和 监听网络状态权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 摄像头采集需要 -->
<uses-permission android:name="android.permission.CAMERA" />
<!-- 音频采集需要 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> -
如果您的应用需要支持 Android 6.0(API 级别 23)或更高版本的设备,您还需要在 App 用户使用对应功能时请求摄像头(
CAMERA
)、麦克风(RECORD_AUDIO
)权限。详见 Android 开发者官方文档运行时权限与请求权限的工作流。
iOS
请在 Info.plist
文件中添加摄像头和麦克风的申请权限:
<key>NSCameraUsageDescription</key>
<string>摄像头权限使用描述</string>
<key>NSMicrophoneUsageDescription</key>
<string>麦克风权限使用描述</string>
步骤 2:使用 App Key 初始化
音视频用户之间的信令传输依赖于融云的即时通信(IM)服务,所以要先初始化 IM SDK(rongcloud_im_wrapper_plugin)。IM SDK 的初始化方法接受一个 App Key 参数,和一个可选的 IM 引擎配置(RCIMIWEngineOptions
。如果不换 AppKey,在整个应用生命周期中,初始化一次即可。
RCIMIWEngineOptions options = RCIMIWEngineOptions.create();
RCIMIWEngine imEngine = await RCIMIWEngine.create(appKey, options);
注意
如需详细了解 IM SDK 初始化方法和具体配置,请转至 IM SDK 开发者文档初始化。
步骤 3:通话事件处理
-
开发者可通过设置
RCCallEngine
中的onReceiveCall
方法来监听通话呼入。Dartengine?.onReceiveCall = (RCCallSession session) {
/// session 通话实体
}; -
开发者可通过设置
RCCallEngine
中的onCallDidMake
、onConnect
以及onDisconnect
方法来监听通话状态的变化。Dart/// 通话拨出监听
engine?.onCallDidMake = () {
};
/// 通话建立监听
engine?.onConnect = () {
};
/// 通话断开监听
engine?.onDisconnect = (RCCallDisconnectReason reason) {
/// reason 断开原因
};
步骤 4:获取用户 Token
用户 Token 是与用户 ID 对应的身份 验证令牌,是应用程序的用户在融云的唯一身份标识。应用客户端在使用融云即时通讯功能前必须与融云建立 IM 连接,连接时必须传入 Token。
在实际业务运行过程中,应用客户端需要通过应用的服务端调用 IM Server API 申请取得 Token。详见 Server API 文档 注册用户。
在本教程中,为了快速体验和测试 SDK,您可以控制台「北极星」开发者工具箱 IM Server API 调试 页面调用接口获取 Token 用于测试。
步骤 5:连接 IM 服务
获取 IM 引擎实例后,需要先调用 connect
方法与 IM 服务建立好 TCP 长连接。建议在功能模块的加载位置处调用,之后再进行音视频业务。当模块退出后调用 disconnect
或 logout
断开该连接。
-
使用
onConnectionStatusChanged
监听 IM 连接状态的变化,连接状态发生变化时返回 RCIMIWConnectionStatus。Dartengine?.onConnectionStatusChanged = (RCIMIWConnectionStatus? status) {
//...
}; -
使用上方获取的 Token,模拟 userId 为 1 的用户连接到融云服务器。调用结果会直接通过
connect
方法中传入的 RCIMIWConnectCallback 返回。DartRCIMIWConnectCallback? callback = RCIMIWConnectCallback(onDatabaseOpened: (int? code) {
//...
}, onConnected: (int? code, String? userId) {
//...
});
int? ret = await engine?.connect(token, timeout, callback:callback);
注意
- 如调用此接口时,遇到网络不好导致连接失败,SDK 会自动启动重连机制进行最多 10 次重连,重连时间间隔分别为 1, 2, 4, 8, 16, 32, 64, 128, 256, 512 秒。在这之后如果仍没有连接成功,还会在检测到设备网络状态变化,比如网络恢复或切换网络时再次尝试重连。
- 如 App 在被杀死后,接收到了推送通知,点击通知拉起应用时,需要再次调用 connect 方法进行连接。
- 如需详细了解 IM SDK 连接方法和具体配置,请转至 IM SDK 开发者文档连接。
步骤 6:发起呼叫
连接 IM 服务成功后,可调用 RCCallEngine
中的 startCall
来方法发起通话。
/// 被叫用户 Id
String targetId = 'UserB';
/// 通话媒体类型
RCCallMediaType mediaType = RCCallMediaType.audio_video;
engine?.startCall(targetId, mediaType);
开启视频通话时,默认开启的是前置摄像头。用户可以在发起呼叫前设置 RCCallVideoConfig
的 defaultCamera
属性,改变默认的摄像头。双方建立视频通话后,可以调用美颜相关的方法来开启美颜功能。
/// 设置视频分辨率、开启后置摄像头
RCCallVideoConfig config = RCCallVideoConfig.create(profile: RCCallVideoProfile.profile_1080_1920_high,
defaultCamera: RCCallCamera.back);
int ret = await Utils.engine!.setVideoConfig(config);
步骤 7:呼叫接听
在收到 onReceiveCall(RCCallSession session)
回调之后,调用如下方法接听通话。
engine?.accept();
步骤 8:离线推送通知
如果需要在 App 已经被系统回收的情况下也收到呼叫推送通知,则必须集成远程推送。请参见 IM 客户端文档 推送概述 。