iOS

# 视频多流

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) {
          //这里不需要去取消订阅
          //可有将该视频画面从到视图容器移除
        }
      }
    }
  }
}