const WebGlRender = require("./WebGlRender.js");
const napi_addon = require("bindings")("chuangRtcKitdll");
const EventEmitter = require('./EventEmitter.js');
import {ChuangUserRole,ChuangPublishChannel,ChuangVideoBufferType,ChuangStreamRotation,ChuangVideoConfig,ChuangStreamConfig,ChuangCustomAudioCaptureConfig,
ChuangVideoFrameParam,ChuangVideoEncodedFrameParam,ChuangVideoCanvas,ChuangCustomAudioRenderConfig,ChuangCustomVideoRenderConfig,ChuangMixStreamWatermark,
ChuangMixStreamInfo,ChuangMixStreamConfig,ChuangNetworkSpeedTestConfig,eventtype} from './doc.js';
var emitter = new EventEmitter();
var ispushExternalRendering = false;
var isplayExternalRendering = false;
var glRenders = {};
var streamRgbdatas = {};
function onRenderCallback(stream, data, dataLength, ChuangVideoFrameParam) {
//console.log("on render callback: " + ChuangVideoFrameParam[0].width + ", " + ChuangVideoFrameParam[0].height);
if (!streamRgbdatas[stream]) {
streamRgbdatas[stream] = {
width: ChuangVideoFrameParam[0].width,
height: ChuangVideoFrameParam[0].height,
rgbData: Buffer.alloc(ChuangVideoFrameParam[0].width * ChuangVideoFrameParam[0].height * 4, "binary")
}
}
var _srgbdata = streamRgbdatas[stream];
if (ChuangVideoFrameParam[0].width != _srgbdata.width || ChuangVideoFrameParam[0].height != _srgbdata.height) {
_srgbdata.width = ChuangVideoFrameParam[0].width;
_srgbdata.height = ChuangVideoFrameParam[0].height;
_srgbdata.rgbData = Buffer.alloc(ChuangVideoFrameParam[0].width * ChuangVideoFrameParam[0].height * 4, "binary");
}
data.copy(_srgbdata.rgbData, 0);
glRenders[stream].draw(_srgbdata.rgbData, _srgbdata.width, _srgbdata.height);
if(isplayExternalRendering)
emitter.emit('play', stream, _srgbdata.width, _srgbdata.height,_srgbdata.rgbData );
}
function onPublishRenderCallback(channel, data, dataLength, ChuangVideoFrameParam) {
//console.log("onPublishRenderCallback: " + ChuangVideoFrameParam[0].width + ", " + ChuangVideoFrameParam[0].height);
if (!streamRgbdatas[channel]) {
streamRgbdatas[channel] = {
width: ChuangVideoFrameParam[0].width,
height: ChuangVideoFrameParam[0].height,
rgbData: Buffer.alloc(ChuangVideoFrameParam[0].width * ChuangVideoFrameParam[0].height * 4, "binary")
}
}
var _srgbdata = streamRgbdatas[channel];
if (ChuangVideoFrameParam[0].width != _srgbdata.width || ChuangVideoFrameParam[0].height != _srgbdata.height || ChuangVideoFrameParam[0].width * ChuangVideoFrameParam[0].height < _srgbdata.width * _srgbdata.height) {
_srgbdata.width = ChuangVideoFrameParam[0].width;
_srgbdata.height = ChuangVideoFrameParam[0].height;
_srgbdata.rgbData = Buffer.alloc(ChuangVideoFrameParam[0].width * ChuangVideoFrameParam[0].height * 4, "binary");
}
data.copy(_srgbdata.rgbData, 0);
glRenders[channel].draw(_srgbdata.rgbData, _srgbdata.width, _srgbdata.height);
if(ispushExternalRendering)
emitter.emit('push', channel, _srgbdata.width,_srgbdata.height,_srgbdata.rgbData );
}
var ChuangLogLevel = {
LOG_VERBOSE: 0,
LOG_DEBUG: 1,
LOG_INFO: 2,
LOG_WARN: 3,
LOG_ERROR: 4,
LOG_NONE: 5
};
/**
* @description ChuangLiveEngine
* @example let ChuangLiveEngine = new ChuangLiveEngine();
* @class
*/
class ChuangLiveEngine {
constructor() { }
/**
* @description 初始化Engine
* @param {string}appId
* @param {string}appKey
* @returns ChuangLiveEngine 实例
*/
initEngine(appId, appKey) {
return napi_addon.initEngine(appId, appKey);
}
/**
* @description 释放Engine
* @returns void
*/
uninitEngine() {
napi_addon.uninitEngine();
}
/**
* @description 设置日志记录级别 sdk会记录所有日志级别大于设置级别的日志
* @param {string}ChuangLogLevel
* @returns void
*/
setLogLevel(ChuangLogLevel) {
napi_addon.setLogLevel(ChuangLogLevel);
}
/**
* @description 设置日志文件分块大小, 单位KB, 取值范围为 [0, 10240], 当设置值为0时,sdk会关闭日志记录功能, 默认为1024KB
* @param {int}fileSizeInKB
* @returns void
*/
setLogFileSize(fileSizeInKB) {
napi_addon.setLogFileSize(fileSizeInKB);
}
/**
* @description 设置日志路径
* @param {string}filePath
* @returns void
*/
setLogFilePath(filePath) {
napi_addon.setLogFilePath(filePath);
}
/**
* @description 获取版本号
* @returns string
*/
getSDKVersion() {
return napi_addon.getSDKVersion();
}
/**
* @description 获取摄像头列表
* @returns Array
*/
getVideoDeviceName() {
return napi_addon.getVideoDeviceName();
}
/**
* @description 获取麦克风列表
* @returns Array
*/
getAudioDeviceName() {
return napi_addon.getAudioDeviceName();
}
/**
* @description 切换摄像头
* @param {string}cameraName 摄像头名称
* @param {ChuangPublishChannel}channel 流通道
* @returns bool
*/
switchCamera(cameraName, channel) {
return napi_addon.switchCamera(cameraName, channel);
}
/**
* 设置回调事件
* @return void
*/
setEventHandler() {
return napi_addon.setEventHandler();
}
/**
* 登录房间
* @param {string} roomId: 登录房间名
* @param {string} userId: 登录用户名
* @param ChuangUserRole: 登录角色
* @return int 函数调用结果
*/
loginRoom(roomId, userId, ChuangUserRole) {
napi_addon.setCustomVideoRenderHandler();
napi_addon.registerRemoteVideoFrameRawDataCallback(onRenderCallback);
napi_addon.enableCustomRemoteVideoRender(true, 1, 4, false);
napi_addon.registerLocalVideoFrameRawDataCallback(onPublishRenderCallback);
napi_addon.enableCustomLocalVideoRender(true, 1, 4, false);
return napi_addon.loginRoom(roomId, userId, ChuangUserRole);
}
/**
* 获取当前房间连接状态
* @return ChuangRoomState 当前房间连接状态
*/
getRoomConnectState() {
return napi_addon.getRoomConnectState();
}
/**
* 退出房间
* @return void
*/
logoutRoom() {
return napi_addon.logoutRoom();
}
// /**
// * 设置预览
// * @param ChuangVideoCanvas: canvas
// * @param {ChuangPublishChannel}channel 流通道
// * @return int 函数调用结果
// */
// setPreviewCanvas(canvas, channel) {
// return napi_addon.setPreviewCanvas(canvas, channel);
// }
// /**
// * 开启预览
// * @param ChuangPublishChannel channel: 通道
// * @return int 函数调用结果
// */
// startPreview(channel) {
// return napi_addon.startPreview(channel);
// }
// /**
// * 停止预览
// * @param ChuangPublishChannel channel: 通道
// * @return void
// */
// stopPreview(channel) {
// napi_addon.stopPreview(channel);
// }
/**
* @description ChuangAudioConfig 音频配置信息
* @property {int} profileId 音频级别
* @property {string} szAudioDev: 麦克风名称
* @property {int} useLoopBack: 是否采集loopback
*/
/**
* 设置音频配置
* @param ChuangAudioConfig config: 音频配置
* @param ChuangPublishChannel channel: 流通道
* @return int 函数调用结果返回
*/
setAudioConfig(config, channel) {
return napi_addon.setAudioConfig(config.profileId, config.szAudioDev, config.useLoopBack, channel);
}
/**
* @description ChuangVideoConfig 视频配置信息
* @property {int} captureWidth 采集宽
* @property {int} captureHeight 采集高
* @property {int} encodeWidth 推流编码宽
* @property {int} encodeHeight 推流编码高
* @property {int} fps 帧率
* @property {int} bitrateKbps 码率
* @property {int} renderMode 采集数据宽高与推流数据宽高不等时的裁剪模式
* @property {string} szCameraName: 摄像头名称
*/
/**
* 设置视频配置
* @param ChuangVideoConfig config: 视频配置
* @param ChuangPublishChannel channel: 流通道
* @return int 函数调用结果返回
*/
setVideoConfig(config, channel) {
return napi_addon.setVideoConfig(config.captureWidth,
config.captureHeight,
config.encodeWidth,
config.encodeHeight,
config.fps,
config.bitrateKbps,
config.renderMode,
config.szCameraName,
channel);
}
/**
* 获取视频配置
* @param ChuangPublishChannel channel: 流通道
* @return ChuangVideoConfig
*/
getVideoConfig(channel) {
return napi_addon.getVideoConfig(channel);
}
/**
* @description ChuangStreamConfig 视频配置信息
* @property {string} streamID: 推流流名
* @property {string} rtmpAddress: rtmp完整推流地址
* @property {int} streamMode 推流类型
*/
/**
* 开始推流
* @param ChuangStreamConfig config: 推流配置
* @param HTMLElement canvas: 渲染的view
* @param ChuangPublishChannel channel: 流通道
* @return int 函数调用结果返回
*/
startPublishStream(config, canvas, channel) {
const renderView2 = document.getElementById(canvas);
if (!glRenders[channel]) {
glRenders[channel] = new WebGlRender();
glRenders[channel].init(renderView2);
}
return napi_addon.startPublishStream(config.streamId, config.rtmpAddress, config.streamMode, channel);
}
/**
* 停止推流
* @param ChuangPublishChannel channel: 流通道
* @return void
*/
stopPublishStream(channel) {
napi_addon.stopPublishStream(channel);
}
/**
* @description ChuangCustomAudioCaptureConfig 视频配置信息
* @property {int} sampleRate: 采样率
* @property {int} channel: 声道数
*/
/**
* 音频自定义采集开关及参数设置
* @param {bool} enable
* @param {ChuangCustomAudioCaptureConfig} config 音频参数
* @param {ChuangPublishChannel} channel: 流通道
* @return int 函数调用结果返回
*/
enableCustomAudioCapture(enable, config, channel) {
napi_addon.enableCustomAudioCapture(enable, config.sampleRate, config.channel, channel);
}
/**
* 向sdk发送音频数据
* @param {uint8Array}data 音频数据
* @param {int}length 长度
* @param {ChuangPublishChannel} channel: 流通道
* @return int 函数调用结果返回
*/
sendCustomAudioCapturePCMData(data, length, channel) {
napi_addon.sendCustomAudioCapturePCMData(data, length, channel);
}
/**
* 视频自定义采集开关及参数设置
* @param {bool} true or false
* @param {ChuangVideoBufferType} type 视频自采集格式
* @param {ChuangPublishChannel} channel: 流通道
* @return int 函数调用结果返回
*/
enableCustomVideoCapture(enable, type, channel) {
return napi_addon.enableCustomVideoCapture(enable, type, channel);
}
/**
* 设置视频自定义采集接口回调
* @return int 函数调用结果返回
*/
setCustomVideoCaptureHandler() {
return napi_addon.setCustomVideoCaptureHandler();
}
/**
* @description ChuangVideoFrameParam 视频帧参数
* @property {ChuangVideoPixelType} type: 视频像素存储类型
* @property {int} width: 宽
* @property {int} height: 高
* @property {ChuangStreamRotation} rotation: 旋转角度
*/
/**
* 向sdk发送视频帧数据
* @param {uint8Array}data 视频数据
* @param {ChuangVideoFrameParam} param 视频帧参数
* @param long referenceTimeMillisecond 时间戳
* @param ChuangPublishChannel channel: 流通道
* @return int 函数调用结果
*/
sendCustomVideoCaptureRawData(data, dataLength, param, referenceTimeMillisecond, channel) {
return napi_addon.sendCustomVideoCaptureRawData(data, dataLength, param.type, param.width, param.height, param.rotation, referenceTimeMillisecond, channel);
}
/**
* @description ChuangVideoEncodedFrameParam 视频帧参数
* @property {bool} isKeyFrame: 是否关键帧
* @property {int} width: 宽
* @property {int} height: 高
* @property {ChuangStreamRotation} rotation: 旋转角度
*/
/**
* 向sdk发送h264数据
* @param {uint8Array} data h264数据
* @param {ChuangVideoEncodedFrameParam} param 视频参数
* @param {long} referenceTimeMillisecond 时间戳
* @param {ChuangPublishChannel} channel: 流通道
* @return int 函数调用结果返回
*/
sendCustomVideoCaptureEncodedData(data, dataLength, param, referenceTimeMillisecond, channel) {
return napi_addon.sendCustomVideoCaptureEncodedData(data, dataLength, param.isKeyFrame, param.width, param.height, param.rotation, referenceTimeMillisecond, channel);
}
/**
* 开/关回声消除
* @param {bool} enable
* @return void
*/
enableAEC(enable) {
napi_addon.enableAEC();
}
/**
* 开/关噪声抑制
* @param {bool} enable
* @return void
*/
enableANS(enable) {
napi_addon.enableANS();
}
/**
* 开/关自动增益
* @param {bool} enable
* @return void
*/
enableAGC(enable) {
napi_addon.enableAGC();
}
/**
* 开启音频混音
* @param {bool} enable
* @param {ChuangPublishChannel} channel 流通道
* @return int 函数调用结果返回
*/
enableAudioMixing(enable, channel) {
return napi_addon.enableAudioMixing(enable, channel);
}
/**
* 设置音频混音回调
* @return int 函数调用结果返回
*/
setAudioMixingHandler() {
return napi_addon.setAudioMixingHandler();
}
/**
* @description ChuangVideoCanvas 绘制窗口信息
* @property {HTMLElement} canvas: canvas
* @property {int} renderMode: 填充模式
* @property {int} mirrorMode: 镜像
*/
/**
* 开始拉流
* @param {string}} roomId 房间号
* @param {string}} streamId 流ID
* @param {ChuangVideoCanvas} videoCanvas 绘制窗口信息
* @return void
*/
startPlayStream(roomId, streamId, videoCanvas) {
const canvas = document.getElementById(videoCanvas.canvas);
glRenders[streamId] = new WebGlRender();
glRenders[streamId].init(canvas);
let ret = napi_addon.startPlayStream(roomId, streamId, videoCanvas.renderMode, videoCanvas.mirrorMode);
return ret;
}
/**
* 停止拉流
* @param {string} streamId 流ID
* @return void
*/
stopPlayStream(streamId) {
napi_addon.stopPlayStream(streamId);
}
/**
* @description ChuangCustomAudioRenderConfig 音频配置
* @property {int} sampleRate: 采样率
* @property {int} channel: 声道数
*/
/**
* 开/关外部音频渲染
* @param bool enable
* @param {ChuangCustomAudioRenderConfig} config 音频配置
* @return int 函数调用结果返回
*/
enableCustomAudioRender(enable, config) {
return napi_addon.enableCustomAudioRender(enable.config.sampleRate, config.channel);
}
/**
* 从sdk获取一部分音频数据
* @param {uint8Array} data 音频数据存放
* @param {int} dataLength 数据长度
* @return int 函数调用结果返回
*/
fetchCustomAudioRenderPCMData(data, dataLength) {
return napi_addon.fetchCustomAudioRenderPCMData(data, dataLength);
}
/**
* @description ChuangCustomVideoRenderConfig 视频配置
* @property {ChuangVideoBufferType} type: 视频数据格式类型
* @property {ChuangVideoPixelType} format: 视频像素存储类型
* @property {bool} enableEngineRender: 是否SDK渲染
*/
/**
* 开/关远端流外部视频渲染
* @param bool enable
* @param ChuangPublishChannel channel 流通道
* @return int 函数调用结果返回
*/
enableCustomRemoteVideoRender(enable) {
isplayExternalRendering = true;
}
// /**
// * 设置外部渲染视频接口句柄
// * @return void
// */
// setCustomVideoRenderHandler() {
// //napi_addon.setCustomVideoRenderHandler();
// }
/**
* 开启本地流外部渲染
* @param bool
* @return void
*/
// ChuangCustomVideoRenderConfig config配置
enableCustomLocalVideoRender(enable) {
ispushExternalRendering = enable;
}
/**
* 发送推流消息
* @param {string} streamId 流ID
* @param {string} msg 消息内容
* @return int 函数调用结果返回
*/
sendStreamAttachedMessage(streamId, msg) {
return napi_addon.sendStreamAttachedMessage(streamId, msg);
}
/**
* 开启流音量大小回调
* @return void
*/
startSoundLevelMonitor() {
napi_addon.startSoundLevelMonitor();
}
/**
* 关闭流音量大小回调
* @return void
*/
stopSoundLevelMonitor() {
napi_addon.stopSoundLevelMonitor();
}
/**
* 设置回调间隔,单位毫秒
* @param {int} intervalMs 时间间隔 默认200
* @return int 函数调用结果返回
*/
setSoundLevelMonitorInterval(intervalMs) {
return napi_addon.setSoundLevelMonitorInterval(intervalMs);
}
/**
* 本地流静音音频
* @param {string} streamId 流ID
* @param {bool} mute 是否静音
* @return int 函数调用结果返回
*/
muteLocalAudio(streamId, mute) {
return napi_addon.muteLocalAudio(streamId, mute);
}
/**
* 远端流静音音频
* @param {string} streamId 流ID
* @param bool mute 是否静音
* @return int
*/
muteRemoteAudio(streamId, mute) {
return napi_addon.muteRemoteAudio(streamId, mute);
}
/**
* 本地流静音视频
* @param {string} streamId 流ID
* @param bool mute 是否静音
* @return int
*/
muteLocalVideo(streamId, mute) {
return napi_addon.muteLocalVideo(streamId, mute);
}
/**
* 远端流静音视频
* @param {string} streamId 流ID
* @param bool mute 是否静音
* @return int
*/
muteRemoteVideo(streamId, mute) {
return napi_addon.muteRemoteVideo(streamId, mute);
}
/**
* @description ChuangMixStreamWatermark 混流水印信息
* @property {string} image: 水印图片id
* @property {int} left: 混流画布中水印左上角x坐标
* @property {int} top: 混流画布中水印左上角y坐标
* @property {int} right 混流画布中水印右下角x坐标
* @property {int} bottom 混流画布中水印右下角y坐标
*/
/**
* @description ChuangMixStreamInfo 混流单个流的信息
* @property {string} streamId 流ID
* @property {int} width: 流宽
* @property {int} height: 流高
* @property {int} zlevel 流所处层
* @property {int} mixVideo 是否混当前流
* @property {int} srcRect.left 视频源 左
* @property {int} srcRect.top 视频源 上
* @property {int} srcRect.right 视频源 右
* @property {int} srcRect.bottom 视频源 下
* @property {int} dstRect.left 视频显示 左
* @property {int} dstRect.top 视频显示 上
* @property {int} dstRect.right 视频显示 右
* @property {int} dstRect.bottom 视频显示 下
* @property {ChuangVideoRenderMode} renderMode 填充模式
* @property {ChuangStreamRotation} rotation 流方向类型
*/
/**
* @description ChuangMixStreamConfig 混流信息
* @property {string} target rtmp完整混流地址
* @property {int} width: 流宽
* @property {int} height: 流高
* @property {int} videoBitrateKbps 码率
* @property {string} backgroundImage 混流背景图id
* @property {bool} noticeStream 是否将该混流通知给房间内其他用户
* @property {int} nInputStreamCount: 混流总数
* @property {ChuangMixStreamWatermark} watermark 混流水印信息
* @property {ChuangMixStreamInfo} mixStreams: 混流流信息(数组)
*/
/**
* 开启混流
* @param {ChuangMixStreamConfig} config 混流配置
* @return int 函数调用结果返回
*/
startMixStream(config) {
var str = '';
for (var index = 0; index < config.mixStreams.length; index++) {
str += (config.mixStreams[index].streamId + ',' +
config.mixStreams[index].width + ',' +
config.mixStreams[index].height + ',' +
config.mixStreams[index].zlevel + ',' +
config.mixStreams[index].mixVideo + ',' +
config.mixStreams[index].srcRect.left + ',' +
config.mixStreams[index].srcRect.top + ',' +
config.mixStreams[index].srcRect.right + ',' +
config.mixStreams[index].srcRect.bottom + ',' +
config.mixStreams[index].dstRect.left + ',' +
config.mixStreams[index].dstRect.top + ',' +
config.mixStreams[index].dstRect.right + ',' +
config.mixStreams[index].dstRect.bottom + ',' +
config.mixStreams[index].renderMode + ',' +
config.mixStreams[index].rotation + ',');
}
let ret = napi_addon.startMixStream(config.target,
config.width,
config.height,
config.videoBitrateKbps,
config.backgroundImage,
config.noticeStream,
config.nInputStreamCount,
config.watermark.image,
config.watermark.left,
config.watermark.top,
config.watermark.right,
config.watermark.bottom,
str);
return ret;
}
/**
* 停止混流
* @return void
*/
stopMixStream() {
napi_addon.stopMixStream();
}
/**
* @description ChuangNetworkSpeedTestConfig 网络测速配置
* @property {bool} testUpLink 是否测试上行连接
* @property {int} expectedUpLinkBitrateKbps: 上行连接测速码率,单位Kbps (10Kbps~10000Kbps)
* @property {bool} testDownLink: 是否测试下行连接
* @property {int} exceptedDownLinkBitrateKbps 下行连接测速码率,单位Kbps (10Kbps~10000Kbps)
*/
/**
* 开始网络测速
* @param {ChuangNetworkSpeedTestConfig} config 网络测速配置
* @return int 函数调用结果返回
*/
startNetworkSpeedTest(config) {
return napi_addon.startNetworkSpeedTest(config);
}
/**
*
* 停止网络测速
* @return void
*/
stopNetworkSpeedTest() {
napi_addon.stopNetworkSpeedTest();
}
/**
* @description 注册SDK回调事件
* @param {eventtype}eventtype 事件
* @param {function}callback 回调:不同事件回调时的参数不同
*/
static on(eventtype, callback) {
switch (eventtype) {
case 'onRoomStateUpdate':
napi_addon.registerRoomStateUpdateCallback(callback);
break;
case 'onRoomStreamUpdate':
napi_addon.registerRoomStreamUpdateCallback(callback);
break;
case 'onPublishStreamStateUpdate':
napi_addon.registerPublishStreamStateUpdateCallback(callback);
break;
case 'onPublishStreamVideoSizeChanged':
napi_addon.registerPublishStreamVideoSizeChangedCallback(callback);
break;
case 'onPublishStreamQualityUpdate':
napi_addon.registerPublishStreamQualityUpdateCallback(callback);
break;
case 'onCaptureSoundLevelUpdate':
napi_addon.registerCaptureSoundLevelUpdateCallback(callback);
break;
case 'onPlayStreamQualityUpdate':
napi_addon.registerPlayStreamQualityUpdateCallback(callback);
break;
case 'onPlayStreamStateUpdate':
napi_addon.registerPlayStreamStateUpdateCallback(callback);
break;
case 'onRemoteSoundLevelUpdate':
napi_addon.registerRemoteSoundLevelUpdateCallback(callback);
break;
case 'onPlayStreamEvent':
napi_addon.registerPlayStreamEventCallback(callback);
break;
case 'onPlayStreamFirstAudio':
napi_addon.registerPlayStreamFirstAudioCallback(callback);
break;
case 'onPlayStreamFirstVideo':
napi_addon.registerPlayStreamFirstVideoCallback(callback);
break;
case 'onPlayStreamStateChanged':
napi_addon.registerPlayStreamStateChangedCallback(callback);
break;
case 'onPlayStreamVideoSizeChanged':
napi_addon.registerPlayStreamVideoSizeChangedCallback(callback);
break;
case 'onPlayStreamVideoRotationChanged':
napi_addon.registerPlayStreamVideoRotationChangedCallback(callback);
break;
case 'onReceiveStreamAttchedMessage':
napi_addon.registerReceiveStreamAttchedMessageCallback(callback);
break;
case 'onNetworkSpeedTestQualityUpdate':
napi_addon.registerNetworkSpeedTestQualityUpdateCallback(callback);
break;
case 'onNetworkTypeChanged':
napi_addon.registerNetworkTypeChangedCallback(callback);
break;
case 'onFirstLocalAudioFramePublished':
napi_addon.registerFirstLocalAudioFramePublishedCallback(callback);
break;
case 'onFirstLocalVideoFramePublished':
napi_addon.registerFirstLocalVideoFramePublishedCallback(callback);
break;
case 'onPlayStreamFirstAudioDecoded':
napi_addon.registerPlayStreamFirstAudioDecodedCallback(callback);
break;
case 'onAudioRouteChange':
napi_addon.registerAudioRouteChangeCallback(callback);
break;
case 'onStart':
napi_addon.registerStartCallback(callback);
case 'onStop':
napi_addon.registerStopCallback(callback);
break;
case 'onEncodedDataTrafficControl':
napi_addon.registerEncodedDataTrafficControlCallback(callback);
break;
case 'onVideoNeedKeyFrame':
napi_addon.registerVideoNeedKeyFrameCallback(callback);
break;
case 'onRemoteVideoFrameRawData':
emitter.on('play', function(channel, data, dataLength, ChuangVideoFrameParam) {
callback(channel, data, dataLength, ChuangVideoFrameParam);
})
break;
// case 'onRemoteVideoFrameEncodedData':
// napi_addon.registerRemoteVideoFrameEncodedDataCallback(callback);
// break;
case 'onLocalVideoFrameRawData':
emitter.on('push', function(channel, data, dataLength, ChuangVideoFrameParam) {
callback(channel, data, dataLength, ChuangVideoFrameParam);
})
break;
case 'onMixStreamResult':
napi_addon.registerMixStreamResultCallback(callback);
break;
case 'onAudioMixingCopyData':
napi_addon.registerAudioMixingCopyDataCallback(callback);
break;
default:
break;
}
}
}
module.exports = ChuangLiveEngine;