# 视频管理
# 发送本地视频流
房间内的成员可通过调用 enableUploadVideoStream (opens new window) 方法来开启关闭发送本地视频流。
/**
* 开启/关闭发送本地视频流
* <p>
* - 调用该方法可开启或关闭发送本地视频流。开启后,房间成员将可以看见本端视频画面;关闭后,房间成员将看不见本端视频画面
* - 房间中调用此方法不影响接收远端视频
* - 初始化 JRTCRoom 时,默认发送本地视频流。若要加入房间时,让房间内其他成员看见本端视频画面,建议在调用 {@link #join join} 加入房间前设置
* - 该方法在房间内和房间外均可调用,且在离开房间后该设置仍然有效。也就是说这一次设置了关闭发送本地视频流,那么在下一次加入房间时默认会关闭发送本地视频流
* - 通话中也可调用此方法开启或关闭发送本地视频流,服务器会更新状态并同步给其他房间成员,即房间中所有成员都会收到 {@link JRTCRoomCallback#onParticipantUpdate onParticipantUpdate} 回调
*
* @param enable 是否发送本地视频流
* - true: 开启,即发送本地视频流
* - false: 关闭,即不发送本地视频流
* @return 接口调用结果
* - true: 接口调用成功
* - 在调用此方法时,用户不在房间中,不会收到回调
* - 在调用此方法时,用户在房间中,会收到 {@link JRTCRoomCallback#onRoomPropertyChanged onRoomPropertyChange} 回调
* - false: 接口调用异常
*/
public abstract enableUploadVideoStream(enable: boolean): boolean;
- enableUploadVideoStream (opens new window) 的作用是设置“是否上传视频流数据。调用该方法可开启或关闭发送本地视频流。开启后,房间成员将可以看见本端视频画面;关闭后,房间成员将看不见本端视频画面。房间中调用此方法不影响接收远端音频。
- 初始化 JRTCCall (opens new window) 时,默认发送本地视频流。若要加入房间时,让房间内其他成员看见本端视频画面,建议在调用 join (opens new window) 加入房间前设置。房间中调用此方法不影响接收远端视频。
- 房间中也可调用此方法开启或关闭发送本地视频流,服务器会更新状态并同步给其他房间成员,房间中的其他成员会收到该成员“是否上传音频“的状态变化回调 onParticipantUpdate (opens new window)。
- 该方法在房间内和房间外均可调用,且在离开房间该设置仍然有效。也就是说这一次设置了关闭发送本地视频流,那么在下一次加入房间时默认会关闭发送本地视频流。
此外,调用该方法发送本地视频流数据还要依赖摄像头是否已经打开。
/**
* 成员属性更新回调
* <p>
* 当房间中有成员的属性发生变化时,房间中的其他成员会收到此回调,例如音频上传状态、视频上传状态、网络状态等发生变化。
*
* @param participant JRTCRoomParticipant 成员对象
* @param changeParam {@link ChangeParam} 更新标识类对象
* @param room 当前 JRTCRoom 对象
*/
onParticipantUpdate?: (participant: JRTCRoomParticipant, changeParam: JRTCRoomParticipantChangeParam) => void;
示例代码
// 关闭视频流发送
call.enableUploadVideoStream(false);
// 开启视频流发送
call.enableUploadVideoStream(true);
// 通话中成员属性更新回调
onParticipantUpdate:(participant: JRTCRoomParticipant, changeParam: JRTCRoomParticipantChangeParam) => {
if(participant.video){
//该成员视频流打开
} else{
//该成员视频流关闭
}
}
};
# 订阅/取消订阅视频流
/**
* 订阅房间中其他用户的视频流
*
* @param participant JRTCRoomParticipant 成员对象
* @param videoSize 视频请求的尺寸,详见 {@link JRTCVideoSize}
* @return 接口调用结果
* - true: 接口调用成功,会收到 {@link JRTCRoomCallback#onParticipantUpdate onParticipantUpdate} 回调
* - false: 接口调用异常
*/
public abstract requestVideo(participant: JRTCRoomParticipant, videoSize: JRTCVideoSize): boolean;
/**
* 取消订阅房间中其他用户的视频流
*
* @param participant JRTCRoomParticipant 房间中其他成员对象
* @return 调用是否正常
* - true: 正常执行调用流程,会收到 {@link JRTCRoomCallback#onParticipantUpdate onParticipantUpdate} 回调
* - false: 调用失败,不会收到回调通知
*/
public abstract unRequestVideo(participant: JRTCRoomParticipant): boolean;
示例代码
onParticipantUpdate: (participant: JRTCRoomParticipant | undefined,changeParam: JRTCRoomParticipantChangeParam | undefined) => {
if (participant!.video) {
room.requestVideo(participant, new JRTCVideoSize(width, height));
}
}
# SVC 设置说明
根据实际订阅需求和网络状况动态调整视频发送分辨率是 JSM 房间的特性之一,SVC 可用于设置房间视频的每一层编码分辨率。该参数在房间创建时设置,且全局统一。
具体使用详见 SVC 说明 (opens new window) 。
可在加入房间时,通过加入通话参数 JRTCCallJoinParam (opens new window) 的 svcResolution (opens new window) 属性进行设置,房间全局属性,只有第一个加入房间用户设置有效。
/**
* svc分辨率,默认为 "1 180 250 360 600 720 1400"
*
* @note 当参数 {@link #setVideoDefinition(int)} videoDefinition} 为 {@link JRTCRoomVideoDefinition#CUSTOM CUSTOM} 时有效
*
* 用于自定义分层参数和码率
*
* 格式:
* 高度公约数 第一层高倍数 第一层码率 第二层高倍数 第二层码率 第三层高倍数 第三层码率 第四层高倍数 第四层码率 <br>
* 说明 <br>
* 1)默认宽高比16:9,即 @ref wholeRatio <br>
* 2)编码宽高最后被裁成16整除 <br>
* 例如 "1 180 250 360 600 720 1400" <br>
* 第一层 分辨率 宽320(180*1/9*16)高 180(180*1); 码率250kbps <br>
* 第二层 分辨率 宽640(360*1/9*16)高 360(360*1); 码率600kbps <br>
* 第三层 分辨率 宽1280(720*1/9*16)高 720(720*1); 码率1400kbps <br>
* 此情况下只有三层,若需要四层,则需补充为 "1 180 250 360 600 720 1400 1080 1600" <br>
* 第四层 分辨率 宽1920(1080*1/9*16)高 1080(1080*1); 码率1600kbps
*
* @note 房间全局属性,第一个加入房间成员设置成效
*/
public set svcResolution(value: string);
示例代码
let param:JRTCRoomJoinParam = new JRTCRoomJoinParam();
// 设置svc参数
param.setSvcResolution("1 180 250 360 600 720 1400 1080 1600");
// 加入房间
call.join("10086", param);
# 设置本地视频宽高比
在通话内设置本地视频宽高比,会影响视频画面宽高比,用于适配不同屏幕的显示需求,需在进入房间后调用。
/**
* 设置本端视频宽高比
* <p>
* 将自己的视频采集根据宽高比裁剪后进行发送,通话中其他成员收到的画面将是裁剪后的比例。<br>
* 该方法不影响其他成员的画面在本端的显示比例,也不影响其他成员相互之间的画面显示比例。<br>
* 必须 ***开始通话后*** 设置才能生效,即收到 {@link JRTCAgentCallback#onCallStateChanged onCallStateChanged} 回调且 type == {@link JRTCCallCenterAgentCallStateChangeType#TALKING} 时设置才生效。
*
* @param ratio 视频宽高比
* @return 接口调用结果
* - true: 接口调用成功
* - false: 接口调用异常
*/
public abstract setRatio(ratio: number): boolean;
示例代码
onJoin: (result: boolean, reasonCode: JRTCReasonCode) => {
call.setRatio(0.5625);
}
# 视频截图
/**
* 截图
*
* @param { string } streamId 要截图的视频流ID
* @param { string }path 要存放截图的文件路径
* @return 接口调用结果
* - true: 接口调用成功
* - false: 接口调用异常
*/
public abstract snapshotWithStreamId(streamId: string, path: string): boolean;
结果通过实现 JRTCMediaDeviceCallback (opens new window) 中的 onSnapshotComplete (opens new window) 接口上报
/**
* 截图完成回调
*
* @param { string } file 截图路径
* @param { number } width 图片像素宽
* @param { number } height 图片像素高
*/
onSnapshotComplete?: (file: string, width: number, height: number) => void;
示例代码:
// 截取指定 视频流ID的帧图片并且保存到指定路径
// 视频流,可以是本地视频流、对端视频流或者屏幕共享视频流
mediaDevice.snapshotWithStreamId("user_renderId", "file_save_path");
// 截图完成回调
public void onSnapshotComplete(String file, int width, int height) {
//截图完成,可以从文件路径获取截图文件进行后续操作
}
onSnapshotComplete:(file: string, width: number, height: number) => {
}
# 视频采集回调
当打开本端摄像头视频预览或者打开本地屏幕采集时,通过实现 JRTCMediaDeviceCallback (opens new window) 的 onVideoCaptureDidStart (opens new window) 接口能收到采集开始通知
/**
* 视频采集开始回调
*
* @param { string } streamId 视频流ID
* @param { number } ratio 视频宽高比
*/
onVideoCaptureDidStart?: (streamId: string, ratio: number) => void;
# 视频异常回调
通过实现 JRTCMediaDeviceCallback (opens new window) 的 onVideoError (opens new window) 接口来监听视频异常、采集异常、渲染错误等事件,具体原因查看参数 error 描述。
/**
* 视频异常,渲染错误,包括摄像头采集错误、屏幕采集错误等回调
*
* @param { JRTCMediaDeviceVideoErrorType } errorType 异常类型
* @see JRTCMediaDeviceVideoErrorType.OTHER 其他未知异常
* @see JRTCMediaDeviceVideoErrorType.CAMERA 摄像头异常
* @see JRTCMediaDeviceVideoErrorType.SCREEN 屏幕采集异常
* @see JRTCMediaDeviceVideoErrorType.RENDER 视频渲染异常
* @param { string } errorDetail 异常详细描述
*/
onVideoError?: (errorType: JRTCMediaDeviceVideoErrorType, errorDetail: string) => void;
