跳到主要内容

实现音视频通话

CallLib 是在 RTCLib 基础上,额外封装了一套音视频呼叫功能 SDK,包含了单人音视频呼叫的各种场景和功能,通过集成它,您可以自由的实现音视频呼叫场景的各种玩法。

前置条件

步骤 1:权限配置

Android

  1. 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" />
  2. 如果您的应用需要支持 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 中的 onCallDidMakeonConnect 以及 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 长连接。建议在功能模块的加载位置处调用,之后再进行音视频业务。当模块退出后调用 disconnectlogout 断开该连接。

  1. 使用 onConnectionStatusChanged 监听 IM 连接状态的变化,连接状态发生变化时返回 RCIMIWConnectionStatus

    engine?.onConnectionStatusChanged = (RCIMIWConnectionStatus? status) {
    //...
    };
  2. 使用上方获取的 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);

开启视频通话时,默认开启的是前置摄像头。用户可以在发起呼叫前设置 RCCallVideoConfigdefaultCamera 属性,改变默认的摄像头。双方建立视频通话后,可以调用美颜相关的方法来开启美颜功能。

/// 设置视频分辨率、开启后置摄像头
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 客户端文档 推送概述