最近在做互动直播,公司最后选择使用腾讯的直播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去绑定。也就是说虽然我们按照上面的方式进入了直播间,而且进入直播间的返回也是正确的,但是实际上用户信息并没有在主播那,所以需要我们再去调用一下上面加入房间代码,此时绑定肯定会成功了。