使用融云 SDK 的信令消息集成第三方音视频

    产品概述

    提供基于 TCP 协议的消息通道,兼容主流音视频 SDK,支持离线推送和自定义消息。信令消息不丢、不乱序、稳定可靠。

    支持平台:

    支持 iOS、Android、Web、Mac、Windows、Linux,并支持平台间互通。

    注:Mac、Windows、Linux 版本可基于 Electron 开发实现,暂不支持 C++ 版本的原生 Mac、Windows、Linux 版本 SDK。

    前期准备

    1. 了解融云 IM 即时通讯的基本概念和架构

    2. 注册融云开发者账号并创建应用

    3. 下载融云 IMLib SDK

    4. 了解如何集成融云 IMLib SDK,相关文档如下:

    集成流程

    1. 初始化融云 SDK

    2. 获取 Token

    3. 设置消息监听

    4. 连接服务器

    5. 发送信令消息

    6. 基于信令消息与主流音视频 SDK 对接

    集成指南

    目前已提供的音视频通讯信令消息如下:

    消息类型 描述 类名
    RC:VCInvite 用于主动邀请用户进行实时音视频通话 RCCallInviteMessage
    RC:VCAccept 用户收到邀请信息,接受邀请时可向邀请用户发送此消息,表示同意接听 RCCallAcceptMessage
    RC:VCHangup 实时音视频通话结束挂断时,发送此消息 RCCallHangupMessage
    RC:VCModifyMedia 音视频通话过程中,切换通话类型(音频/视频)时发送此条消息 RCCallMediaModifyMessage
    RC:VCModifyMem 实时音视频通话过程中发生人员变化时,发送此条通知消息 RCCallMemberModifyMessage
    RC:VCRinging 实时音视频响铃 RCCallRingingMessage

    注:融云内置信令消息支持离线通知,用户上线后可接收到离线期间的信令消息。

    呼叫邀请

    市场上的音视频通讯服务基本上是基于房间逻辑,使用发布订阅逻辑进行音视频通话,因此要实现呼叫功能必须发起方和被呼叫方在同一个房间中,二者均发布资源和互相订阅对方的资源,多方通话的流程和二人通话的流程类似,二人通话时直接把信令消息发送给对方即可。

    呼叫功能需要实现以下流程:

    1. 加入房间,
    2. 设置音视频参数,
    3. 发布资源,
    4. 邀请用户(呼叫),中间有一步失败都会面临失败

    邀请用户进行通话时,可通过发送融云 RCCallInviteMessage 信令消息,目标用户收到此消息后,可进行接受/拒绝操作处理。

    信令消息结构:

    {
      "callId":"3211",
      "mediaType":“Audio”,
      "mediaId":"3231",
      "inviteUserIds":"123"
    }
    
    名称 说明
    callId 当前音视频呼叫 ID,一般为音视频房间的 ID 或者 channalId
    mediaType 音视频类型:音频、视频
    mediaId 媒体 ID,根据业务需要可选择进行设置
    inviteUserIds 邀请目票用户列表

    邀请信令消息通过 VoIP Push 方法发送,用户如未在线时,将会收到 VoIP 远程推送通知,详细发送方法文档如下:

    接听呼叫

    接收到邀请信令消息后,如用户接受邀请需要向对方回复 RCCallAcceptMessage 信令消息,对方收到接受信令消息后可加入通话。

    信令消息结构:

    {
    "callId":"Xcdsklloeeedsdccddd"
    "mediaType":"video"
    }
    
    名称 说明
    callId 当前音视频呼叫 ID,一般为音视频房间的 ID 或者 channalId
    mediaType 接听时选择的媒体类型

    挂断通话

    通话结束后,需要发送挂断信令消息 RCCallHangupMessage 通知对方该用户已退出。

    信令消息结构:

    {
    "callId":"Xcdsklloeeedsdccddd"
    "reason":"busy"
    }
    
    名称 说明
    callId 当前音视频呼叫 ID,一般为音视频房间的 ID 或者 channalId
    reason 挂断原因

    拒绝邀请

    接收到邀请信令消息后,如拒绝接听时,可通过发送挂断信令消息方式实现,需要向对方回复 RCCallHangupMessage 消息,对方收到拒绝信令消息后结束邀请。

    如需要区分挂断和拒绝信令状态,可自定义拒绝信令消息,通过自定义消息方式实现。

    自定义消息文档如下:

    成员变化通知

    通话过程中,如发生成员变化时(增加/减少),需要发送成员变化信令消息 RCCallMemberModifyMessage 通知当前房间中正在通话的其他成员。

    信令消息结构:

    {
    "callId":"Xcdsklloeeedsdccddd"
    "modifyMemType":"add"
    "caller":"Xclldooddfas"
    "mediaType":"audio"
    "extra":""
    "inviteUserIds":["xdsdsd","dsafdsfdsfd"],
    "existedMemberStatusList":["sdiafjaodis","dfasiodf"]
    }
    
    名称 说明
    callId 当前音视频呼叫 ID,一般为音视频房间的 ID 或者 channalId
    modifyMemType 成员修改类型,添加或删除
    caller 由谁发起
    mediaType 媒体类型
    extra 其他消息
    inviteUserIds 邀请用户列表
    existedMemberStatusList 已存在的用户列表

    媒体类型修改

    通话过程中,如切换当前通话类型时(如视频通话切换为音频通话),需要发送切换通话类型信令消息 RC:VCModifyMedia 通知对方切换展示方式。

    信令消息结构:

    {
    "callId":"Xcdsklloeeedsdccddd"
    "mediaType":"video"
    }
    
    名称 说明
    callId 当前音视频呼叫 ID,一般为音视频房间的 ID 或者 channalId
    mediaType 修改之后的媒体类型

    响铃通知

    邀请某用户进行音视频通话时,如用户未接听正在响铃中状态可选择发送此信令消息,用于标识目标用户在线正在响铃中状态。

    信令消息结构:

    {
    "callId":"Xcdsklloeeedsdccddd"
    }
    
    名称 说明
    callId 当前音视频呼叫 ID,一般为音视频房间的 ID 或者 channalId

    自定义信令消息

    如提供的信令消息,无法满足客户的业务需求时,可通过自定义消息的方式,自定义通话信令发送。融云自定义消息文档如下:

    消息发送说明

    发送信令消息的说明文档如下:

    Android 消息发送

    通过 option 设置此消息是否发启 VoIP Push 通知,目前仅支持设置 isVoIPPush,如果对端设备是 iOS,设置 isVoIPPush 为 True,则会发送 VoIP Push,如对端为 Android 设备则正常发送此消息。

    注:发送邀请信令消息时需要将 isVoIPPush 设置为 True

    /**
     * <p>发送消息。
     * 通过 {@link io.rong.imlib.IRongCallback.ISendMessageCallback} 中的方法回调发送的消息状态及消息体。</p>
     *
     * @param message     将要发送的消息体。
     * @param pushContent 当下发 push 消息时,在通知栏里会显示这个字段。
     *                    如果发送的是自定义消息,该字段必须填写,否则无法收到 push 消息。
     *                    如果发送 sdk 中默认的消息类型,例如 RC:TxtMsg, RC:VcMsg, RC:ImgMsg,则不需要填写,默认已经指定。
     * @param pushData    push 附加信息。如果设置该字段,用户在收到 push 消息时,能通过 {@link io.rong.push.notification.PushNotificationMessage#getPushData()} 方法获取。
     * @param option      发送消息附加选项,目前仅支持设置 isVoIPPush,如果对端设备是 iOS,设置 isVoIPPush 为 True,会走 VoIP 通道推送 Push,如对端为 Android 设备则正常发送此消息。
     * @param callback    发送消息的回调,参考 {@link io.rong.imlib.IRongCallback.ISendMessageCallback}。
     */
    public void sendMessage(final Message message, final String pushContent, final String pushData, final SendMessageOption option, final IRongCallback.ISendMessageCallback callback) {
    }
    

    iOS 消息发送

    通过 option 设置此消息是否发启 VoIP Push 通知,目前仅支持设置 isVoIPPush,设置 isVoIPPush 为 YES,则对端为 iOS 时会发送 VoIP Push,默认为 NO,则不会发送 VoIP Push。如对端为 Android 设备则正常发送此消息。

    注:发送邀请信令消息时需要将 isVoIPPush 设置为 YES

    /*!
     发送消息
    
     @param conversationType    发送消息的会话类型
     @param targetId            发送消息的目标会话ID
     @param content             消息的内容
     @param pushContent         接收方离线时需要显示的远程推送内容
     @param pushData            接收方离线时需要在远程推送中携带的非显示数据
     @param option              消息的相关配置
     @param successBlock        消息发送成功的回调 [messageId:消息的ID]
     @param errorBlock          消息发送失败的回调 [nErrorCode:发送失败的错误码,
     messageId:消息的ID]
     @return                    发送的消息实体
    
     @discussion 当接收方离线并允许远程推送时,会收到远程推送。
     远程推送中包含两部分内容,一是pushContent,用于显示;二是pushData,用于携带不显示的数据。
    
     SDK内置的消息类型,如果您将pushContent和pushData置为nil,会使用默认的推送格式进行远程推送。
     自定义类型的消息,需要您自己设置pushContent和pushData来定义推送内容,否则将不会进行远程推送。
    
     如果您使用此方法发送图片消息,需要您自己实现图片的上传,构建一个RCImageMessage对象,
     并将RCImageMessage中的imageUrl字段设置为上传成功的URL地址,然后使用此方法发送。
    
     如果您使用此方法发送文件消息,需要您自己实现文件的上传,构建一个RCFileMessage对象,
     并将RCFileMessage中的fileUrl字段设置为上传成功的URL地址,然后使用此方法发送。
    
     @warning 如果您使用IMLib,可以使用此方法发送消息;
     如果您使用IMKit,请使用RCIM中的同名方法发送消息,否则不会自动更新UI。
     */
    - (RCMessage *)sendMessage:(RCConversationType)conversationType
                      targetId:(NSString *)targetId
                       content:(RCMessageContent *)content
                   pushContent:(NSString *)pushContent
                      pushData:(NSString *)pushData
                        option:(RCSendMessageOption *)option
                       success:(void (^)(long messageId))successBlock
                         error:(void (^)(RCErrorCode nErrorCode, long messageId))errorBlock;
    

    信令消息离线说明

    融云内置信令消息支持离线通知,默认存储 7 天,用户上线后可接收到离线期间的所有信令消息。

    如业务需要发送不支持离线的信令消息,可通过自定义消息方式实现,设置该自定义信令消息为不存储即可。