nertc-electron-sdk
Version:
nertc-electron-sdk
1,639 lines • 302 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const renderer_1 = require("../renderer");
const defs_1 = require("./defs");
const events_1 = require("events");
// const nertc = require('bindings')('nertc-electron-sdk');
const nertc = require('../../build/Release/nertc-electron-sdk.node');
const NERtcChannel = require('./channel').default;
/** 将 NERtcVideoStreamType 数值转换为 RendererManager 使用的 StreamType 字符串 */
function streamTypeToName(streamType) {
if (streamType === 1)
return 'sub';
if (streamType === 2)
return 'third';
if (streamType === 3)
return 'fourth';
return 'main';
}
/**
* @class NERtcEngine
*/
class NERtcEngine extends events_1.EventEmitter {
/**
* NERtcEngine 类构造函数
* @returns {NERtcEngine}
*/
constructor() {
super();
this.nertcEngine = new nertc.NertcNodeEngine();
this.initEventHandler();
this.renderers = new Map();
this.substreamRenderers = new Map();
this.localCanvasKeys = new Set();
this.renderMode = this._checkWebGL() ? 1 : 2;
this.customRenderer = renderer_1.CustomRenderer;
}
bindLocalCanvasKey(key) {
const before = this.localCanvasKeys.size;
this.localCanvasKeys.add(String(key));
console.log(`[SDK-TS] bindLocalCanvasKey key=${key} before=${before} after=${this.localCanvasKeys.size}`);
if (before === 0 && this.localCanvasKeys.size === 1) {
return this.nertcEngine.setupVideoCanvas('local', true);
}
return 0;
}
unbindLocalCanvasKey(key) {
const before = this.localCanvasKeys.size;
this.localCanvasKeys.delete(String(key));
if (before > 0 && this.localCanvasKeys.size === 0) {
return this.nertcEngine.setupVideoCanvas('local', false);
}
return 0;
}
/**
* 创建一个 NERtcChannel 对象
* @since V5.4.0
* <pre>
* 设置相同房间名称的用户会进入同一个通话房间。
* </pre>
* @param {string} name 房间名 字符串格式,长度为 1~ 64 字节。支持以下 89 个字符:a-z, A-Z, 0-9, space, !#$%&()+-:;≤.,>? @[]^_{|}~”
* @returns {object} NERtcChannel 对象
*/
createChannel(channelName) {
let nertcChannel = new nertc.NertcNodeChannel(channelName);
return new NERtcChannel(channelName, nertcChannel);
}
/**
* 初始化 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。
* @param {object} context.server_config 私有化服务器地址,默认需要置空, 如需启用私有化功能,请 [提交工单](https://app.yunxin.163.com/global/service/ticket/create) 联系网易云信技术支持工程师获取详情。
* @param {string} context.server_config.channel_server 获取通道信息服务器。
* @param {string} context.server_config.statistics_server 统计上报服务器。
* @param {string} context.server_config.room_server roomServer 服务器。
* @param {string} context.server_config.compat_server 兼容性配置服务器
* @param {string} context.server_config.nos_lbs_server nos 域名解析服务器
* @param {string} context.server_config.nos_upload_sever 默认 nos 上传服务器
* @param {string} context.server_config.nos_token_server 获取 NOS token 服务器
* @param {boolean} context.server_config.use_ipv6 是否使用 IPv6(默认 false)
* @returns {number}
* <pre>
* - 0:方法调用成功。
* - 其他:方法调用失败。
* </pre>
*/
initialize(context) {
return this.nertcEngine.initialize(context);
}
/**
* 释放资源。
*/
release() {
return this.nertcEngine.release();
}
/**
* Enable or disable test mode for API call recording
* @param {boolean} enabled - true to enable recording
* @returns 0 on success
*/
setTestMode(enabled) {
return this.nertcEngine.setTestMode(enabled);
}
/**
* Get recorded API calls (only in test mode)
* @returns Array of CallRecord objects
*/
getCallRecords() {
return this.nertcEngine.getCallRecords();
}
/**
* Clear recorded API calls
* @returns 0 on success
*/
clearCallRecords() {
return this.nertcEngine.clearCallRecords();
}
/**
* [Test mode only] Directly fire a C++ event handler callback with the given uid.
* Used to verify C++ → JS uid precision without requiring a real server connection.
*
* Supported eventNames: onUserJoined, onUserLeft, onJoinChannel,
* onUserAudioStart, onUserVideoStart, onUserAudioMute, onUserVideoMute
* @param eventName - Name of the event to fire
* @param uid - uid string to pass into the callback (e.g. '12345678901234567')
* @returns 0 on success, -1 if event handler not initialized
*/
fireTestEvent(eventName, uid) {
return this.nertcEngine.fireTestEvent(eventName, uid);
}
/**
* 设置参会者角色
* <pre>
* {@link NERtcEngine#setClientRole} 接口用于在直播场景中设置用户角色。默认情况下用户以主播角色加入房间。
* 在加入房间前,用户需要调用 setClientRole 接口设置本端模式为观众或主播模式。在加入房间后,用户可以通过本接口切换用户模式。
* 用户角色支持设置为主播或观众,主播和观众的权限不同。默认情况下用户以主播角色加入房间。
* 可以在通话前后设置,通话前设置会在加入频道之后生效。如果设置观众模式。则会停止音视频设备。
* </pre>
* @param {number} role 参会者模式
* <pre>
* - 主播(0):可以开关摄像头等设备、可以发布流、可以操作互动直播推流相关接口、上下线对其他房间内用户可见
* - 观众(1):不可以开关摄像头等设备、不可以发布流、不可以操作互动直播推流相关接口、上下线对其他房间内用户不可见
* </pre>
* @fires NERtcEngine#onClientRoleChanged
* @returns {number}
* <pre>
* - 0:方法调用成功。
* - 其他:方法调用失败。
* </pre>
*/
setClientRole(role) {
return this.nertcEngine.setClientRole(role);
}
/**
* 设置通话模式
* <pre>
* 必须在加入通话前设置,开始通话后设置无效,结束通话后保留之前的设置。
* </pre>
* @param {number} profile 场景模式
* <pre>
* - 通话场景(0)
* - 直播推流场景(1)
* </pre>
* @returns {number}
* <pre>
* - 0:方法调用成功。
* - 其他:方法调用失败。
* </pre>
*/
setChannelProfile(profile) {
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, !#$%&()+-:;≤.,>? @[]^_{|}~”
* @param {number} uid 用户 ID。
* @returns {number}
* <pre>
* - 0:方法调用成功。
* - 其他:方法调用失败。
* </pre>
*/
joinChannel(token, channelName, uid) {
return this.nertcEngine.joinChannel(token, channelName, uid);
}
/**
* 加入频道。如果频道还未创建,会自动尝试创建频道。
* @since V5.4.0
* <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, !#$%&()+-:;≤.,>? @[]^_{|}~”
* @param {number} uid 用户 ID。
* @param {object} channelOptions 加入音视频房间时的一些可选信息。
* @param {string} channelOptions.custom_info 自定义信息,最长支持 127 个字符。
* @param {string} channelOptions.permission_key 权限密钥。能控制通话时长及媒体权限能力。
* @returns {number}
* <pre>
* - 0:方法调用成功。
* - 其他:方法调用失败。
* </pre>
*/
joinChannelWithOptions(token, channelName, uid, channelOptions) {
return this.nertcEngine.joinChannelWithOptions(token, channelName, uid, channelOptions);
}
/**
* 离开频道。
* <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() {
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) {
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) {
var _a;
const mgr = renderer_1.RendererManager.getInstance();
if (canvas.view) {
mgr.bind('local', 'main', canvas.view, { scalingMode: (_a = canvas.mode) !== null && _a !== void 0 ? _a : 0 });
return this.bindLocalCanvasKey('local');
}
else {
mgr.unbind('local', 'main');
return this.unbindLocalCanvasKey('local');
}
}
/**
* 设置远端用户视图。
* <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, canvas) {
var _a;
const mgr = renderer_1.RendererManager.getInstance();
if (canvas.view) {
const mirrorEnabled = canvas.mirror_mode === defs_1.NERtcVideoMirrorMode.kNERtcVideoMirrorModeEnabled;
mgr.bind(uid, 'main', canvas.view, { scalingMode: (_a = canvas.mode) !== null && _a !== void 0 ? _a : 0, mirrorEnabled });
return this.nertcEngine.setupVideoCanvas(uid, true);
}
else {
mgr.unbind(uid, 'main');
return this.nertcEngine.setupVideoCanvas(uid, false);
}
}
/**
* 设置远端用户指定视频通道的画布。
* @param uid 远端用户 ID
* @param canvas 视频画布信息(无 view 表示解绑)
* @param streamType 视频流类型
*/
setupRemoteVideoStreamCanvas(uid, canvas, streamType) {
var _a;
const streamName = streamTypeToName(streamType);
console.log(`[SDK-TS] setupRemoteVideoStreamCanvas uid=${uid} streamType=${streamType}(${streamName}) view=${!!canvas.view}`);
const mgr = renderer_1.RendererManager.getInstance();
if (canvas.view) {
const mirrorEnabled = canvas.mirror_mode === defs_1.NERtcVideoMirrorMode.kNERtcVideoMirrorModeEnabled;
mgr.bind(uid, streamName, canvas.view, { scalingMode: (_a = canvas.mode) !== null && _a !== void 0 ? _a : 0, mirrorEnabled });
return this.nertcEngine.setupRemoteVideoStreamCanvas(uid, true, streamType);
}
else {
mgr.unbind(uid, streamName);
return this.nertcEngine.setupRemoteVideoStreamCanvas(uid, false, streamType);
}
}
setupLocalVideoStreamCanvas(canvas, streamType) {
var _a;
console.log(`[SDK-TS] setupLocalVideoStreamCanvas streamType=${streamType} view=${!!canvas.view}`);
if (streamType === defs_1.NERtcVideoStreamType.kNERtcVideoStreamMain) {
return this.setupLocalVideoCanvas(canvas);
}
if (streamType === defs_1.NERtcVideoStreamType.kNERtcVideoStreamSub) {
return this.setupLocalSubStreamVideoCanvas(canvas);
}
const streamName = streamTypeToName(streamType);
const mgr = renderer_1.RendererManager.getInstance();
if (canvas.view) {
mgr.bind('local', streamName, canvas.view, { scalingMode: (_a = canvas.mode) !== null && _a !== void 0 ? _a : 0 });
return this.nertcEngine.setupRemoteVideoStreamCanvas('local', true, streamType);
}
mgr.unbind('local', streamName);
return this.nertcEngine.setupRemoteVideoStreamCanvas('local', false, streamType);
}
/**
* 在指定用户的画布上截图。
* @param {'local'|number} uid 指定用户的 uid,其中在本地用户画布上截图时,此参数为 local。
* @param {NERtcVideoStreamType} streamType 视频流类型。
* <pre>
* - 0:视频流主流。
* - 1:视频流辅流。
* - 2:视频流第三流。
* - 3:视频流第四流。
* </pre>
* @returns string 返回 base64 截图数据。
*/
captureImageByUid(uid, streamType = defs_1.NERtcVideoStreamType.kNERtcVideoStreamMain) {
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) {
return this.nertcEngine.enableLocalVideo(enabled);
}
enableLocalVideoWithType(arg1, arg2) {
const streamType = typeof arg1 === 'number' ? arg1 : arg2;
const enabled = typeof arg1 === 'number' ? arg2 : arg1;
return this.nertcEngine.enableLocalVideoWithType(streamType, 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, type, subscribe) {
return this.nertcEngine.subscribeRemoteVideoStream(uid, type, subscribe);
}
subscribeRemoteVideoStreamEx(uid, streamType, subscribeType, subscribe) {
return this.nertcEngine.subscribeRemoteVideoStreamEx(uid, streamType, subscribeType, subscribe);
}
/**
* 获取当前网络状态。
* @returns {number}
* <pre>
* - 1 没加入频道。
* - 2 正在加入频道。
* - 3 加入频道成功。
* - 4 正在尝试重新加入频道。
* - 5 加入频道失败。
* </pre>
*/
getConnectionState() {
return this.nertcEngine.getConnectionState();
}
/**
* 开关本地音频发送。该方法用于允许/禁止往网络发送本地音频流。
* <pre>
* 该方法不影响录音状态,因为并没有禁用录音设备。
* </pre>
* @param {boolean} mute 静音/取消静音:
* <pre>
* - true: 静音本地音频
* - false: 取消静音本地音频(默认)
* </pre>
* @returns {number}
* <pre>
* - 0:方法调用成功。
* - 其他:方法调用失败。
* </pre>
*/
muteLocalAudioStream(enabled) {
return this.nertcEngine.muteLocalAudioStream(enabled);
}
/**
* 开启或关闭音频辅流。
* @since V5.4.0
* <pre>
* 开启时远端会收到 onUserSubStreamAudioStart,关闭时远端会收到 onUserSubStreamAudioStop。
* <b>NOTE:</b>
* - 该方法设置内部引擎为启用状态,在{@link NERtcEngine#leaveChannel}后仍然有效。
* </pre>
* @param {boolean} enabled 是否开启音频辅流:
* <pre>
* - true:开启音频辅流。
* - false:关闭音频辅流。
* </pre>
* @returns {number}
* <pre>
* - 0:方法调用成功。
* - 其他:方法调用失败。
* </pre>
*/
enableLocalSubStreamAudio(enabled) {
return this.nertcEngine.enableLocalSubStreamAudio(enabled);
}
/**
* 静音或解除静音本地上行的音频辅流。
* @since V5.4.0
* <pre>
* <b>NOTE:</b>
* - 静音状态会在通话结束后被重置为非静音。
* - 该方法仅可在加入房间后调用。
* </pre>
* @param {boolean} mute 是否静音本地音频辅流发送。
* <pre>
* - true:静音本地音频辅流(默认)。
* - false:取消静音本地音频辅流。
* </pre>
* @returns {number}
* <pre>
* - 0:方法调用成功。
* - 其他:方法调用失败。
* </pre>
*/
muteLocalSubStreamAudio(enabled) {
return this.nertcEngine.muteLocalSubStreamAudio(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, scenario) {
return this.nertcEngine.setAudioProfile(profile, scenario);
}
/**
* 设置音频应用场景。
* @since V5.5.40
* @param {NERtcAudioScenarioType} scenario 音频应用场景。
* @returns {number}
* <pre>
* - 0:方法调用成功。
* - 其他:方法调用失败。
* </pre>
*/
setAudioScenario(scenario) {
return this.nertcEngine.setAudioScenario(scenario);
}
/**
* 设置 AI 降噪模式。
* @param {number} mode AINS 模式。
* @returns {number}
* <pre>
* - 0:方法调用成功。
* - 其他:方法调用失败。
* </pre>
*/
setAINSMode(mode) {
return this.nertcEngine.setAINSMode(mode);
}
/**
* 订阅/取消订阅指定音频主流。
* @param {number} uid 指定用户的 ID
* @param {boolean} subscribe
* <pre>
* - true:订阅指定音频主流(默认)。
* - false:取消订阅指定音频主流。
* </pre>
* @returns {number}
* <pre>
* - 0:方法调用成功。
* - 其他:方法调用失败。
* </pre>
*/
subscribeRemoteAudioStream(uid, enabled) {
return this.nertcEngine.subscribeRemoteAudioStream(uid, enabled);
}
/**
* 订阅/取消订阅指定音频辅流
* @since V5.4.0
* @param {number} uid 指定用户的 ID
* @param {boolean} subscribe
* <pre>
* - true:订阅指定音频辅流(默认)。
* - false:取消订阅指定音频辅流。
* </pre>
* @returns {number}
* <pre>
* - 0:方法调用成功。
* - 其他:方法调用失败。
* </pre>
*/
subscribeRemoteSubStreamAudio(uid, subscribe) {
return this.nertcEngine.subscribeRemoteSubStreamAudio(uid, subscribe);
}
/**
* 取消或恢复订阅所有远端用户的音频主流。
* @since V5.4.0
* <pre>
* 加入房间时,默认订阅所有远端用户的音频主流。
* <b>NOTE:</b>
* - 设置该方法的 subscribe 参数为 true 后,对后续加入房间的用户同样生效。
* - 在开启自动订阅(默认)时,设置该方法的 subscribe 参数为 false 可以实现取消订阅所有远端用户的音频流,但此时无法再调用{@link NERtcEngine#subscribeRemoteAudioStream}方法单独订阅指定远端用户的音频流。
* </pre>
* @param {boolean} subscribe
* <pre>
* - true:订阅所有远端用户的音频主流。
* - false:取消订阅所有远端用户的音频主流。
* </pre>
* @returns {number}
* <pre>
* - 0:方法调用成功。
* - 其他:方法调用失败。
* </pre>
*/
subscribeAllRemoteAudioStream(subscribe) {
return this.nertcEngine.subscribeAllRemoteAudioStream(subscribe);
}
/**
* 设置自己的音频只能被房间内指定的人订阅。
* @since V5.4.0
* <pre>
* 默认房间所有其他人都可以订阅自己的音频。
* <b>NOTE:</b>
* - 此接口需要在加入房间成功后调用。
* - 对于调用接口时不在房间的 uid 不生效。
* </pre>
* @param {Array<number>} uids 用户 ID 数组
* @param {number} size 数组长度
* @returns {number}
* <pre>
* - 0:方法调用成功。
* - 其他:方法调用失败。
* </pre>
*/
setAudioSubscribeOnlyBy(uids) {
const list = Array.isArray(uids) ? uids : [];
return this.nertcEngine.setAudioSubscribeOnlyBy(list, list.length);
}
/**
* 注册解码前媒体数据观测器。
* @since V4.6.29
* <pre>
* 通过此接口可以设置解码前媒体数据观测器,监听解码前媒体数据。
* </pre>
* @param {function} observer 观测器回调函数。如果不传或传null/undefined,则取消注册。
* @returns {number}
* <pre>
* - 0:方法调用成功。
* - 其他:方法调用失败。
* </pre>
*/
/**
* 您可以调用该方法指定只订阅的音频流。
* <pre>
* - 此接口需要在加入房间成功后调用。
* - 对于调用接口时不在房间的 uid 不生效。
* </pre>
* @param {Array<number>} uids 只订阅此用户 uid 列表 的音频.此列表为全量列表。如果列表为空或 null,取消订阅白名单。例如:[uid1,uid2...]。
* @param {number} size 数组长度
* @returns {number}
* <pre>
* - 0:方法调用成功。
* - 其他:方法调用失败。
* </pre>
*/
setSubscribeAudioAllowlist(uids) {
const list = Array.isArray(uids) ? uids : [];
return this.nertcEngine.setSubscribeAudioAllowlist(list, list.length);
}
/**
* 您可以调用该方法指定不订阅的音频流。
* <pre>
* - 此接口需要在加入房间成功后调用。
* - 对于调用接口时不在房间的 uid 不生效。
* </pre>
* @param {number} audioStreamType 音频流类型。
* <pre>
* - 0: 主流
* - 1: 辅流
* </pre>
* @param {Array<number>} uids 只订阅此用户 uid 列表 的音频.此列表为全量列表。如果列表为空或 null,取消订阅白名单。例如:[uid1,uid2...]。
* @param {number} size 数组长度
* @returns {number}
* <pre>
* - 0:方法调用成功。
* - 其他:方法调用失败。
* </pre>
*/
setSubscribeAudioBlocklist(audioStreamType, uids) {
const list = Array.isArray(uids) ? uids : [];
return this.nertcEngine.setSubscribeAudioBlocklist(audioStreamType, list, list.length);
}
/**
* 开启精准对齐。
* @since V5.4.0
* <pre>
* 通过此接口可以实现精准对齐功能,对齐本地系统与服务端的时间。
* <b>NOTE:</b>
* - 请在引擎初始化之后调用此接口,且该方法仅可在加入房间前调用。
* - 适用于 KTV 实时合唱的场景。
* </pre>
* @param {number} property 是否开启精准对齐功能:
* <pre>
* - 1:开启精准对齐功能。
* - 0:关闭精准对齐功能。
* </pre>
* @returns {number}
* <pre>
* - 0:方法调用成功。
* - 其他:方法调用失败。
* </pre>
*/
setStreamAlignmentProperty(property) {
return this.nertcEngine.setStreamAlignmentProperty(property);
}
/**
* 获取本地系统时间与服务端时间差值。
* @since V5.4.0
* <pre>
* 可以用于做时间对齐,通过 (毫秒级系统时间 - offset) 可能得到当前服务端时间。
* </pre>
* @returns {number}
* <pre>
* - 本地与服务端时间差值,单位为毫秒(ms)。如果没有成功加入音视频房间,返回 0。
* </pre>
*/
getNtpTimeOffset() {
return this.nertcEngine.getNtpTimeOffset();
}
/**
* 设置本地摄像头的视频主流采集配置。
* @since V5.4.0
* <pre>
* 通过此接口可以设置本地摄像头采集的主流视频宽度、高度、旋转角度等。
* <b>NOTE:</b>
* - 纯音频 SDK 禁用该接口。
* - 该方法仅适用于视频主流。
* - 该方法支持在加入房间后动态调用,设置成功后,会自动重启摄像头采集模块。
* - 若系统相机不支持您设置的分辨率,会自动调整为最相近一档的分辨率,因此建议您设置为常规标准的分辨率。
* - 设置较高的采集分辨率会增加性能消耗,例如 CPU 和内存占用等,尤其是在开启视频前处理的场景下。
* </pre>
* @param {object} config 摄像头采集配置:
* @param {number} config.captureWidth 本地采集的视频宽度,单位为 px。
* @param {number} config.captureHeight 本地采集的视频高度,单位为 px。
* @returns {number}
* <pre>
* - 0:方法调用成功。
* - 其他:方法调用失败。
* </pre>
*/
setCameraCaptureConfig(config) {
return this.nertcEngine.setCameraCaptureConfig(config);
}
/**
* 设置本地摄像头的视频主流或辅流采集配置。
* @since V5.4.0
* <pre>
* 通过此接口可以设置本地摄像头采集的主流或辅流视频宽度、高度、旋转角度等。
* <b>NOTE:</b>
* - 纯音频 SDK 禁用该接口。
* - 调用该接口设置成功后,会自动重启摄像头采集模块。
* </pre>
* @param {NERtcVideoStreamType} streamType 视频通道类型。
* <pre>
* - 0:主流。
* - 1:辅流。
* - 2:第三流。
* - 3:第四流。
* </pre>
* @param {object} config 摄像头采集配置:
* @param {number} config.captureWidth 本地采集的视频宽度,单位为 px。
* @param {number} config.captureHeight 本地采集的视频高度,单位为 px。
* @returns {number}
* <pre>
* - 0:方法调用成功。
* - 其他:方法调用失败。
* </pre>
*/
setCameraCaptureConfigWithType(config, streamType) {
return this.nertcEngine.setCameraCaptureConfigWithType(config, streamType);
}
/**
* 设置视频配置。
* <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>
* @param {number} config.mirror_mode 设置本地视频编码的镜像模式,即本地发送视频的镜像模式,只影响远端用户看到的视频画面:
* <pre>
* - 0 Windows/macOS SDK 启用镜像模式。在 iOS/Android 平台中:如果您使用前置摄像头,SDK 默认启用镜像模式;如果您使用后置摄像头,SDK 默认关闭镜像模式。
* - 1 启用镜像模式。
* - 2 清晰度优先
* - 3 关闭镜像模式(默认)。
* </pre>
* @param {number} config.orientation_mode 编码策略:
* <pre>
* - 0 该模式下 SDK 输出的视频方向与采集到的视频方向一致。接收端会根据收到的视频旋转信息对视频进行旋转(默认)。
* - 1 该模式下 SDK 固定输出横屏模式的视频。如果采集到的视频是竖屏模式,则视频编码器会对其进行裁剪。
* - 2 该模式下 SDK 固定输出竖屏模式的视频,如果采集到的视频是横屏模式,则视频编码器会对其进行裁剪。
* </pre>
* @returns {number}
* <pre>
* - 0:方法调用成功。
* - 其他:方法调用失败。
* </pre>
*/
setVideoConfig(config) {
return this.nertcEngine.setVideoConfig(config);
}
setVideoConfigWithType(arg1, arg2) {
const streamType = typeof arg1 === 'number' ? arg1 : arg2;
const config = typeof arg1 === 'number' ? arg2 : arg1;
return this.nertcEngine.setVideoConfigWithType(streamType, config);
}
/**
* 设置视频双流发送。
* <pre>
* 调用该方法控制是否支持发送双流,只对摄像头数据生效,自定义输入、取屏等无效。设置后,会在摄像头重启后生效。
* </pre>
* @param {boolean} enable
* <pre>
* - true: 双流发送(默认)
* - false: 只发送一个流
* </pre>
* @returns {number}
* <pre>
* - 0:方法调用成功。
* - 其他:方法调用失败。
* </pre>
*/
enableDualStreamMode(enabled) {
return this.nertcEngine.enableDualStreamMode(enabled);
}
/**
* 设置视频流的模式。
* <pre>
* 通过本接口可以实现设置视频流的模式:单流、双流或者三流。
* 发送端开启多流模式后,接收端可以选择接收对应的流。
* 其中,大流指高分辨率、高码率的视频流,中流指标清分辨率、中码率的视频流,小流指低分辨率、低码率的视频流。
* </pre>
* @param {NERtcVideoStreamLayerCount} layerCount 视频流模式:
* <pre>
* - kNERtcVideoStreamLayerCountOne:开启单流模式。
* - kNERtcVideoStreamLayerCountTwo:开启双流模式。
* - kNERtcVideoStreamLayerCountThree:开启三流模式。
* </pre>
* @returns {number}
* <pre>
* - 0:方法调用成功。
* - 其他:方法调用失败。
* </pre>
*/
setVideoStreamLayerCount(layerCount) {
return this.nertcEngine.setVideoStreamLayerCount(layerCount);
}
/**
* 设置本地辅流视图。
* <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) {
var _a;
const mgr = renderer_1.RendererManager.getInstance();
if (canvas.view) {
mgr.bind('local', 'sub', canvas.view, { scalingMode: (_a = canvas.mode) !== null && _a !== void 0 ? _a : 0 });
return this.nertcEngine.setupSubStreamVideoCanvas('local', true);
}
else {
mgr.unbind('local', 'sub');
return this.nertcEngine.setupSubStreamVideoCanvas('local', 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, mode) {
if (this.renderers.has(String(uid))) {
let renderer = this.renderers.get(String(uid));
renderer.setContentMode(mode);
if (typeof renderer.refreshCanvas === 'function') {
renderer.refreshCanvas();
}
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, mode) {
if (this.substreamRenderers.has(String(uid))) {
let renderer = this.substreamRenderers.get(String(uid));
renderer.setContentMode(mode);
if (typeof renderer.refreshCanvas === 'function') {
renderer.refreshCanvas();
}
return 0;
}
else {
return -1;
}
}
setLocalRenderMode(scaling_mode, stream_type = defs_1.NERtcVideoStreamType.kNERtcVideoStreamMain) {
const streamName = streamTypeToName(stream_type);
renderer_1.RendererManager.getInstance().setScalingMode('local', streamName, scaling_mode);
return 0;
}
setRemoteRenderMode(uid, scaling_mode, stream_type = defs_1.NERtcVideoStreamType.kNERtcVideoStreamMain) {
const streamName = streamTypeToName(stream_type);
renderer_1.RendererManager.getInstance().setScalingMode(uid, streamName, scaling_mode);
return 0;
}
/**
* 设置远端视频的本地显示镜像模式。
* <pre>
* 仅影响本地用户看到的远端画面(JS 渲染层 CSS transform),不影响远端发送的视频内容。
* 可在 setupRemoteVideoCanvas 之后随时调用,立即生效。
* </pre>
* @param {number} uid 远端用户 UID
* @param {NERtcVideoMirrorMode} mirror_mode 镜像模式:0=Auto(禁用), 1=Enabled, 2=Disabled
* @param {NERtcVideoStreamType} stream_type 视频流类型,默认主流
* @returns {number} 0:成功;-1:渲染器未绑定(需先 setupRemoteVideoCanvas)
*/
setRemoteVideoMirrorMode(uid, mirror_mode, stream_type = defs_1.NERtcVideoStreamType.kNERtcVideoStreamMain) {
const streamName = streamTypeToName(stream_type);
const mgr = renderer_1.RendererManager.getInstance();
if (!mgr.hasRenderer(uid, streamName))
return -1;
const enabled = mirror_mode === defs_1.NERtcVideoMirrorMode.kNERtcVideoMirrorModeEnabled;
mgr.setMirrorMode(uid, streamName, enabled);
return 0;
}
/**
* 设置本地视频画布背景色(letterbox 区域颜色)。
* <pre>
* 设置视频未填满画布时的背景色,仅影响本地显示,不影响远端用户所见。
* 该方法可在 setupLocalVideoCanvas 之后随时调用,立即生效。
* </pre>
* @param {NERtcVideoStreamType} stream_type 视频流类型(主流/辅流/第三流/第四流)
* @param {string} color CSS 颜色字符串,例如 '#000000'、'black'、'rgb(26,39,68)'
* @returns {number} 0:成功;-1:渲染器未绑定(需先 setupLocalVideoCanvas)
*/
setLocalVideoBackgroundColor(stream_type = defs_1.NERtcVideoStreamType.kNERtcVideoStreamMain, color) {
const streamName = streamTypeToName(stream_type);
const mgr = renderer_1.RendererManager.getInstance();
if (!mgr.hasRenderer('local', streamName))
return -1;
mgr.setBackgroundColor('local', streamName, color);
return 0;
}
/**
* 设置远端视频画布背景色(letterbox 区域颜色)。
* <pre>
* 设置视频未填满画布时的背景色,仅影响本地显示,不影响发送端。
* 该方法可在 setupRemoteVideoCanvas 之后随时调用,立即生效。
* </pre>
* @param {number} uid 远端用户 UID
* @param {NERtcVideoStreamType} stream_type 视频流类型
* @param {string} color CSS 颜色字符串
* @returns {number} 0:成功;-1:渲染器未绑定
*/
setRemoteVideoBackgroundColor(uid, stream_type = defs_1.NERtcVideoStreamType.kNERtcVideoStreamMain, color) {
const streamName = streamTypeToName(stream_type);
const mgr = renderer_1.RendererManager.getInstance();
if (!mgr.hasRenderer(uid, streamName))
return -1;
mgr.setBackgroundColor(uid, streamName, color);
return 0;
}
/**
* 设置本地视频镜像模式。
* <pre>
* 该方法设置本地视频镜像模式。App 可以多次调用此方法更改镜像模式。
* </pre>
* @param {number} mode 视频镜像模式:
* <pre>
* - 0 默认关闭镜像模式。
* - 1 启用镜像模式。
* - 2 关闭镜像模式。
* </pre>
* @returns {number}
* <pre>
* - 0:方法调用成功。
* - 其他:方法调用失败。
* </pre>
*/
setLocalVideoMirrorMode(mode) {
const ret = this.nertcEngine.setLocalVideoMirrorMode(mode);
// 同步更新 JS 渲染层 forceMirror,确保本地预览镜像即时生效
const mgr = renderer_1.RendererManager.getInstance();
const enabled = mode === defs_1.NERtcVideoMirrorMode.kNERtcVideoMirrorModeEnabled;
if (mgr.hasRenderer('local', 'main')) {
mgr.setMirrorMode('local', 'main', enabled);
}
return ret;
}
/**
* 设置本地视频镜像模式。
* @since V5.4.0
* <pre>
* 通过此接口可以设置本地视频是否开启镜像模式,即画面是否左右翻转。
* <b>NOTE:</b>
* - 纯音频 SDK 禁用该接口
* - 本地视频画布的镜像模式仅影响本地用户所见,不影响远端用户所见。您的应用层可以多次调用此方法更改镜像模式。
* </pre>
* @param {number} streamType 视频通道类型。
* <pre>
* - 0:主流。
* - 1:辅流。
* - 2:第三流。
* - 3:第四流。
* </pre>
* @param {number} mode 视频镜像模式:
* <pre>
* - 0 Windows/macOS SDK 启用镜像模式。
* - 1 启用镜像模式。
* - 2 (默认)关闭镜像模式。
* </pre>
* @returns {number}
* <pre>
* - 0:方法调用成功。
* - 其他:方法调用失败。
* </pre>
*/
setLocalVideoMirrorModeWithType(streamType, mode) {
const ret = this.nertcEngine.setLocalVideoMirrorModeWithType(streamType, mode);
// 同步更新 JS 渲染层 forceMirror,确保本地预览镜像即时生效
const mgr = renderer_1.RendererManager.getInstance();
const streamName = streamTypeToName(streamType);
const enabled = mode === defs_1.NERtcVideoMirrorMode.kNERtcVideoMirrorModeEnabled;
if (mgr.hasRenderer('local', streamName)) {
mgr.setMirrorMode('local', streamName, enabled);
}
return ret;
}
/**
* 设置远端用户辅流视图。
* <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, canvas) {
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, sub) {
return this.nertcEngine.subscribeRemoteVideoSubStream(uid, sub);
}
/**
* 开启视频预览。
* <pre>
* 该方法用于在进入频道前启动本地视频预览。调用该 API 前,必须:
* - 调用 {@link NERtcEngine#setupLocalVideoCanvas} 设置预览窗口;
* - 调用 {@link NERtcEngine#setVideoDevice} 前必须先设置设备 ID;
* <b>NOTE:</b> 启用了本地视频预览后,在进入频道前,本地预览必须先关闭,需要调用 {@link NERtcEngine#stopVideoPreview}。
* </pre>
* @returns {number}
* <pre>
* - 0:方法调用成功。
* - 其他:方法调用失败。
* </pre>
*/
startVideoPreview() {
return this.nertcEngine.startVideoPreview();
}
/**
* 开启视频预览。
* @since V5.4.0
* <pre>
* 该方法用于在进入频道前启动本地视频预览。调用该 API 前,必须:
* - 调用 {@link NERtcEngine#setupLocalVideoCanvas} 设置预览窗口;
* - 调用 {@link NERtcEngine#setVideoDevice} 前必须先设置设备 ID;
* <b>NOTE:</b> 启用了本地视频预览后,在进入频道前,本地预览必须先关闭,需要调用 {@link NERtcEngine#stopVideoPreview}。
* </pre>
* @param {number} streamType 视频通道类型。
* <pre>
* - 0:主流。
* - 1:辅流。
* - 2:第三流。
* - 3:第四流。
* </pre>
* @returns {number}
* <pre>
* - 0:方法调用成功。
* - 其他:方法调用失败。
* </pre>
*/
startVideoPreviewWithType(streamType) {
return this.nertcEngine.startVideoPreviewWithType(streamType);
}
/**
* 停止视频预览。
* <pre>
* 通过此接口可以实现在预览本地视频后关闭预览。
* </pre>
* @returns {number}
* <pre>
* - 0:方法调用成功。
* - 其他:方法调用失败。
* </pre>
*/
stopVideoPreview() {
return this.nertcEngine.stopVideoPreview();
}
/**
* 停止视频预览。
* <pre>
* 通过此接口可以实现在预览本地视频后关闭预览。
* </pre>
* @param {number} streamType 视频通道类型。
* <pre>
* - 0:主流。
* - 1:辅流。
* - 2:第三流。
* - 3:第四流。
* </pre>
* @returns {number}
* <pre>
* - 0:方法调用成功。
* - 其他:方法调用失败。
* </pre>
*/
stopVideoPreviewWithType(streamType) {
return this.nertcEngine.stopVideoPreviewWithType(streamType);
}
/**
* 开关本地视频发送。
* <pre>
* 调用该方法禁视频流时,SDK 不再发送本地视频流,但摄像头仍然处于工作状态。相比于 {@link NERtcEngine#enableLocalVideo} (false) 用于控制本地视频流发送的方法,该方法响应速度更快。该方法不影响本地视频流获取,没有禁用摄像头。
* </pre>
* @param {boolean} mute
* <pre>
* - true: 不发送本地视频流
* - false: 发送本地视频流(默认)
* </pre>
* @returns {number}
* <pre>
* - 0:方法调用成功。
* - 其他:方法调用失败。
* </pre>
*/
muteLocalVideoStream(enabled) {
return this.nertcEngine.muteLocalVideoStream(enabled);
}
/**
* 开关本地视频发送。
* <pre>
* 调用该方法禁视频流时,SDK 不再发送本地视频流,但摄像头仍然处于工作状态。相比于 {@link NERtcEngine#enableLocalVideo} (false) 用于控制本地视频流发送的方法,该方法响应速度更快。该方法不影响本地视频流获取,没有禁用摄像头。
* </pre>
* @param {number} streamType 视频通道类型。
* <pre>
* - 0:视频主流。
* - 1:视频辅流。
* - 2:视频第三流。
* - 3:视频第四流。
* </pre>
* @param {boolean} mute
* <pre>
* - true: 不发送本地视频流
* - false: 发送本地视频流(默认)
* </pre>
* @returns {number}
* <pre>
* - 0:方法调用成功。
* - 其他:方法调用失败。
* </pre>
*/
muteLocalVideoStreamWithType(streamType, enabled) {
return this.nertcEngine.muteLocalVideoStreamWithType(streamType, 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) {
return this.nertcEngine.setParameters(parameters);
}
/**
* 以 String 的形式获取一些内部参数。
* @since V5.3.0
* <pre>
* <b>NOTE:</b>
* - 此接口为隐藏接口,需要特定参数及特定时机,详情请 [提交工单](https://app.yunxin.163.com/global/service/ticket/create) 联系网易云信技术支持工程师。
* - 请在初始化后调用该方法,且该方法在加入房间前后均可调用。
* </pre>
* @param {string} parameters 音视频通话的参数集合.
* @param {string} extra_info 额外的信息。
* @returns {string} 内部参数信息。
*/
getParameters(parameters) {
return this.nertcEngine.getParameters(parameters);
}
/**
* 设置采集的音频格式。
* @since V5.4.0
* <pre>
* <b>NOTE:</b>
* - 请在初始化后调用该方法,且该方法在加入房间前后均可调用。
* - 适用于需要监听音频 PCM 采集数据回调并指定回调的数据格式的场景。
* - 若您希望使用音频的原始格式,format 参数传 NULL 即可。
* - 当前 Electron SDK 的音频帧回调为只读模式,mode 参数暂不生效。
* </pre>
* @param {object} format 音频帧请求格式
* @param {number} format.channels 音频声道数量:
* <pre>
* - 1 单声道
* - 2 双声道
* </pre>
* @param {number} format.sample_rate 采样率。
* @param {number} format.mode 读写模式(当前版本仅支持只读):
* <pre>
* 0 返回数据只读模式
* 1 返回数据可读写(当前版本暂不支持)
* </pre>
* @returns {number}
* <pre>
* - 0:方法调用成功。
* - 其他:方法调用失败。
* </pre>
*/
setRecordingAudioFrameParameters(format) {
return this.nertcEngine.setRecordingAudioFrameParameters(format);
}
/**
* 设置音频播放回调的声音格式。
* @since V5.4.0
* <pre>
* <b>NOTE:</b>
* - 请在初始化后调用该方法,且该方法仅可在加入房间后调用。
* - 适用于需要自行对待播放的声音进行二次处理的场景。
* - 当前 Electron SDK 的音频帧回调为只读模式,mode 参数暂不生效。
* </pre>
* @param {object} format 音频帧请求格式
* @param {number} format.channels 音频声道数量:
* <pre>
* - 1 单声道
* - 2 双声道
* </pre>
* @param {number} format.sample_rate 采样率。
* @param {number} format.mode 读写模式(当前版本仅支持只读):
* <pre>
* 0 返回数据只读模式
* 1 返回数据可读写(当前版本暂不支持)
* </pre>
* @returns {number}
* <pre>
* - 0:方法调用成功。
* - 其他:方法调用失败。
* </pre>
*/
setPlaybackAudioFrameParameters(format) {
return this.nertcEngine.setPlaybackAudioFrameParameters(format);
}
/**
* 设置 onPlaybackAudioFrameBeforeMixing 回调的声音格式。
* @since V5.6.30
* @param {object|null} format 音频帧请求格式。允许传入 null,表示使用音频的原始格式。
* @returns {number}
*/
setPlaybackAudioFrameBeforeMixingParameters(format) {
return this.nertcEngine.setPlaybackAudioFrameBeforeMixingParameters(format);
}
/**
* 设置采集和播放声音混音后的音频数据采样率。
* @since V5.4.0
* <pre>
* 通过本接口可以实现设置 onMixedAudioFrame 回调的混音音频采样率
* <b>NOTE:</b>
* - 请在初始化后调用该方法,且该方法在加入房间前后均可调用。
* - 适用于需要获取本地用户和远端所有用户的声音的场景,比如通话录音的场景。
* - 该方法设置内部引擎为启用状态,在离开房间后设置会重置为默认状态。
* - 未调用该接口设置返回的音频数据格式时,回调中的采样率取默认值。
* </pre>
* @param {number} sample_rate 采样率。
* @returns {number}
* <pre>
* - 0:方法调用成功。
* - 其他:方法调用失败。
* </pre>
*/
setMixedAudioFrameParameters(sample_rate) {
return this.nertcEngine.setMixedAudioFrameParameters(sample_rate);
}
/**
* 开启音频 dump。
* @returns {number}
* <pre>
* - 0:方法调用成功。
* - 其他:方法调用失败。
* </pre>
*/
startAudioDump() {
return this.nertcEngine.startAudioDump();
}
/**
* 开启音频 dump。
* @since V5.4.0
* @param {number} type 音频 dump 类型。
* <pre>
* - 0:仅输出.dump 文件(默认)。
* - 1:输出.dump 和.wav 文件。
* - 2: 仅输出.wav 文件.
* </pre>
* @returns {number}
* <pre>
* - 0:方法调用成功。
* - 其他:方法调用失败。
* </pre>
*/
startAudioDumpWithType(type) {
return this.nertcEngine.startAudioDumpWithType(type);
}
/**
* 结束音频 dump。
* @returns {number}
* <pre>
* - 0:方法调用成功。
* - 其他:方法调用失败。
* </pre>
*/
stopAudioDump() {
return this.nertcEngine.stopAudioDump();
}
/**
* 设置视频 dump 类型。
* @param {number} type 视频 dump 类型。
* @returns {number}
* <pre>
* - 0:方法调用成功。
* - 其他:方法调用失败。
* </pre>
*/
setVideoDump(type) {
return this.nertcEngine.setVideoDump(type);
}
/**
* 添加本地录制流任务。
* @since V5.6.40
* <pre>
* 请在引擎初始化后调用本方法。
* </pre>
* @param {NERtcLocalRecordingConfig} config 录制配置,详见 {@link NERtcLocalRecordingConfig}
* @param {string} taskId 录制任务 ID
* @returns {number}
* <pre>
* - 0:方法调用成功。
* - 其他:方法调用失败。
* </pre>
*/
addLocalRecorderStreamForTask(config, taskId) {
return this.nertcEngine.addLocalRecorderStreamForTask(config, taskId);
}
/**
* 移除本地录制流任务。
* @since V5.6.40
* @param {string} taskId 录制任务 ID
* @returns {number}
* <pre>
* - 0:方法调用成功。
* - 其他:方法调用失败。
* </pre>
*/
removeLocalRecorderStreamForTask(taskId) {
return this.nertcEngine.removeLocalRecorderStreamForTask(taskId);
}
/**
* 添加指定用户的指定流的录制流布局。
* @since V5.6.40
* @param {NERtcLocalRecordingLayoutConfig} config 录制流布局配置
* @param {string} uid 用户 ID
* @param {NERtcVideoStreamType} streamType 流类型
* @param {number} streamLayer 流的录制混流层级
* @param {string} taskId 录制任务 ID
* @returns {number}
* <pre>
* - 0:方法调用成功。
* - 其他:方法调用失败。
* </pre>
*/
addLocalRecorderStreamLayoutForTask(config, uid, streamType, streamLayer, taskId) {
return this.nertcEngine.addLocalRecorderStreamLayoutForTask(config, uid, streamType, streamLayer, taskId);
}
/**
* 移除指定用户的指定流的录制流布局。
* @since V5.6.40
* @param {string} uid 用户 ID
* @param {NERtcVideoStreamType} streamType 流类型
* @param {number} streamLayer 流的录制混流层级
* @param {string} taskId 录制任务 ID
* @returns {number}
* <pre>
* - 0:方法调用成功。
* - 其他:方法调用失败。
* </pre>
*/
removeLocalRecorderStreamLayoutForTask(uid, streamType, streamLayer, taskId) {
return this.nertcEngine.removeLocalRecorderStreamLayoutForTask(uid, streamType, streamLayer, taskId);
}
/**
* 更新录制流布局。
* @since V5.6.40
* @param {Array<NERtcLocalRecordingStreamInfo>} infos 录制流布局配置数组
* @param {string} taskId 录制任务 ID
* @returns {number}
* <pre>
* - 0:方法调用成功。
* - 其他:方法调用失败。
* </pre>
*/
updateLocalRecorderStreamLayoutForTask(infos, taskId) {
return this.nertcEngine.updateLocalRecorderStreamLayoutForTask(infos, taskId);
}
/**
* 替换录制流布局。
* @since V5.6.40
* @param {Array<NERtcLocalRecordingStreamInfo>} infos 录制流布局配置数组
* @param {string} taskId 录制任务 ID
* @returns {number}
* <pre>
* - 0:方法调用成功。
* - 其他:方法调用失败。
* </pre>
*/
replaceLocalRecorderStreamLayoutForTask(infos, taskId) {
return this.nertcEngine.replaceLocalRecorderStreamLayoutForTask(infos, taskId);
}
/**