UNPKG

nertc-sdk

Version:
1,686 lines (1,599 loc) 167 kB
import { SoftwareRenderer, GlRenderer, IRenderer, CustomRenderer } from '../renderer'; import { NERtcEngineAPI, NERtcEngineContext, NERtcChannelProfileType, NERtcRemoteVideoStreamType, NERtcVideoCanvas, NERtcErrorCode, NERtcSessionLeaveReason, NERtcVideoProfileType, NERtcAudioProfileType, NERtcAudioScenarioType, NERtcVideoConfig, NERtcAudioFrameRequestFormat, NERtcCreateAudioMixingOption, NERtcCreateAudioEffectOption, NERtcRectangle, NERtcScreenCaptureParameters, NERtcDevice, NERtcStats, NERtcAudioSendStats, NERtcAudioRecvStats, NERtcVideoSendStats, NERtcVideoRecvStats, NERtcNetworkQualityInfo, NERtcClientRole, NERtcConnectionStateType, NERtcReasonConnectionChangedType, NERtcAudioDeviceType, NERtcAudioDeviceState, NERtcAudioMixingState, NERtcAudioMixingErrorCode, NERtcAudioVolumeInfo, NERtcLiveStreamStateCode, NERtcLiveStreamTaskInfo, NERtcVideoMirrorMode, NERtcVideoScalingMode, NERtcVoiceChangerType, NERtcVoiceBeautifierType, NERtcVoiceEqualizationBand, NERtcStreamChannelType, NERtcPullExternalAudioFrameCb, NERtcAudioStreamType, NERtcVideoStreamType } from './defs' import { EventEmitter } from 'events' import process from 'process'; // const nertc = require('bindings')('nertc-electron-sdk'); const nertc = require('../../build/Release/nertc-electron-sdk.node'); /** * @class NERtcEngine */ class NERtcEngine extends EventEmitter { nertcEngine: NERtcEngineAPI; renderers: Map<string, IRenderer>; substreamRenderers: Map<string, IRenderer>; renderMode: 1 | 2 | 3; customRenderer: any; /** * NERtcEngine类构造函数 * @returns {NERtcEngine} */ constructor() { super(); this.nertcEngine = new nertc.NertcNodeEngine(); this.initEventHandler(); this.renderers = new Map(); this.substreamRenderers = new Map(); this.renderMode = this._checkWebGL() ? 1 : 2; this.customRenderer = CustomRenderer; } /** * 初始化 NERTC SDK 服务。 * <pre> * 该方法用来进行初始化 NERTC 服务。传入云信为开发者签发的厂商秘钥进行初始化。在使用其他方法前,必须先调用该方法进行初始化。 * 初始化成功后,默认处于音视频通话模式。 * <b>NOTE:</b> * - 必须使用同一个 App Key 才能进行通话。 * - 一个 NERtcEngine 实例对象只能使用一个 App Key。如需更换 App Key,必须先调用 {@link NERtcEngine#release} 方法释放当前实例资源再调用本方法初始化实例。 * </pre> * @param {Object} context 传入的RTC engine context对象: NERtcEngineContext. * @param {String} context.app_key 用户注册云信的APP Key。如果你的开发包里面缺少 APP Key,请申请注册一个新的 APP Key。 * @param {String} context.log_dir_path 日志目录的完整路径,采用UTF-8 编码。 * @param {number} [context.log_level=3] 日志级别,默认级别为 kNERtcLogLevelInfo。 * <pre> * - 0 Fatal级别日志信息 * - 1 Error级别日志信息 * - 2 Warning级别日志信息 * - 3 Info级别日志信息。默认级别 * - 4 DetailInfo级别日志信息 * - 5 Verbos级别日志信息 * - 6 Debug级别日志信息。如果你想获取最完整的日志,可以将日志级别设为该等级 * - 7 不输出日志信息 * </pre> * @param {number} [context.log_file_max_size_KBytes=20480] 指定 SDK 输出日志文件的大小上限,单位为 KB。如果设置为 0,则默认为 20 M。 * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ initialize(context: NERtcEngineContext): number { return this.nertcEngine.initialize(context, context.app_key, context.log_dir_path); } /** * 释放资源。 */ release(): void { return this.nertcEngine.release(); } /** * 设置参会者角色 * <pre> * {@link NERtcEngine#setClientRole} 接口用于在直播场景中设置用户角色。默认情况下用户以主播角色加入房间。 * 在加入房间前,用户需要调用setClientRole 接口设置本端模式为观众或主播模式。在加入房间后,用户可以通过本接口切换用户模式。 * 用户角色支持设置为主播或观众,主播和观众的权限不同。默认情况下用户以主播角色加入房间。 * 可以在通话前后设置,通话前设置会在加入频道之后生效。如果设置观众模式。则会停止音视频设备。 * </pre> * @param {number} role 参会者模式 * <pre> * - 主播(0):可以开关摄像头等设备、可以发布流、可以操作互动直播推流相关接口、上下线对其他房间内用户可见 * - 观众(1):不可以开关摄像头等设备、不可以发布流、不可以操作互动直播推流相关接口、上下线对其他房间内用户不可见 * </pre> * @fires NERtcEngine#onClientRoleChanged * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ setClientRole(role: NERtcClientRole): number { return this.nertcEngine.setClientRole(role); } /** * 设置通话模式 * <pre> * 必须在加入通话前设置,开始通话后设置无效,结束通话后保留之前的设置。 * </pre> * @param {number} profile 场景模式 * <pre> * - 通话场景(0) * - 直播推流场景(1) * </pre> * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ setChannelProfile(profile: NERtcChannelProfileType): number { return this.nertcEngine.setChannelProfile(profile); } /** * 加入频道。如果频道还未创建,会自动尝试创建频道。 * <pre> * 该方法让用户加入通话频道,在同一个频道内的用户可以互相通话,多个用户加入同一个频道,可以群聊。 使用不同 App Key 的 App 是不能互通的。如果已在通话中,用户必须调用 {@link NERtcEngine#leaveChannel} 退出当前通话,才能进入下一个频道。 * 频道内每个用户的用户 ID 必须是唯一的。 * </pre> * @param {String} token 动态秘钥。安全要求不高: 将值设为 空字符串。安全要求高: 将值设置为 Token。如果你已经启用了 App Certificate, 请务必使用 Token。 * @param {String} channelName 标识通话的频道名称,长度在 64 字节以内的字符串。以下为支持的字符集范围(共 89 个字符): a-z, A-Z, 0-9, space, !#$%&()+-:;&le;.,>? @[]^_{|}~” * @param {number} uid 用户ID。 * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ joinChannel(token: String, channelName: String, uid: number): number { return this.nertcEngine.joinChannel(token, channelName, uid); } /** * 离开频道。 * <pre> * 离开频道,即挂断或退出通话。 * 当调用 {@link NERtcEngine#joinChannel} 方法后,必须调用 {@link NERtcEngine#leaveChannel} 结束通话,否则无法开始下一次通话。 不管当前是否在通话中,都可以调用 leaveChannel,没有副作用。该方法会把会话相关的所有资源释放掉。 * 该方法是异步操作,调用返回时并没有真正退出频道。在真正退出频道后,SDK 会触发 onLeaveChannel 事件。 * 如果你调用了 {@link NERtcEngine#leaveChannel} 后立即调用 {@link NERtcEngine#release} , SDK 将无法触发 onLeaveChannel 事件。 * </pre> * @fires NERtcEngine#onLeaveChannel * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ leaveChannel(): number { return this.nertcEngine.leaveChannel(); } /** * 开启或关闭本地语音采集或处理 * <pre> * 该方法可以重新开启本地语音功能,重新开始本地音频采集及处理。 * 该方法不影响接收或播放远端音频流。 * <b>NOTE:</b> * - 该方法与 {@link NERtcEngine#muteLocalAudioStream} 的区别在于: * - {@link NERtcEngine#enableLocalAudio}: 开启本地语音采集及处理 * - {@link NERtcEngine#muteLocalAudioStream}: 停止或继续发送本地音频流 * 该方法设置内部引擎为启用状态,在 {@link NERtcEngine#leaveChannel} 后仍然有效。 * </pre> * @param {Boolean} enabled * <pre> * - true: 重新开启本地语音功能,即开启本地语音采集或处理(默认) * - false: 关闭本地语音功能,即停止本地语音采集或处理 * </pre> * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ enableLocalAudio(enabled: Boolean): number { return this.nertcEngine.enableLocalAudio(enabled); } /** * 设置本地视图。 * <pre> * 该方法设置本地视频显示信息。App 通过调用此接口绑定本地视频流的显示视窗(view)。 在 App 开发中,通常在初始化后调用该方法进行本地视频设置,然后再加入频道。 * </pre> * @param {Object} canvas 视频画布信息 * @param {number} canvas.mode 视频画布缩放模式 * <pre> * - 0 视频尺寸等比缩放。优先保证视频内容全部显示。因视频尺寸与显示视窗尺寸不一致造成的视窗未被填满的区域填充黑色。 * - 1 视频尺寸非等比缩放。保证视频内容全部显示,且填满视窗。 * - 2 视频尺寸等比缩放。优先保证视窗被填满。因视频尺寸与显示视窗尺寸不一致而多出的视频将被截掉。 * </pre> * @param {Element} canvas.view 视频画布对象 * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ setupLocalVideoCanvas(canvas: NERtcVideoCanvas): number { if (canvas.view) { //bind this.initRender('local', canvas.view); this.setRenderMode('local', canvas.mode); return this.nertcEngine.setupVideoCanvas(0, true); } else { //unbind this.destroyRender('local'); return this.nertcEngine.setupVideoCanvas(0, false); } } /** * 设置远端用户视图。 * <pre> * 该方法绑定远端用户和显示视图,即设定 uid 指定的用户用哪个视图显示。调用该接口时需要指定远端视频的 uid,一般可以在用户加入后设置好。 * 如果 App 不能事先知道对方的 uid,可以在 APP 收到 onUserJoined 事件时设置。 * 退出频道后,SDK 会把远端用户的绑定关系清除掉。 * </pre> * @param {number} uid 远端用户 ID。 * @param {Object} canvas 视频画布信息 * @param {number} canvas.mode 视频画布缩放模式 * <pre> * - 0 视频尺寸等比缩放。优先保证视频内容全部显示。因视频尺寸与显示视窗尺寸不一致造成的视窗未被填满的区域填充黑色。 * - 1 视频尺寸非等比缩放。保证视频内容全部显示,且填满视窗。 * - 2 视频尺寸等比缩放。优先保证视窗被填满。因视频尺寸与显示视窗尺寸不一致而多出的视频将被截掉。 * </pre> * @param {Element} canvas.view 视频画布对象 * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ setupRemoteVideoCanvas(uid: number, canvas: NERtcVideoCanvas): number { if (canvas.view) { //bind this.initRender(uid, canvas.view); this.setRenderMode(uid, canvas.mode); return this.nertcEngine.setupVideoCanvas(uid, true); } else { //unbind this.destroyRender(uid); return this.nertcEngine.setupVideoCanvas(uid, false); } } /** * 在指定画布上截图 * @param {'local'|number} uid 要截图的 uid,本地视频为 local,远端用户为远端 uid * @param {NERtcVideoStreamType} streamType 流类型: * <pre> * 0 - 视频流主流 * 1 - 视频流副流 * </pre> * @returns string 返回 base64 截图数据 */ captureImageByUid(uid: 'local' | number, streamType: NERtcVideoStreamType = NERtcVideoStreamType.kNERtcVideoStreamMain): string { return this.captureRender(uid, streamType) } /** * 开启或关闭本地视频采集和渲染 * <pre> * 该方法启用本地视频采集功能。 * 该方法设置内部引擎为启用状态,在 {@link NERtcEngine#leaveChannel} 后仍然有效。 * </pre> * @param {boolean} enabled 是否启用本地视频: * <pre> * - true: 开启本地视频采集和渲染 (默认); * - false: 关闭使用本地摄像头设备。关闭后,远端用户会接收不到本地用户的视频流;但本地用户依然可以接收远端用户的视频流。设置为 false 时,该方法不需要本地有摄像头。 * </pre> * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ enableLocalVideo(enabled: Boolean): number { return this.nertcEngine.enableLocalVideo(enabled); } /** * 订阅 / 取消订阅指定远端用户的视频流。对方打开视频后需要主动订阅 * @param {number} uid 指定用户的用户 ID。 * @param {number} type 流类型: * <pre> * - 0 默认大流 * - 1 小流 * - 2 不订阅 * </pre> * @param {boolean} subscribe * <pre> * - true: 订阅指定远端用户的视频流; * - false: 取消订阅指定远端用户的视频流。 * </pre> * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ subscribeRemoteVideoStream(uid: number, type: NERtcRemoteVideoStreamType, subscribe: Boolean): number { return this.nertcEngine.subscribeRemoteVideoStream(uid, type, subscribe); } /** * 获取当前网络状态。 * @returns {number} * <pre> * - 1 没加入频道。 * - 2 正在加入频道。 * - 3 加入频道成功。 * - 4 正在尝试重新加入频道。 * - 5 加入频道失败。 * </pre> */ getConnectionState(): number { return this.nertcEngine.getConnectionState(); } /** * 开关本地音频发送。该方法用于允许/禁止往网络发送本地音频流。 * <pre> * 该方法不影响录音状态,因为并没有禁用录音设备。 * </pre> * @param {boolean} mute 静音/取消静音: * <pre> * - true: 静音本地音频 * - false: 取消静音本地音频(默认) * </pre> * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ muteLocalAudioStream(enabled: Boolean): number { return this.nertcEngine.muteLocalAudioStream(enabled); } /** * 设置音频编码属性。 * <pre> * <b>NOTE:</b> * - 该方法需要在 {@link NERtcEngine#joinChannel} 之前设置好, {@link NERtcEngine#joinChannel} 之后设置不生效。 * - 音乐场景下,建议将 profile 设置为 4. * @param {number} profile 设置采样率,码率,编码模式和声道数: * <pre> * - 0 默认设置。Speech场景下为 1,Music场景下为 2 * - 1 普通质量的音频编码,16000Hz,20Kbps * - 2 普通质量的音频编码,16000Hz,32Kbps * - 3 中等质量的音频编码,48000Hz,32Kbps * - 4 中等质量的立体声编码,48000Hz * 2,64Kbps * - 5 高质量的音频编码,48000Hz,64Kbps * - 6 高质量的立体声编码,48000Hz * 2,128Kbps * </pre> * @param {number} scenario 设置音频应用场景: * <pre> * - 0: 默认设置: 通过{@link NERtcEngine#setChannelProfile}设置通话模式时为语音场景(1),直播推流模式时为音乐场景(2)。 * - 1: 语音场景. profile 推荐使用 2 及以下 * - 2: 音乐场景。profile 推荐使用 3 及以上 * </pre> * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ setAudioProfile(profile: NERtcAudioProfileType, scenario: NERtcAudioScenarioType): number { return this.nertcEngine.setAudioProfile(profile, scenario); } /** * 订阅/取消订阅指定音频流。 * @param {number} uid 指定用户的 ID * @param {boolean} subscribe * <pre> * - true: 订阅指定音频流(默认); * - false: 取消订阅指定音频流。 * </pre> * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ subscribeRemoteAudioStream(uid: number, enabled: Boolean): number { return this.nertcEngine.subscribeRemoteAudioStream(uid, enabled); } /** * 设置视频配置。 * <pre> * 该方法设置视频配置。每个属性对应一套视频参数,如分辨率等,会在摄像头重启后生效。 所有设置的参数均为理想情况下的最大值。当视频引擎因网络环境等原因无法达到设置的分辨率的最大值时,会取最接近最大值的那个值。 * </pre> * @param {object} config 视频配置: * @param {number} config.max_profile 视频编码的分辨率,用于衡量编码质量: * <pre> * - 0 160x90/120, 15fps * - 1 320x180/240, 15fps * - 2 640x360/480, 30fps * - 3 1280x720, 30fps * - 4 1920x1080, 30fps * </pre> * @param {number} config.width 视频编码自定义分辨率之宽度。width为0表示使用max_profile * @param {number} config.height 视频编码自定义分辨率之高度。height为0表示使用max_profile * @param {number} config.crop_mode 视频画面裁剪模式: * <pre> * - 0 Device Defalut * - 1 16:9 * - 2 4:3 * - 3 1:1 * </pre> * @param {number} config.framerate 视频帧率: * <pre> * - 0 默认帧率 * - 7 7帧每秒 * - 10 10帧每秒 * - 15 15帧每秒 * - 24 24帧每秒 * - 30 30帧每秒 * - 60 60帧每秒 * </pre> * @param {number} config.min_framerate 视频最小帧率: * <pre> * - 0 默认帧率 * - 7 7帧每秒 * - 10 10帧每秒 * - 15 15帧每秒 * - 24 24帧每秒 * - 30 30帧每秒 * </pre> * @param {number} [config.bitrate=0] 视频编码码率kbps,取0时使用默认值 * @param {number} [config.min_bitrate=0] 视频编码码率下限kbps,取0时使用默认值 * @param {number} config.degradation_preference 编码策略: * <pre> * - 0 使用引擎推荐值。通话场景使用平衡模式,直播推流场景使用清晰优先 * - 1 帧率优先 * - 2 清晰度优先 * - 3 平衡模式 * </pre> * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ setVideoConfig(config: NERtcVideoConfig): number { return this.nertcEngine.setVideoConfig(config); } /** * 设置视频双流发送。 * <pre> * 调用该方法控制是否支持发送双流,只对摄像头数据生效,自定义输入、取屏等无效。设置后,会在摄像头重启后生效。 * </pre> * @param {boolean} enable * <pre> * - true: 双流发送(默认) * - false: 只发送一个流 * </pre> * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ enableDualStreamMode(enabled: Boolean): number { return this.nertcEngine.enableDualStreamMode(enabled); } /** * 设置本地辅流视图。 * <pre> * 该方法设置本地辅流视频显示信息。App 通过调用此接口绑定本地辅流的显示视窗(view)。 在 App 开发中,通常在初始化后调用该方法进行本地视频设置,然后再加入频道。 * </pre> * @param {Object} canvas 视频画布信息 * @param {number} canvas.mode 视频显示模式 * <pre> * - 0 视频尺寸等比缩放。优先保证视频内容全部显示。因视频尺寸与显示视窗尺寸不一致造成的视窗未被填满的区域填充黑色。 * - 1 视频尺寸非等比缩放。保证视频内容全部显示,且填满视窗。 * - 2 视频尺寸等比缩放。优先保证视窗被填满。因视频尺寸与显示视窗尺寸不一致而多出的视频将被截掉。 * </pre> * @param {Element} canvas.view 视频画布对象 * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ setupLocalSubStreamVideoCanvas(canvas: NERtcVideoCanvas): number { if (canvas.view) { //bind this.initSubStreamRender('local', canvas.view); this.setSubStreamRenderMode('local', canvas.mode); return this.nertcEngine.setupSubStreamVideoCanvas(0, true); } else { //unbind this.destroySubStreamRender('local'); return this.nertcEngine.setupSubStreamVideoCanvas(0, false); } } /** * 设置本地视图/远端视图显示模式。 * <pre> * 该方法设置视图显示模式。App 可以多次调用此方法更改显示模式。 * </pre> * @param {(string|number)} uid * <pre> * 'local':本地视图 * {number}: 远端用户 ID。 * </pre> * @param {number} mode 视频显示模式: * <pre> * - 0 视频尺寸等比缩放。优先保证视频内容全部显示。因视频尺寸与显示视窗尺寸不一致造成的视窗未被填满的区域填充黑色。 * - 1 视频尺寸非等比缩放。保证视频内容全部显示,且填满视窗。 * - 2 视频尺寸等比缩放。优先保证视窗被填满。因视频尺寸与显示视窗尺寸不一致而多出的视频将被截掉。 * </pre> * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ setRenderMode(uid: 'local' | number, mode: NERtcVideoScalingMode): number { if (this.renderers.has(String(uid))) { let renderer = this.renderers.get(String(uid)); (renderer as IRenderer).setContentMode(mode); return 0; } else { return -1; } } /** * 设置辅流视图/远端辅流视图显示模式。 * <pre> * 该方法设置视图显示模式。App 可以多次调用此方法更改显示模式。 * </pre> * @param {(string|number)} uid * <pre> * 'local':本地辅流视图 * {number}: 远端辅流用户 ID。 * </pre> * @param {number} mode 视频显示模式: * <pre> * - 0 视频尺寸等比缩放。优先保证视频内容全部显示。因视频尺寸与显示视窗尺寸不一致造成的视窗未被填满的区域填充黑色。 * - 1 视频尺寸非等比缩放。保证视频内容全部显示,且填满视窗。 * - 2 视频尺寸等比缩放。优先保证视窗被填满。因视频尺寸与显示视窗尺寸不一致而多出的视频将被截掉。 * </pre> * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ setSubStreamRenderMode(uid: 'local' | number, mode: NERtcVideoScalingMode): number { if (this.substreamRenderers.has(String(uid))) { let renderer = this.substreamRenderers.get(String(uid)); (renderer as IRenderer).setContentMode(mode); return 0; } else { return -1; } } /** * 设置本地视频镜像模式。 * <pre> * 该方法设置本地视频镜像模式。 App 可以多次调用此方法更改镜像模式。 * </pre> * @param {number} mode 视频镜像模式: * <pre> * - 0 Windows/macOS SDK 启用镜像模式。 * - 1 启用镜像模式。 * - 2 (默认)关闭镜像模式。 * </pre> * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ setLocalVideoMirrorMode(mode: NERtcVideoMirrorMode) { return this.nertcEngine.setLocalVideoMirrorMode(mode); } /** * 设置远端用户辅流视图。 * <pre> * 该方法绑定远端用户和辅流显示视图,即设定 uid 指定的用户用哪个视图显示。调用该接口时需要指定远端视频的 uid,一般可以在用户加入后设置好。 * <b>NODE:</b> * - 如果 App 不能事先知道对方的 uid,可以通过{@link NERtcEngine#on}方法监听 onUserJoined 事件时设置。 * - 退出频道后,SDK 会把远端用户的绑定关系清除掉。 * </pre> * @param {number} uid 远端用户 ID。 * @param {Object} canvas 视频画布信息 * @param {number} canvas.mode 视频显示模式 * <pre> * - 0 视频尺寸等比缩放。优先保证视频内容全部显示。因视频尺寸与显示视窗尺寸不一致造成的视窗未被填满的区域填充黑色。 * - 1 视频尺寸非等比缩放。保证视频内容全部显示,且填满视窗。 * - 2 视频尺寸等比缩放。优先保证视窗被填满。因视频尺寸与显示视窗尺寸不一致而多出的视频将被截掉。 * </pre> * @param {Element} canvas.view 视频画布对象 * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ setupRemoteSubStreamVideoCanvas(uid: number, canvas: NERtcVideoCanvas): number { if (canvas.view) { //bind this.initSubStreamRender(uid, canvas.view); this.setSubStreamRenderMode(uid, canvas.mode); return this.nertcEngine.setupSubStreamVideoCanvas(uid, true); } else { //unbind this.destroySubStreamRender(uid); return this.nertcEngine.setupSubStreamVideoCanvas(uid, false); } } /** * 订阅 / 取消订阅指定远端用户的视频辅流。 * <pre> * 对方打开视频后需要主动订阅 * <b>NOTE:</b> * - 必须在远端加入房间后调用。 * - 必须先设置远端辅流画布。 * </pre> * @param {number} uid 指定用户的用户 ID。 * @param {number} subscribe * <pre> * - true: 订阅指定远端用户的视频流; * - false: 取消订阅指定远端用户的视频流。 * </pre> * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ subscribeRemoteVideoSubStream(uid: number, sub: boolean): number { return this.nertcEngine.subscribeRemoteVideoSubStream(uid, sub); } /** * 开启视频预览。 * <pre> * 该方法用于在进入频道前启动本地视频预览。调用该 API 前,必须: * - 调用 {@link NERtcEngine#setupLocalVideoCanvas} 设置预览窗口; * 启用了本地视频预览后,在进入频道前,本地预览必须先关闭,需要调用 {@link NERtcEngine#stopVideoPreview} 。 * </pre> * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ startVideoPreview(): number { return this.nertcEngine.startVideoPreview(); } /** * 停止视频预览。 * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ stopVideoPreview(): number { return this.nertcEngine.stopVideoPreview(); } /** * 开关本地视频发送。 * <pre> * 调用该方法禁视频流时,SDK 不再发送本地视频流,但摄像头仍然处于工作状态。相比于 {@link NERtcEngine#enableLocalVideo} (false) 用于控制本地视频流发送的方法,该方法响应速度更快。该方法不影响本地视频流获取,没有禁用摄像头。 * </pre> * @param {boolean} mute * <pre> * - true: 不发送本地视频流 * - false: 发送本地视频流(默认) * </pre> * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ muteLocalVideoStream(enabled: Boolean): number { return this.nertcEngine.muteLocalVideoStream(enabled); } /** * 通过 JSON 配置 SDK 提供技术预览或特别定制功能。以标准化方式公开 JSON 选项。 * @param {object} parameters JSON 字符串形式的参数 * @param {boolean} parameters.record_host_enabled * <pre> * - true 录制主讲人 * - false 不是录制主讲人 * </pre> * @param {boolean} [parameters.record_audio_enabled=false] 启用服务器音频录制。默认值 false * @param {boolean} [parameters.record_video_enabled=false] 启用服务器视频录制。默认值 false * @param {number} parameters.record_type 录制类型: * <pre> * - 0 参与混合录制且录制单人文件 * - 1 参与混合录制 * - 2 只录单人文件 * </pre> * @param {boolean} [parameters.auto_subscribe_audio=true] 其他用户打开音频时,自动订阅。 默认值 true * @param {boolean} [parameters.publish_self_stream_enabled=false] 开启旁路直播。默认值 false * @param {number} [parameters.log_level=3] 日志级别,默认级别为 kNERtcLogLevelInfo。 * <pre> * - 0 Fatal级别日志信息 * - 1 Error级别日志信息 * - 2 Warning级别日志信息 * - 3 Info级别日志信息。默认级别 * - 4 DetailInfo级别日志信息 * - 5 Verbos级别日志信息 * - 6 Debug级别日志信息。如果你想获取最完整的日志,可以将日志级别设为该等级 * - 7 不输出日志信息 * </pre> * @param {boolean} [parameters.audio_processing_aec_enable=true] AEC开关,默认值 true * @param {boolean} [parameters.audio_processing_agc_enable=true] AGC开关,默认值 true * @param {boolean} [parameters.audio_processing_ns_enable=true] NS开关,默认值 true * @param {boolean} [parameters.audio_processing_ai_ns_enable=false] AI NS开关,建议通话前修改,默认值 false * @param {boolean} [parameters.audio_processing_external_audiomix_enable=false] 输入混音开关,默认值 false * @param {boolean} [parameters.audio_processing_earphone=false] 通知SDK是否使用耳机: * <pre> * - true: 使用耳机 * - false: 不使用耳机 * </pre> * @param {number} [parameters.video_sendonpub_type=1] 设置视频发送策略,默认发送大流(1);通话前设置有效 * <pre> * - 0 不主动发送数据流,被订阅后发送。 * - 1 主动发送大流。 * - 2 主动发送小流。 * - 3 主动发送大小流。 * </pre> * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ setParameters(parameters: String): number { return this.nertcEngine.setParameters(parameters); } // /** 设置录制的声音格式。该方法设置 \ref nertc::INERtcAudioFrameObserver::onAudioFrameDidRecord "onAudioFrameDidRecord" 回调的录制声音格式。 // - joinChannel 前/后都允许更改设置。 // - 取消监听,重置为空。 // @param format 指定 *onAudioFrameDidRecord* 中返回数据的采样率和数据的通道数。允许传入 NULL,默认为 NULL。 // * @returns {number} // * <pre> // * - 0: 方法调用成功; // * - 其他: 方法调用失败。 // * </pre> // */ // setRecordingAudioFrameParameters(format: NERtcAudioFrameRequestFormat): number { // return this.nertcEngine.setRecordingAudioFrameParameters(format); // } // /** 设置播放的声音格式。该方法设置 \ref nertc::INERtcAudioFrameObserver::onAudioFrameWillPlayback "onAudioFrameWillPlayback" 回调的播放声音格式。 // <b>NOTE:</b> // - joinChannel 前/后都允许更改设置。 // - 取消监听,重置为空。 // @param format 指定 *onAudioFrameWillPlayback* 中返回数据的采样率和数据的通道数。允许传入 NULL,默认为 NULL。 // * @returns {number} // * <pre> // * - 0: 方法调用成功; // * - 其他: 方法调用失败。 // * </pre> // */ // setPlaybackAudioFrameParameters(format: NERtcAudioFrameRequestFormat): number { // return this.nertcEngine.setPlaybackAudioFrameParameters(format); // } /** * 开启音频dump。 * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ startAudioDump(): number { return this.nertcEngine.startAudioDump(); } /** * 结束音频dump。 * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ stopAudioDump(): number { return this.nertcEngine.stopAudioDump(); } /** * 开始播放伴奏。 * <pre> * 指定本地或在线音频文件来和录音设备采集的音频流进行混音。成功调用该方法后,可以通过{@link NERtcEngine#on}方法监听 onAudioMixingStateChanged 播放状态改变事件。 * 请在频道内调用该方法,如果在频道外调用该方法可能会出现问题。 * </pre> * @param {object} option 创建混音任务配置的选项,包括混音任务类型、混音文件全路径或URL等。支持的音频格式包括: AAC、MP3 和 WAVE。 * @param {string} option.path 本地文件全路径或URL <256 chars * @param {number} [option.loop_count=1] 循环次数, <= 0, 表示无限循环,默认 1 * @param {boolean} [option.send_enabled=true] 是否可发送,默认为 true * @param {number} [option.send_volume=100] 发送音量。最大为 100(默认)含义(0%-100%) * @param {boolean} [option.playback_enabled=true] 是否可回放,默认为 true * @param {number} [option.playback_volume=100] 回放音量。最大为 100(默认) * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ startAudioMixing(opt: NERtcCreateAudioMixingOption): number { return this.nertcEngine.startAudioMixing(opt); } /** * 停止播放伴奏。 * <pre> * 该方法停止播放伴奏。请在频道内调用该方法。 * </pre> * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ stopAudioMixing(): number { return this.nertcEngine.stopAudioMixing(); } /** * 暂停播放伴奏。 * <pre> * 该方法暂停播放伴奏。请在频道内调用该方法。 * </pre> * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ pauseAudioMixing(): number { return this.nertcEngine.pauseAudioMixing(); } /** * 恢复播放伴奏。 * <pre> * 该方法恢复混音,继续播放伴奏。请在频道内调用该方法。 * </pre> * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ resumeAudioMixing(): number { return this.nertcEngine.resumeAudioMixing(); } /** * 调节伴奏发送音量。 * <pre> * 该方法调节混音里伴奏的发送音量大小。请在频道内调用该方法。 * </pre> * @param {number} volume 伴奏音量范围为 0~100。默认 100 为原始文件音量。 * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ setAudioMixingSendVolume(volume: number): number { return this.nertcEngine.setAudioMixingSendVolume(volume); } /** * 获取伴奏发送音量。 * <pre> * 该方法获取混音里伴奏的发送音量大小。请在频道内调用该方法。 * </pre> * @returns {number} * <pre> * - >=0: 伴奏发送音量; * - 其他: 方法调用失败。 * </pre> */ getAudioMixingSendVolume(): number { return this.nertcEngine.getAudioMixingSendVolume(); } /** * 调节伴奏播放音量。 * <pre> * 该方法调节混音里伴奏的播放音量大小。请在频道内调用该方法。 * </pre> * @param {number} volume 伴奏音量范围为 0~100。默认 100 为原始文件音量。 * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ setAudioMixingPlaybackVolume(volume: number): number { return this.nertcEngine.setAudioMixingPlaybackVolume(volume); } /** * 获取伴奏播放音量。 * <pre> * 该方法获取混音里伴奏的播放音量大小。请在频道内调用该方法。 * </pre> * @returns {number} * <pre> * - >= 0: 伴奏播放音量; * - 其他: 方法调用失败。 * </pre> */ getAudioMixingPlaybackVolume(): number { return this.nertcEngine.getAudioMixingPlaybackVolume(); } /** * 获取伴奏时长。 * <pre> * 该方法获取伴奏时长,单位为毫秒。请在频道内调用该方法。 * </pre> * @returns {number} * <pre> * - >=0: 伴奏时长,单位为毫秒; * - 其他: 方法调用失败。 * </pre> */ getAudioMixingDuration(): number { return this.nertcEngine.getAudioMixingDuration(); } /** * 获取音乐文件的播放进度。 * <pre> * 该方法获取当前伴奏播放进度,单位为毫秒。请在频道内调用该方法。 * </pre> * @returns {number} * <pre> * - >= 0: 伴奏播放进度,单位为毫秒; * - 其他: 方法调用失败。 * </pre> */ getAudioMixingCurrentPosition(): number { return this.nertcEngine.getAudioMixingCurrentPosition(); } /** * 设置音乐文件的播放位置。 * <pre> * 该方法可以设置音频文件的播放位置,这样你可以根据实际情况播放文件,而非从头到尾播放整个文件。 * </pre> * @param {number} pos 进度条位置,单位为毫秒。 * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ setAudioMixingPosition(pos: number): number { return this.nertcEngine.setAudioMixingPosition(pos); } /** * 播放指定音效文件。 * <pre> * 你可以多次调用该方法,通过传入不同的音效文件的 effect_id 和 option ,同时播放多个音效文件,实现音效叠加。为获得最佳用户体验,我们建议同时播放的音效文件不要超过 3 个。成功调用该方法后,可以通过{@link NERtcEngine#on}方法监听 onAudioEffectFinished 播放结束事件。 * 请在频道内调用该方法,如果在频道外调用该方法可能会出现问题。 * </pre> * @param {number} effectId 指定音效的 ID。每个音效均有唯一的 ID。 * @param {object[]} opt 创建音效任务配置的选项,包括混音任务类型、混音文件全路径或URL等。支持的音频格式包括: AAC、MP3 和 WAVE。 * @param {String} opt[].path 本地文件全路径或URL <256 chars * @param {number} [opt[].loop_count=1] 循环次数, <= 0, 表示无限循环,默认 1 * @param {boolean} [opt[].send_enabled=true] 是否可发送,默认为 true * @param {number} opt[].send_volume 发送音量。最大为 100(默认)含义(0%-100%) * @param {boolean} [opt[].playback_enabled=true] 是否可回放,默认为 true * @param {number} opt[].playback_volume 回放音量。最大为 100(默认) * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ playEffect(effectId: number, opt: Array<NERtcCreateAudioEffectOption>): number { return this.nertcEngine.playEffect(effectId, opt); } /** * 停止播放指定音效文件。 * <pre> * 请在频道内调用该方法。 * </pre> * @param {number} effectId 指定音效的 ID。每个音效均有唯一的 ID。 * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ stopEffect(effectId: number): number { return this.nertcEngine.stopEffect(effectId); } /** * 停止播放所有音效文件。 * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ stopAllEffects(): number { return this.nertcEngine.stopAllEffects(); } /** * 暂停音效文件播放。 * <pre> * 请在频道内调用该方法。 * </pre> * @param {number} effectId 指定音效的 ID。每个音效均有唯一的 ID。 * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ pauseEffect(effectId: number): number { return this.nertcEngine.pauseEffect(effectId); } /** * 恢复播放指定音效文件。 * <pre> * 请在频道内调用该方法。 * </pre> * @param {number} effectId 指定音效的 ID。每个音效均有唯一的 ID。 * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ resumeEffect(effectId: number): number { return this.nertcEngine.resumeEffect(effectId); } /** * 暂停所有音效文件播放。 * <pre> * 请在频道内调用该方法。 * </pre> * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ pauseAllEffects(): number { return this.nertcEngine.pauseAllEffects(); } /** * 恢复播放所有音效文件。 * <pre> * 请在频道内调用该方法。 * </pre> * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ resumeAllEffects(): number { return this.nertcEngine.resumeAllEffects(); } /** * 调节音效发送音量。 * <pre> * 该方法调节音效的发送音量大小。请在频道内调用该方法。 * </pre> * @param {number} effectId 指定音效的 ID。每个音效均有唯一的 ID。 * @param {number} volume 音效音量范围为 0~100。默认 100 为原始文件音量。 * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ setEffectSendVolume(effectId: number, volume: number): number { return this.nertcEngine.setEffectSendVolume(effectId, volume); } /** * 获取音效发送音量。 * <pre> * 该方法获取音效的发送音量大小。请在频道内调用该方法。 * </pre> * @param {number} effectId 指定音效的 ID。每个音效均有唯一的 ID。 * @returns {number} * - >=0: 音效发送音量; * - 其他: 方法调用失败。 */ getEffectSendVolume(effectId: number): number { return this.nertcEngine.getEffectSendVolume(effectId); } /** * 调节音效播放音量。 * <pre> * 该方法调节音效的播放音量大小。请在频道内调用该方法。 * </pre> * @param {number} effectId 指定音效的 ID。每个音效均有唯一的 ID。 * @param {number} volume 音效音量范围为 0~100。默认 100 为原始文件音量。 * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ setEffectPlaybackVolume(effectId: number, volume: number): number { return this.nertcEngine.setEffectPlaybackVolume(effectId, volume); } /** * 获取音效播放音量。 * <pre> * 该方法获取音效的播放音量大小。请在频道内调用该方法。 * </pre> * @param {number} effectId 指定音效的 ID。每个音效均有唯一的 ID。 * @returns {number} * - >= 0: 音效播放音量; * - 其他: 方法调用失败。 */ getEffectPlaybackVolume(effectId: number): number { return this.nertcEngine.getEffectPlaybackVolume(effectId); } /** * 开启或关闭耳返。 * <pre> * 请在频道内调用该方法。 * </pre> * @param {boolean} enabled 开启或关闭。 * @param {number} volume 耳返音量。 * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ enableEarback(enabled: boolean, volume: number): number { return this.nertcEngine.enableEarback(enabled, volume); } /** * 设置耳返音量。 * <pre> * 请在频道内调用该方法。 * </pre> * @param {number} volume 耳返音量。 * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ setEarbackVolume(volume: number): number { return this.nertcEngine.setEarbackVolume(volume); } // /** 注册统计信息观测器。 // @param {} eventName NERtcMediaStatsEventName // @param {} enabled 是否开启 // @param {} callback 回调函数 // @returns {number} // - 0: 方法调用成功; // - 其他: 方法调用失败。 // */ // onStatsObserver(eventName: NERtcMediaStatsEventName, enabled: boolean, callback: Function): void { // return this.nertcEngine.onStatsObserver(eventName, enabled, callback); // } /** * 启用说话者音量提示。该方法允许 SDK 定期向 App 反馈当前谁在说话以及说话者的音量。 * <pre> * 启用该方法后,无论频道内是否有人说话,可以通过{@link NERtcEngine#on}方法监听 onRemoteAudioVolumeIndication,根据设置的间隔时间返回音量提示事件。 * </pre> * @param {boolean} enable 是否启用说话者音量提示。 * @param {number} interval 指定音量提示的时间间隔,单位为毫秒。必须设置为 100 毫秒的整数倍值。 * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ enableAudioVolumeIndication(enabled: boolean, interval: number): number { return this.nertcEngine.enableAudioVolumeIndication(enabled, interval); } /** * 通过指定区域共享屏幕。共享一个屏幕或该屏幕的部分区域。用户需要在该方法中指定想要共享的屏幕区域。 * <pre> * <b>NOTE:</b> * - 该方法仅适用于 Windows。 * - 该方法打开视频辅流。 * </pre> * @param {object} screenRect 指定待共享的屏幕相对于虚拟屏的位置。 * @param {number} screenRect.x 左上角的横向偏移 * @param {number} screenRect.y 左上角的纵向偏移 * @param {number} screenRect.width 待共享区域的宽 * @param {number} screenRect.height 待共享区域的高 * @param {object} [regionRect=] (可选) 指定待共享区域相对于整个屏幕屏幕的位置。如果设置的共享区域超出了屏幕的边界,则只共享屏幕内的内容;如果将 width 或 height 设为 0, 则共享整个屏幕。 * @param {number} regionRect.x 左上角的横向偏移 * @param {number} regionRect.y 左上角的纵向偏移 * @param {number} regionRect.width 待共享区域的宽 * @param {number} regionRect.height 待共享区域的高 * @param {object} param 屏幕共享的编码参数配置。 * @param {object} [param.profile=2] 屏幕共享编码参数配置: * <pre> * - 0 640x480, 5fps * - 1 1280x720, 5fps * - 2 1920x1080, 5fps。默认 * - 3 自定义 * </pre> * @param {object} param.dimensions 屏幕共享视频发送的最大像素值,param.profile=3时生效: * @param {number} param.dimensions.width 宽度 * @param {number} param.dimensions.height 高度 * @param {number} [param.frame_rate=5] 共享视频的帧率,param.profile=3时生效,单位为 fps;默认值为 5,建议不要超过 15 * @param {number} [param.bitrate=0] 共享视频的码率,单位为 bps;默认值为 0,表示 SDK 根据当前共享屏幕的分辨率计算出一个合理的值 * @param {boolean} param.capture_mouse_cursor 是否采集鼠标用于屏幕共享 * @param {boolean} param.window_focus 调用 {@link NERtcEngine#startScreenCaptureByWindowId} 方法共享窗口时,是否将该窗口前置 * @param {number[]} param.excluded_window_list 待屏蔽窗口的 ID 列表 * @param {number} param.excluded_window_count 待屏蔽窗口的数量 * @param {number} param.prefer 编码策略倾向: * <pre> * - 0 动画模式 * - 1 细节模式 * </pre> * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ startScreenCaptureByScreenRect(screenRect: NERtcRectangle, regionRect: NERtcRectangle, param: NERtcScreenCaptureParameters): number { return this.nertcEngine.startScreenCaptureByScreenRect(screenRect, regionRect, param); } /** * 通过屏幕 ID 共享屏幕。共享一个屏幕或该屏幕的部分区域。用户需要在该方法中指定想要共享的屏幕 ID。 * <pre> * <b>NOTE:</b> * - 该方法仅适用于 Windows 和 macOS。 * - 该方法打开视频辅流。 * </pre> * @param {number} displayId 指定待共享的屏幕 ID。开发者需要通过该参数指定你要共享的那个屏幕。 * @param {object} [regionRect=] (可选) 指定待共享区域相对于整个屏幕屏幕的位置。如果设置的共享区域超出了屏幕的边界,则只共享屏幕内的内容;如果将 width 或 height 设为 0, 则共享整个屏幕。 * @param {number} regionRect.x 左上角的横向偏移 * @param {number} regionRect.y 左上角的纵向偏移 * @param {number} regionRect.width 待共享区域的宽 * @param {number} regionRect.height 待共享区域的高 * @param {object} param 屏幕共享的编码参数配置。 * @param {object} [param.profile=2] 屏幕共享编码参数配置: * <pre> * - 0 640x480, 5fps * - 1 1280x720, 5fps * - 2 1920x1080, 5fps。默认 * - 3 自定义 * </pre> * @param {object} param.dimensions 屏幕共享视频发送的最大像素值,param.profile=3时生效: * @param {number} param.dimensions.width 宽度 * @param {number} param.dimensions.height 高度 * @param {number} [param.frame_rate=5] 共享视频的帧率,param.profile=3时生效,单位为 fps;默认值为 5,建议不要超过 15 * @param {number} [param.bitrate=0] 共享视频的码率,单位为 bps;默认值为 0,表示 SDK 根据当前共享屏幕的分辨率计算出一个合理的值 * @param {boolean} param.capture_mouse_cursor 是否采集鼠标用于屏幕共享 * @param {boolean} param.window_focus 调用 {@link NERtcEngine#startScreenCaptureByWindowId} 方法共享窗口时,是否将该窗口前置 * @param {number[]} param.excluded_window_list 待屏蔽窗口的 ID 列表 * @param {number} param.excluded_window_count 待屏蔽窗口的数量 * @param {number} param.prefer 编码策略倾向: * <pre> * - 0 动画模式 * - 1 细节模式 * </pre> * @returns {number} * <pre> * - 0: 方法调用成功; * - -100: 需要先调用 {@link NERtcEngine#enumerateScreenCaptureSourceInfo} 缓存桌面信息 * - 其他: 方法调用失败。 * </pre> */ startScreenCaptureByDisplayId(displayId: number, regionRect: NERtcRectangle, param: NERtcScreenCaptureParameters): number { return this.nertcEngine.startScreenCaptureByDisplayId(displayId, regionRect, param); } /** * 通过窗口 ID 共享窗口。共享一个窗口或该窗口的部分区域。用户需要在该方法中指定想要共享的窗口 ID。 * <pre> * <b>NOTE:</b> * - 该方法仅适用于 Windows 和 macOS。 * - 该方法打开视频辅流。 * </pre> * @param {number} windowid 指定待共享的窗口 ID。 * @param {object} [regionRect=] (可选) 指定待共享区域相对于整个屏幕屏幕的位置。如果设置的共享区域超出了屏幕的边界,则只共享屏幕内的内容;如果将 width 或 height 设为 0, 则共享整个屏幕。 * @param {number} regionRect.x 左上角的横向偏移 * @param {number} regionRect.y 左上角的纵向偏移 * @param {number} regionRect.width 待共享区域的宽 * @param {number} regionRect.height 待共享区域的高 * @param {object} param 屏幕共享的编码参数配置。 * @param {object} [param.profile=2] 屏幕共享编码参数配置: * <pre> * - 0 640x480, 5fps * - 1 1280x720, 5fps * - 2 1920x1080, 5fps。默认 * - 3 自定义 * </pre> * @param {object} param.dimensions 屏幕共享视频发送的最大像素值,param.profile=3时生效: * @param {number} param.dimensions.width 宽度 * @param {number} param.dimensions.height 高度 * @param {number} [param.frame_rate=5] 共享视频的帧率,param.profile=3时生效,单位为 fps;默认值为 5,建议不要超过 15 * @param {number} [param.bitrate=0] 共享视频的码率,单位为 bps;默认值为 0,表示 SDK 根据当前共享屏幕的分辨率计算出一个合理的值 * @param {boolean} param.capture_mouse_cursor 是否采集鼠标用于屏幕共享 * @param {boolean} param.window_focus 调用 {@link NERtcEngine#startScreenCaptureByWindowId} 方法共享窗口时,是否将该窗口前置 * @param {number[]} param.excluded_window_list 待屏蔽窗口的 ID 列表 * @param {number} param.excluded_window_count 待屏蔽窗口的数量 * @param {number} param.prefer 编码策略倾向: * <pre> * - 0 动画模式 * - 1 细节模式 * </pre> * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ startScreenCaptureByWindowId(windowid: number, regionRect: NERtcRectangle, param: NERtcScreenCaptureParameters): number { return this.nertcEngine.startScreenCaptureByWindowId(windowid, regionRect, param); } /** * 在共享屏幕或窗口时,更新共享的区域。 * @param {object} param 屏幕共享的编码参数配置。 * @param {object} [param.profile=2] 屏幕共享编码参数配置: * <pre> * - 0 640x480, 5fps * - 1 1280x720, 5fps * - 2 1920x1080, 5fps。默认 * - 3 自定义 * </pre> * @param {object} param.dimensions 屏幕共享视频发送的最大像素值,param.profile=3时生效: * @param {number} param.dimensions.width 宽度 * @param {number} param.dimensions.height 高度 * @param {number} [param.frame_rate=5] 共享视频的帧率,param.profile=3时生效,单位为 fps;默认值为 5,建议不要超过 15 * @param {number} [param.bitrate=0] 共享视频的码率,单位为 bps;默认值为 0,表示 SDK 根据当前共享屏幕的分辨率计算出一个合理的值 * @param {boolean} param.capture_mouse_cursor 是否采集鼠标用于屏幕共享 * @param {boolean} param.window_focus 调用 {@link NERtcEngine#startScreenCaptureByWindowId} 方法共享窗口时,是否将该窗口前置 * @param {number[]} param.excluded_window_list 待屏蔽窗口的 ID 列表 * @param {number} param.excluded_window_count 待屏蔽窗口的数量 * @param {number} param.prefer 编码策略倾向: * <pre> * - 0 动画模式 * - 1 细节模式 * </pre> * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ updateScreenCaptureRegion(regionRect: NERtcRectangle): number { return this.nertcEngine.updateScreenCaptureRegion(regionRect); } /** * 停止屏幕共享。 * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ stopScreenCapture(): number { return this.nertcEngine.stopScreenCapture(); } /** * 暂停屏幕共享。 * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ pauseScreenCapture(): number { return this.nertcEngine.pauseScreenCapture(); } /** * 恢复屏幕共享。 * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ resumeScreenCapture(): number { return this.nertcEngine.resumeScreenCapture(); } /** * 开启声音共享。 * @deprecated 该接口已经在 4.1.x 版本后废弃 * <pre> * <b>NOTE:</b> * - 该方法仅适用于 Windows。 * - 请在频道内调用该方法,该方法会捕获系统声音发送,开启本地语音后工作。 * </pre> * @return {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ startSystemAudioLoopbackCapture(): number { return this.nertcEngine.startSystemAudioLoopbackCapture(); } /** * 关闭声音共享。 * @deprecated 该接口已经在 4.1.x 版本后废弃 * <pre> * <b>NOTE:</b> * - 该方法仅适用于 Windows。 * - 请在频道内调用该方法,通话结束后自动关闭。 * </pre> * @return {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ stopSystemAudioLoopbackCapture(): number { return this.nertcEngine.stopSystemAudioLoopbackCapture(); } /** * 设置声音共享音量。 * @deprecated 该接口已经在 4.1.x 版本后废弃 * <pre> * <b>NOTE:</b> * - 该方法仅适用于 Windows。 * - 请在频道内调用该方法。 * </pre> * @param {number} volume 音效音量范围为 0~100。默认 100 为原始音量。 * @return {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ setSystemAudioLoopbackCaptureVolume(volume: number): number { return this.nertcEngine.setSystemAudioLoopbackCaptureVolume(volume); } /** * 发送媒体补充增强信息(SEI)。 * @since 4.1.110 * <pre> * 在本端推流传输视频流数据同时,发送流媒体补充增强信息来同步一些其他附加信息。当推流方发送 SEI 后,拉流方可通过监听 onReceSEIMsg 的回调获取 SEI 内容。 * - 调用时机:视频流(主流)开启后,可调用此函数。 * - 数据长度限制: SEI 最大数据长度为 4096 字节,超限会发送失败。如果频繁发送大量数据会导致视频码率增大,可能会导致视频画质下降甚至卡顿。 * - 发送频率限制:最高为视频发送的帧率,建议不超过 10 次/秒。 * - 生效时间:调用本接口之后,最快在下一帧视频数据帧之后发送 SEI 数据,最慢在接下来的 5 帧视频之后发送。 * <b>NOTE:</b> * - SEI 数据跟随视频帧发送,由于在弱网环境下可能丢帧,SEI 数据也可能随之丢失,所以建议在发送频率限制之内多次发送,保证接收端收到的概率。 * - 调用本接口时,默认使用主流通道发送 SEI。 * </pre> * @param {ArrayBuffer} data 自定义 SEI 数据 * @return {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ sendSEIMsg(data: ArrayBuffer): number { return this.nertcEngine.sendSEIMsg(data); } /** * 发送媒体补充增强信息(SEI)。 * @since 4.1.110 * <pre> * 在本端推流传输视频流数据同时,发送流媒体补充增强信息来同步一些其他附加信息。当推流方发送 SEI 后,拉流方可通过监听 onReceSEIMsg 的回调获取 SEI 内容。 * - 调用时机:视频流(主流)开启后,可调用此函数。 * - 数据长度限制: SEI 最大数据长度为 4096 字节,超限会发送失败。如果频繁发送大量数据会导致视频码率增大,可能会导致视频画质下降甚至卡顿。 * - 发送频率限制:最高为视频发送的帧率,建议不超过 10 次/秒。 * - 生效时间:调用本接口之后,最快在下一帧视频数据帧之后发送 SEI 数据,最慢在接下来的 5 帧视频之后发送。 * <b>NOTE:</b> * - SEI 数据跟随视频帧发送,由于在弱网环境下可能丢帧,SEI 数据也可能随之丢失,所以建议在发送频率限制之内多次发送,保证接收端收到的概率。 * - 调用本接口时,默认使用主流通道发送 SEI。 * </pre> * @param {ArrayBuffer} data 自定义 SEI 数据 * @param {number} type 发送 SEI 时,使用的流通道类型: * <pre> * - 0: 主流通道 * - 1: 辅流通道 * </pre> * @return {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ sendSEIMsgEx(data: ArrayBuffer, type: NERtcStreamChannelType) { return this.nertcEngine.sendSEIMsgEx(data, type); } /** * 拉取外部音频数据。 * @since 4.1.110 * <pre> * - 该方法将从内部引擎拉取音频数据。 通过 setExternalAudioRender 启用外部音频数据渲染功能成功后,可以使用 pullExternalAudioFrame 接口获取音频 PCM 数据。 * <b>NOTE:</b> * - 该方法需要在加入房间后调用。 * - 数据帧时长建议匹配 10ms 周期。 * - 该方法在音频渲染设备关闭后不再生效,此时会返回空数据。例如通话结束、通话前扬声器设备测试关闭等情况下,该设置不再生效。 * </pre> * @param {boolean} enable 是否外部数据输出 * <pre> * - true: 开启外部数据渲染 * - false: 关闭外部数据渲染 (默认) * </pre> * @param {number} sampleRate 数据采样率,后续数据按该格式返回。注意:调用接口关闭功能时可传入任意合法值,此时设置不会生效 * @param {number} channels channels 数据声道数,后续数据按该格式返回。注意:调用接口关闭功能时可传入任意合法值,此时设置不会生效。 * @return {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ setExternalAudioRender(enable: boolean, sampleRate: number, channels: number): number { return this.nertcEngine.setExternalAudioRender(enable, sampleRate, channels); } /** * 拉取外部音频数据。 * @since 4.1.110 * <pre> * - 该方法将从内部引擎拉取音频数据。 通过 setExternalAudioRender 启用外部音频数据渲染功能成功后,可以使用 pullExternalAudioFrame 接口获取音频 PCM 数据。 * <b>NOTE:</b> * - 该方法需要在加入房间后调用。 * - 数据帧时长建议匹配 10ms 周期。 * - 该方法在音频渲染设备关闭后不再生效,此时会返回空数据。例如通话结束、通话前扬声器设备测试关闭等情况下,该设置不再生效。 * </pre> * @param {number} pullLength 待拉取音频数据的字节数,单位为 byte * @param {function} cb 拉取数据的回调函数 * @returns {number} * <pre> * - 0: 方法调用成功; * - 其他: 方法调用失败。 * </pre> */ pullExternalAudioFrame(pullLength: number, cb: NERtcPullExternalAudioFrameCb): number { return this.nertcEngine.pullExternalAudioFrame(pullLength, cb); } /** * 查询 SDK 版本号。 * @returns {String} 当前的 SDK 版本号,格式为字符串,如1.0.0. */ getVersion(): String { return this.nertcEngine.getVersion(); } /** * 获取错误描述。 * @param {number} errorCode 错误码 * @returns {number} 详细错误码描述 */ getErrorDescription(errorCode: number): String { return this.nertcEngine.getErrorDescription(errorCode); } /** * 上传SDK 信息(如log文件和Audio dump文件)。 */ uploadSdkInfo(): void { return this.nertcEngine.uploadSdkInfo(); } /** * 添加房间推流任务,成功添加后当前用户可以收到该直播流的状态通知。通话中有效。 * @fires NERtcEngine#onAddLiveStreamTask * @param {Object} info 直播任务信息。 * @param {String} info.task_id 推流任务ID,为推流任务的唯一标识,用于过程中增删任务操作 <64 chars * @param {String} info.stream_url 直播推流地址 <256 chars * @param {Boolean} info.server_record_enabled 服务器录制功能是否开启 * @param {Number} info.ls_mode 直播推流模式: * <pre> * - 0 推流带视频 * - 1 推流纯音频 * </pre> * @param {Object} info.config 音视频流编码参数等设置: * @param {boolean} info.config.singleVideoPassThrough 音频编码规格。默认值为 NERtcLiveStreamAudioCodecProfileLCAAC 普通编码规格。 * @param