我在集成互动直播的时候,只取了观看直播相关的。其他的都没有加到项目中,但是集成的过程中,遇到了 进入直播间的时候,能听到主播的声音,发送点赞和评论都是好的,就是看不到画面。下面是我列出的遇到的情景
1.主播开直播的时候,IOS 端和android 都看不到画面,能听到声音
ios 直接是黑屏显示,android 端也是黑屏显示,但是 android 端回显示 互动直播的小画面。当和另一个人连麦的时候,观众端看到的直接是连麦人的画面;
这个原因在主播端,有可能是主播创建的房间的hostId 和IM 注册时候使用的ID 不一样。因为android 端,我是从1.7 升级过来的,hostId 即原来的手机号码,但是手机号码 使用的时候会加上 86-xxxx,由于我在注册的时候,不需要用户填写 86,set hostId 是没有86 的,但是腾讯云后台注册的账户是有86 的,所以 在登陆IM的时候,手动添加了 86,但是 userInfo 里面并没有86 的前缀,但是创建房间的hostid 没有86 。
在观众端 获取到的hostId 是带有 86 的,导致不一致,所以导致上述的问题,
解决方案:查看观众端 获取到的hostid 和主播端的hostid ,以及注册IM 的hostid ,保持一致。
2.主播开直播的时候,IOS 端看到画面,android 端看不到画面
这个问题:主要就是android 观众端集成时候的问题。需要查看下调用的流程
其问题可能出来 请求远端用户的视频数据这里:
/**
* AVSDK 请求主播数据
*
* @param identifiers 主播ID
*/
public void requestViewList(ArrayList<String> identifiers) {
if (identifiers.size() == 0) return;
// for(int j=0;j<identifiers.size();j++){
// Log.i("AAAA", "请求主播数据 for j="+j+",identifiers=" + identifiers.get(j));
// }
AVEndpoint endpoint = ((AVRoomMulti) QavsdkApplication.getInstance().getQavsdkControl().getAVContext().getRoom()).getEndpointById(identifiers.get(0));
Log.d("AAAA", "requestViewList hostIdentifier " + identifiers + " endpoint " + endpoint);
if (endpoint != null) {
ArrayList<String> alreadyIds = QavsdkApplication.getInstance().getQavsdkControl().getRemoteVideoIds();//已经存在的IDs
for (String id : identifiers) {//把新加入的添加到后面
alreadyIds.add(id);
}
int viewindex = 0;
Log.i("AAAA", "requestViewList alreadyIds size: " + alreadyIds.size());
for (String id : alreadyIds) {//一并请求
if (viewindex >= 4) break;
AVView view = new AVView();
view.videoSrcType = AVView.VIDEO_SRC_TYPE_CAMERA;
view.viewSizeType = AVView.VIEW_SIZE_TYPE_BIG;
//界面数
mRequestViewList[viewindex] = view;
mRequestIdentifierList[viewindex] = id;
viewindex++;
Log.i("AAAA", "requestViewList 一并请求 id: " + id);
}
int ret = AVEndpoint.requestViewList(mRequestIdentifierList, mRequestViewList, alreadyIds.size(), mRequestViewListCompleteCallback);
Log.i("AAAA", "requestViewList ret : " + ret+",viewindex="+viewindex);
} else {
Toast.makeText(mContext, "Wrong Room!!!! Live maybe close already!", Toast.LENGTH_SHORT).show();
}
}
private AVEndpoint.RequestViewListCompleteCallback mRequestViewListCompleteCallback = new AVEndpoint.RequestViewListCompleteCallback() {
protected void OnComplete(String identifierList[], AVView viewList[], int count, int result) {
Log.i("AAAA", "请求直播数据完成 identifierList[]="+identifierList.length+",viewList="+viewList.length+",count="+count+",result="+count);
// 为什么会有数据
// for (String id : identifierList) {
//
// Log.i("AAAA", "请求直播数据完成 mLiveView.showVideoView REMOTE="+REMOTE+",id="+id);
// mLiveView.showVideoView(REMOTE, id);
// }
// TODO
Log.d(TAG, "RequestViewListCompleteCallback.OnComplete");
}
};
mRequestViewListCompleteCallback 这里对比demo 上面的显示 没有调用for 循环里面的showView,而我这里返回的数组的长度不为0,调用for 的showView 导致看到是连麦人的画面。
说明下:AVEndpoint.requestViewList 我请求的参数和demo 里面是一样的,但是回调的返回值却不一样,看api 文档也没有详细的说明,待进一步研究
在1.7 版本中,回调函数没有做任何处理。没有那个for 循环的
我现阶段的解决方案就是 注释掉 for 循环里面的代码。至此观众端能够正常观看和正常的连麦。还需研究找到根本的原因。