腾讯云互动直播集成有声音,无画面研究和解决

我在集成互动直播的时候,只取了观看直播相关的。其他的都没有加到项目中,但是集成的过程中,遇到了 进入直播间的时候,能听到主播的声音,发送点赞和评论都是好的,就是看不到画面。下面是我列出的遇到的情景

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 循环里面的代码。至此观众端能够正常观看和正常的连麦。还需研究找到根本的原因。

猜你喜欢

转载自blog.csdn.net/android_freshman/article/details/51852842