Android集成腾讯互动直播如何切换流视频

由于之前对互动直播这块的介绍,这里对之前的流程不做介绍。

可以简单的将直播分成两个部分

1:请求主播数据。
2:打开相应画面。

那么分析一下切换流视频应该在哪一步?

切换流视频,即切换摄像头与分享屏幕之间的视频数据。切换即关闭当前画面,打开切换画面。那么我们主要处理切换流程。


1:请求主播画面

在广播监听中调用请求主播画面数据函数,一个是屏幕分享的数据,一个摄像头的数据

mLiveHelper.requestScreenViewList(ids);//屏幕分享
mLiveHelper.requestViewList(ids);//摄像头

其中requestScreenViewList在原有随心播代码上做了修改,原因就是如果不做修改,切换到摄像头时数据出不来,因为模拟器不能测试直播,所以如果有类似问题,可以做同样修改。

/**
     * AVSDK 请求主播数据
     *
     * @param identifiers 主播ID
     */
    public void requestScreenViewList(ArrayList<String> identifiers) {
        Log.i(TAG, "requestViewList " + identifiers);
        if (identifiers.size() == 0) return;
        AVEndpoint endpoint = QavsdkControl.getInstance().getAVContext().getRoom().getEndpointById(identifiers.get(0));
        Log.d(TAG, "requestViewList hostIdentifier " + identifiers + " endpoint " + endpoint);
        if (endpoint != null) {
            ArrayList<String> alreadyIds = QavsdkControl.getInstance().getRemoteVideoIds();//已经存在的IDs

            Log.i(TAG, "requestViewList identifiers : " + identifiers.size());
            Log.i(TAG, "requestViewList alreadyIds : " + alreadyIds.size());
            for (String id : identifiers) {//把新加入的添加到后面
                if (!alreadyIds.contains(id)) {
                    alreadyIds.add(id);
                }
            }
            int viewindex = 0;
            for (String id : alreadyIds) {//一并请求
                if (viewindex >= 4) break;
                AVView view2 = new AVView();
                view2.videoSrcType = AVView.VIDEO_SRC_TYPE_CAMERA;
                view2.viewSizeType = AVView.VIEW_SIZE_TYPE_BIG;
                //界面数
                mRequestViewList[viewindex] = view2;
                mRequestIdentifierList[viewindex] = id;
                viewindex++;
                AVView view = new AVView();
                view.videoSrcType = AVView.VIDEO_SRC_TYPE_SCREEN;
                view.viewSizeType = AVView.VIEW_SIZE_TYPE_BIG;
                //界面数
                mRequestViewList[viewindex] = view;
                mRequestIdentifierList[viewindex] = id;
                viewindex++;
            }
            QavsdkControl.getInstance().getAvRoomMulti().requestViewList(mRequestIdentifierList, mRequestViewList, viewindex, mRequestViewListCompleteCallback);

        } else {
            if (null != mContext) {
                Toast.makeText(mContext, "Wrong Room!!!! Live maybe close already!", Toast.LENGTH_SHORT).show();
            }
        }


    }

通过两个监听,请求两个流数据,剩下的就是如何做打开画面的相应切换了。

2:打开画面

随心播的打开画面

  if (isScreenShare) {
                QavsdkControl.getInstance().setRemoteHasVideo(true, id, AVView.VIDEO_SRC_TYPE_SCREEN);
                isScreenShare = false;
            } else {
                QavsdkControl.getInstance().setRemoteHasVideo(true, id, AVView.VIDEO_SRC_TYPE_CAMERA);
            }

但是setRemoteHasVideo方法是打开小屏的

    public void setRemoteHasVideo(boolean isRemoteHasVideo, String identifier, int videoSrcType) {
        SxbLog.i(TAG, "setRemoteHasVideo : " + identifier);
        if (null != mAVUIControl) {
            mAVUIControl.setSmallVideoViewLayout(isRemoteHasVideo, identifier, videoSrcType);
        }
    }

所以这里我们用了另外的setRemoteHasVideo

  public void setRemoteHasVideo(String identifier, int videoSrcType, boolean isRemoteHasVideo) {
        if (null != mAVUIControl) {
            mAVUIControl.setRemoteHasVideo(identifier, videoSrcType, isRemoteHasVideo, false, false);
        }
    }

这样能够将摄像头或者分享屏幕的流视频展示在大屏上。

3:如何切换

很简单,切换之前先关掉屏幕,在打开切换的屏幕即可。

加载数据

    /**
     * 加载视频数据
     *
     * @param isLocal 是否是本地数据
     * @param id      身份
     */
    @Override
    public void showVideoView(boolean isLocal, final String id) {
        Log.i(TAG, "showVideoView " + id + "isLocal" + isLocal);
        //渲染本地Camera
        if (isLocal == true) {
            QavsdkControl.getInstance().setSelfId(id);
            QavsdkControl.getInstance().setLocalHasVideo(true, id);
            //主播通知用户服务器
            Log.i(TAG, "showVideoView host :" + id);
        } else {
            Log.i(TAG, "showVideoView :" + id);
            switchScreen(id);
        }
    }

    private void switchScreen(final String id) {
        if (isScreenShare) {
            QavsdkControl.getInstance().setRemoteHasVideo(id, AVView.VIDEO_SRC_TYPE_CAMERA, false);
            QavsdkControl.getInstance().setRemoteHasVideo(id, AVView.VIDEO_SRC_TYPE_SCREEN, true);
        } else {
            QavsdkControl.getInstance().setRemoteHasVideo(id, AVView.VIDEO_SRC_TYPE_SCREEN, false);
            QavsdkControl.getInstance().setRemoteHasVideo(id, AVView.VIDEO_SRC_TYPE_CAMERA, true);
        }
    }

切换屏幕

 if (!isScreenShare) {
                    QavsdkControl.getInstance().setRemoteHasVideo(id, AVView.VIDEO_SRC_TYPE_CAMERA, false);
                    QavsdkControl.getInstance().setRemoteHasVideo(id, AVView.VIDEO_SRC_TYPE_SCREEN, true);
                } else {
                    QavsdkControl.getInstance().setRemoteHasVideo(id, AVView.VIDEO_SRC_TYPE_SCREEN, false);
                    QavsdkControl.getInstance().setRemoteHasVideo(id, AVView.VIDEO_SRC_TYPE_CAMERA, true);
                }
                isScreenShare = !isScreenShare;

如此,就完成切换屏幕的功能了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值