集成腾讯互动直播之大咖模式采坑记录

        最近在做互动直播,公司最后选择使用腾讯的直播sdk,而且为了增强用户体验,选择了腾讯互动直播的大咖模式。这里不得不吐槽一下,腾讯的sdk文档写的不是烂,而是非常烂,让人看的云里雾里的,结果就是大家都在他的官方问题qq群里提问题,各种问题。当然本人在集成的过程中也在群里问了很多问题,但是结果却是失望,回答的一点也不专业,最后还是跟ios一起讨论,互相参考对方的集成文档,确定的解决方案。以下内容只讨论客户端集成,没有主播端。

    一。什么是大咖模式?

        腾讯官方文档: 大咖房间是指大咖主播创建一个聊天室房间,其他人可以加入这个房间进行文本聊天。当大咖准备好了,可以开启视频直播,聊天室房间增加音视频房间变成一个正常房间。解释的很清楚,就是直播不一定非要开始了才可以进入房间,用户可以提前进入房间聊天,直播开始了正常直播。

    二。集成步骤(官方,存在问题)

    官方直播集成文档 :用户端需要做的步骤是:

    1.引入官方sdk

compile 'com.tencent.livesdk:livesdk:1.1.4'

    2.初始化 参数由后台提供,无需关心

   3.账号登陆  参数由后台提供,无需关心

   4.加入房间

      在这一步如果是正常的直播是没有任何问题的,但是如果是大咖模式就不对了。

    解决问题一:直播未开始,用户提前进入房间,接收不到消息。

     我们要先根据大咖模式在这一步骤前插入加入TIM聊天室。

TIMGroupManager.getInstance().applyJoinGroup("" + chatId.getText(), "request to join" + chatId.getText(), new TIMCallBack() {
                @Override
                public void onError(int i, String s) {
                }

                @Override
                public void onSuccess() {
                    //这里跟官方文档有些出入了,这里再去加入直播房间,不需要绑定
                }
            });

    聊天室加入成功了,我们再去加入房间,房间加入成功了再去绑定。加入房间代码如下:

ILVLiveRoomOption memberOption = new ILVLiveRoomOption("" + data.getOwner_identifier())
                .autoCamera(false)
                .audioInitCompletedListener(new ILiveRoomOption.onAudioInitCompletedListener() {
                    @Override
                    public void onAudioInitCompleted() {
                        Log.e("TAG", "onAudioInitCompleted: 视频初始化完成");
                    }
                })
                .setRequestViewLisenter(new ILiveRoomOption.onRequestViewListener() {
                    @Override
                    public void onComplete(String[] identifierList, AVView[] viewList, int count, int result, String errMsg) {
                        Log.e("TAG", "onComplete: 请求画面回来了");
                    }
                })
                .audioCategory(AVRoomMulti.AUDIO_CATEGORY_MEDIA_PLAYBACK)
                .imsupport(false)//不用直播的im聊天
                .roomDisconnectListener(this)
                .videoMode(ILiveConstants.VIDEOMODE_NORMAL)
                .controlRole("Guest")
                .authBits(AVRoomMulti.AUTH_BITS_JOIN_ROOM | AVRoomMulti.AUTH_BITS_RECV_AUDIO | AVRoomMulti.AUTH_BITS_RECV_CAMERA_VIDEO | AVRoomMulti.AUTH_BITS_RECV_SCREEN_VIDEO)
                .videoRecvMode(AVRoomMulti.VIDEO_RECV_MODE_SEMI_AUTO_RECV_CAMERA_VIDEO)
                .autoMic(false);
        ILVLiveManager.getInstance().joinRoom(Integer.parseInt(data.getRoom_id()), memberOption, new ILiveCallBack() {
            @Override
            public void onSuccess(Object da) {
                ILiveRoomManager.getInstance().bindIMGroupId("" + data.getRoom_id());//将聊天和直播房间进行绑定,但是注意,不一定绑定成功
            }

            @Override
            public void onError(String module, int errCode, String errMsg) {
            }
        });

    注意:我们加入房间的时候采用的是不用直播的im聊天,为什么?因为如果采用直播的内置im聊天会出现一个问题,那就是加入直播10点开始,用户9点进入房间了,此时用户可以发消息,但是收不到消息!当主播进入一次房间后这个问题就不存在了。为什么会这样呢?因为直播的中心是主播,可以这么理解,主播提前开了一个房间,但是呢他没有进来过,用户提前进来后,聊天房间是存在的,用户发送消息主播可以收到消息,但是此时主播不在,没有把消息给其他人分发下去,所以其他人收不到消息。所以我们就应该另辟蹊径,不用直播内置的im聊天,而是我们自己用im的sdk去聊天。上面我们加入房间的时候已经调用TIM的sdk加入聊天室了,所以我们需要用TIM的sdk去接收消息就可以了,也就是我们绕过主播,自己去聊天。接收消息如下:

TIMManager.getInstance().addMessageListener(new TIMMessageListener() {
            @Override
            public boolean onNewMessages(List<TIMMessage> list) {
                for (int f = 0; f < list.size(); f++) {
                    TIMMessage msg = list.get(f);
                    for (int i = 0; i < msg.getElementCount(); ++i) {
                        TIMElem elem = msg.getElement(i);
                        //获取当前元素的类型
                        TIMElemType elemType = elem.getType();
                        if (elemType == TIMElemType.Text) {
                            TIMTextElem textElem = (TIMTextElem) elem;
                            TIMUserProfile userProfile = msg.getSenderProfile();
                            //文本消息
                        } else if (elemType == TIMElemType.Custom) {//自定义消息
                            if (mLiveFinish) {
                                break;
                            }
                            TIMCustomElem customElem = (TIMCustomElem) elem;
                           //自定义消息
                        }
                    }
                }
                return false;
            }
        });
    这个时候就可以正常聊天了。

     

    解决问题二:用户提前进入房间,当主播再进入房间打开摄像头开始直播,用户端接收不到画面。

    原因:还是因为用户进来后主播不在房间里,当直播开始的时候,主播不知道给你推送画面。

    解决方式:当主播上线后我们客户端会接收到一条自定义消息,此时,我们需要重新加入一次房间,然后跟我们的im去绑定。也就是说虽然我们按照上面的方式进入了直播间,而且进入直播间的返回也是正确的,但是实际上用户信息并没有在主播那,所以需要我们再去调用一下上面加入房间代码,此时绑定肯定会成功了。



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值