实现音视频通话
CallLib 是在 RTCLib 基础上,额外封装了一套音视频呼叫功能 SDK,包含了单人音视频呼叫的各种场景和功能,通过集成它,您可以自由的实现音视频呼叫场景的各种玩法。
前置条件
-
注册开发者账号。注册成功后,控制台会默认自动创建您的首个应用,默认生成开发环境下的 App Key,使用国内数据中心。
-
获取开发环境的应用 App Key。如不使用默认应用,请参考 如何创建应用,并获取对应环境 App Key 和 App Secret。
注意
每个应用具有两个不同的 App Key,分别对应开发环境与生 产环境,两个环境之间数据隔离。在您的应用正式上线前,可切换到使用生产环境的 App Key,以便上线前进行测试和最终发布。
-
完成开通音视频服务。请开通音视频通话服务。
步骤 1:权限配置
Android
-
在
AndroidManifest.xml
中声明 SDK 需要的所有权限。<!-- 音视频需要网络权限 和 监听网络状态权限 -->
<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
方法来监听通话呼入。engine?.onReceiveCall = (RCCallSession session) {
/// session 通话实体
}; -
开发者可通过设置
RCCallEngine
中的onCallDidMake
、onConnect
以及onDisconnect
方法来监听通话状态的变化。/// 通话拨出监听
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。engine?.onConnectionStatusChanged = (RCIMIWConnectionStatus? status) {
//...
}; -
使用上方获取的 Token,模拟 userId 为 1 的用户连接到融云服务器。调用结果会直接通过
connect
方法中传入的 RCIMIWConnectCallback 返回。RCIMIWConnectCallback? 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 客户端文档 推送概述 。