# 视频多流
SDK 提供了可以自行创建/删除视频流通道的接口
使用场景举例:鉴于目前的房间模式只能由一人发起屏幕共享,当多个成员想在同个房间内发起屏幕共享时,可以使用该接口实现。
/**
* 创建额外视频流
*
* @param captureStreamId 本地视频流采集源流Id
* @param screenShare 是否屏幕共享(包括窗口共享、区域共享)
* @return 通话中的视频流ID 创建成功后,通话内其他成员将收到 {@link JRTCRoomCallback#onParticipantUpdate} 回调
*/
public abstract createExtraStream(captureStreamId: string, screenShare: boolean): string | undefined;
/**
* 删除额外视频流
*
* @param captureStreamId 本次视频流采集源流Id
* @return 接口调用结果
* - true: 接口调用成功,通话内其他成员将收到 {@link JRTCRoomCallback#onParticipantUpdate} 回调
* - false: 接口调用异常
*/
public abstract deleteExtraStream(captureStreamId: string): boolean;
订阅/取消订阅额外视频流
/**
* 订阅房间中其他用户的额外视频流
*
* @param participant JRTCRoomParticipant 成员对象
* @param streamId 视频流ID
* @param videoSize 视频请求的尺寸
* @return 接口调用结果
* - true: 接口调用成功
* - false: 接口调用异常
*/
public abstract requestExtraStreamVideo(participant: JRTCRoomParticipant, streamId: string,
videoSize: JRTCVideoSize): boolean;
/**
* 取消订阅房间中其他用户的额外视频流
*
* @param participant JRTCRoomParticipant 成员对象
* @param streamId 视频流ID
* @return 接口调用结果
* - true: 接口调用成功
* - false: 接口调用异常
*/
public abstract unRequestExtraStreamVideo(participant: JRTCRoomParticipant, streamId: string): boolean;
示例代码(以屏幕共享举例):
//发起端
//开启本地屏幕采集
mediaDevice.enableScreenCapture(true);
onScreenSharePermissionResult(result: boolean): void {
if (result) {
//创建视频额外流通道,将本地屏幕采集流id绑定到该通道
let callStreamId:string = call.createExtraStream(mediaDevice.getScreenCaptureId(), true);
if (!TextUtils.isEmpty(callStreamId)) {
//开启多流屏幕共享成功
} else {
//开启多流屏幕共享失败
}
}
}
//删除视频额外流通道
call.deleteExtraStream(mediaDevice.getScreenCaptureId());
//关闭本地屏幕采集
mediaDevice.enableScreenCapture(false);
onParticipantUpdate: (participant: JRTCRoomParticipant,changeParam: JRTCRoomParticipantChangeParam) => {
if (changeParam.extraStream) {
//判断不是本端发起的多流
if (participant.userId != JRTCManager.getInstance().client.getUserId()) {
//遍历新增的视频流
for (const stream of changeParam.addedExtraStreams) {
//订阅该视频流
call.requestExtraStreamVideo(participant, stream, new JRTCVideoSize(1280, 720));
}
this.updateVideoUi();
//删除额外流不为空
if (changeParam.removedExtraStreams.length > 0 ) {
//遍历移除的视频流
for (const stream of changeParam.removedExtraStreams) {
//这里不需要去取消订阅
//可有将该视频画面从到视图容器移除
}
}
}
}
}
