由于之前对互动直播这块的介绍,这里对之前的流程不做介绍。
可以简单的将直播分成两个部分
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;
如此,就完成切换屏幕的功能了。