安卓端如何实现不依赖群组的实时音视频通话?


            
2018-01-19 18:09 | 音视频服务

回答:

#要实现不依赖群组的多人实时音视频通话,需要客户端和服务器端分别实现对应的逻辑

##服务器端

  1. 生成mediaId mediaId要求一个全局唯一的整数,且 0 < mediaId < 0x7fffffff

  2. 调用IM Server API 通过private消息发送实时音视频相关信令,调用IM Server API发送消息时,需要特别注意以下参数:

    fromUserId=当前用户(自己)的id
    toUserId=参会者1&toUserId=参会者2 // 除自己外的,所有参会者拼在一起
    isPersisted=0
    isCounted=0
    isIncludeSender=0

##客户端

  1. 实现io.rong.calllib.IRongCallSignalSender接口,实现时应当调用上一步实现的服务器端api,获取mediaId或发送实时音视频相关消息, 方法实现可参考如下:    

  2. public void getMediaId(final IRongCallSignalSender.GetMediaIdCallback callback) {
        // 工作http调用服务器接口,获取media id
        httpClientHelper.get(MEDIA_ID, MediaIdInfo.class, new HttpClientHelper.Callback<MediaIdInfo>() {
            @Override
            public void onSuccess(MediaIdInfo mediaIdInfo) {
                callback.onGotMediaId(mediaIdInfo.getMediaId() + "");
            }
    
            @Override
            public void onFail(RceErrorCode errorCode) {
                // TODO
                callback.onError(-1);
            }
        });
    }
    
    public void sendSignal(List<String> targetUserIds, Message message, String pushContent, String pushData, final IRongCallSignalSender.SendSignalCallback callback) {
        Map<String, Object> map = new HashMap<>();
        map.put("conversation_type", Conversation.ConversationType.PRIVATE.getValue() + "");
        map.put("target_ids", targetUserIds);
        map.put("object_name", message.getObjectName());
        map.put("content", new String(message.getContent().encode()));
        map.put("push_content", pushContent);
        map.put("push_data", pushData);
        map.put("persisted", false);
        map.put("include_sender", 0);
    
        httpClientHelper.post(MESSAGE_SENDER, map, GsonBaseInfo.class, new HttpClientHelper.Callback<GsonBaseInfo>() {
            @Override
            public void onSuccess(GsonBaseInfo gsonBaseInfo) {
                if (callback != null) {
                    callback.onSuccess();
                }
            }
    
            @Override
            public void onFail(RceErrorCode errorCode) {
                if (callback != null) {
                    // TODO
                    callback.onError(-1);
                }
            }
        });
    }
  3. SDK初始化之后,开发者主动调用RongCallClient.setCallSignalSender(IRongCallSignalSender signalSender) 设置CallSignalSender


  4. 如果自己实现通话界面,则调用如下方法开始不基于群组的多人voip:

  5. RongCallClient.getInstance().startCall(Conversation.ConversationType.NONE, null, invitedList, RongCallCommon.CallMediaType.VIDEO, /*或者  RongCallCommon.CallMediaType.AUDIO*/ "multi");


  6. 如果想直接使用融云提供的通话界面,那么可调用```RongCallKit```中的如下方法:

  7. /**
     * 发起的多人通话,不依赖群、讨论组等
     *
     * @param context
     * @param mediaType
     * @return
     */
    public static void startMultiCall(final Context context, ArrayList<String> userIds, final CallMediaType mediaType)

##说明

  1. 实现io.rong.calllib.IRongCallSignalSender接口时,不能采用端上直接发送private消息,会导致超频。

  2. 设置CallSignalSender后,在群里发起实时音视频通话,相关信令走的也是上面所实现的CallSignalSender

您认为此回答对您有帮助?

共有 0 位开发者认为此问题有帮助

我对此仍有疑问!继续追问