Source: NvStreamingSdk.js

/**
* @overview SDK WEB应用JS文档
* @version 3.4.0
* @copyright 北京美摄网络科技有限公司
*/


/**
* @classdesc 事件发射器
*/
class NvsEventEmitter {
	
/**
* @constructor
*/

    constructor() {
        this.store = {}
    }


/**
* @description 绑定
*/

    on(key, fn) {
        if (this.store[key]) {
            this.store[key].push(fn)
        } else {
            this.store[key] = [fn]
        }
    }


/**
* @description 触发
*/

    emit(key, ...args) {
        if (!this.store[key]) {
            return
        }
        while (this.store[key].length > 0) {
            let fn = this.store[key][0]
            fn(...args)
            this.off(key, fn)
        }
    }


/**
* @description 解绑
*/

    off(key, fn) {
        if (!this.store[key]) {
            return
        }
        const idx = this.store[key].findIndex(i => i === fn)
        if (idx === -1) {
            return
        }
        this.store[key].splice(idx, 1)
    }
}


/**
* @description 视频特效常量
*/
const NvsStreamingSdkFuncVideoFx = 'videoFx';

/**
* @description 动画贴纸
*/
const NvsStreamingSdkFuncAnimatedSticker = 'animatedSticker';

/**
* @description 音乐
*/
const NvsStreamingSdkFuncMusic = 'music';

/**
* @description 字幕
*/
const NvsStreamingSdkFuncCaption = 'caption';

/**
* @description 视频特效扩展
*/
const NvsStreamingSdkFuncVideoFxExtension = 'videoFxExtension';

/**
* @description 视频转场
*/
const NvsStreamingSdkFuncVideoTransition = 'videoTransition';

/**
* @description 主题
*/
const NvsStreamingSdkFuncTheme = 'theme';

/**
* @description 粒子视频特效
*/
const NvsStreamingSdkFuncParticleVideoFx = 'particleVideoFx';

/**
* @description 模板
*/
const NvsStreamingSdkFuncTemplate = 'template';

/**
* @description 使用模板
*/
const NvsStreamingSdkFuncUseTemplate = 'useTemplate';

/**
* @description 视频转场扩展
*/
const NvsStreamingSdkFuncVideoTransitionExtension = 'videoTransitionExtension';

/**
* @description 改变速度
*/
const NvsStreamingSdkFuncChangeSpeed = 'changeSpeed';

/**
* @description 片段分割
*/
const NvsStreamingSdkFuncClipSplit = 'clipSplit';

/**
* @description 视频颜色调整
*/
const NvsStreamingSdkFuncVideoColorAdjust = 'videoColorAdjust';

/**
* @description 字幕风格设置
*/
const NvsStreamingSdkFuncCaptionStyleSetting = 'captionStyleSetting';

/**
* @description 事件发射器对象
*/
const nvsEventEmitter = new NvsEventEmitter();

/**
* @description 流媒体引擎状态停止
*/
const streamingEngineStateStopped = 'streamingEngineStateStopped';


/**
* @classdesc SDK版本号
*/
class NvsSdkVersion {
	
/**
* @constructor
* @param {Number} majorVersion 主版本号
* @param {Number} minorVersion 次版本号
* @param {Number} revisionNumber 序号
*/
    constructor(majorVersion, minorVersion, revisionNumber) {
        this.majorVersion = majorVersion;
        this.minorVersion = minorVersion;
        this.revisionNumber = revisionNumber;
    }
}


/**
* @classdesc 比例值
*/
class NvsRational {
/**
* @constructor
* @param {Number} numerator 分子
* @param {Number} denominator 分母
*/
    constructor(numerator, denominator) {
        this.num = numerator;
        this.den = denominator;
    }
}


/**
* @classdesc 视频分辨率
*/
class NvsVideoResolution {
/**
* @constructor
* @param {Number} imageWidth 宽度
* @param {Number} imageHeight 高度
*/
    constructor(imageWidth, imageHeight) {
        this.imageWidth = imageWidth;
        this.imageHeight = imageHeight;
    }
}


/**
* @classdesc 音频分辨率
*/
class NvsAudioResolution {
/**
* @constructor
* @param {Number} sampleRate 采样率
* @param {Number} channelCount 通道数
*/

    constructor(sampleRate, channelCount) {
        this.sampleRate = sampleRate;
        this.channelCount = channelCount;
    }
}

/**
* @description 浏览窗口填充模式枚举
*/
const NvsLiveWindowFillModeEnum = Object.freeze({
    "PreserveAspectCrop" : 0,
    "PreserveAspectFit" : 1,
    "Stretch" : 2});



/**
* @classdesc 视频预览窗口
*/
class NvsLiveWindow {

/**
* @constructor
*/
    constructor() {
        this.internalLiveWindow = 0;
    }


/**
* @description 设置填充模式
* @param {Number} fillMode 填充模式
* @return {Void} 
*/
    setFillMode(fillMode) {
        Module.nvs_liveWindow_setFillMode(this.internalLiveWindow, fillMode);
    }


/**
* @description 获取填充模式
* @return {Number} 填充模式
*/
    getFillMode() {
        return Module.nvs_liveWindow_getFillMode(this.internalLiveWindow);
    }


/**
* @description 时间线坐标转换成视图坐标
* @param {NvsPointF} ptCanonical 时间线坐标
* @return {NvsPointF} 视图坐标 
*/
    mapCanonicalToView(ptCanonical) {
        return Module.nvs_liveWindow_mapCanonicalToView(this.internalLiveWindow, ptCanonical);
    }


/**
* @description 视图坐标转换成时间线坐标
* @param {NvsPointF} ptView 视图坐标
* @return {NvsPointF} 时间线坐标
*/
    mapViewToCanonical(ptView) {
        return Module.nvs_liveWindow_mapViewToCanonical(this.internalLiveWindow, ptView);
    }


/**
* @description 归一化坐标转换成视图坐标
* @param {NvsPointF} ptNormalized 归一化坐标
* @return {NvsPointF} 视图坐标
*/
    mapNormalizedToView(ptNormalized) {
        return Module.nvs_liveWindow_mapNormalizedToView(this.internalLiveWindow, ptNormalized);
    }


/**
* @description 视图坐标转换成归一化坐标
* @param {NvsPointF} 视图坐标
* @return {NvsPointF} 归一化坐标
*/
    mapViewToNormalized(ptView) {
        return Module.nvs_liveWindow_mapViewToNormalized(this.internalLiveWindow, ptView);
    }


/**
* @description 设置背景颜色
* @param {NvsColor} color 背景颜色 
* @return {Void} 无返回值
*/
    setBackgroundColor(color) {
        Module.nvs_liveWindow_setBackgroundColor(this.internalLiveWindow, color);
    }
}


/**
* @description 视频预览大小模式枚举
*/
const NvsVideoPreviewSizeModeEnum = Object.freeze({
    "FullSize" : 0,
    "LiveWindowSize" : 1});


/**
* @description 搜索标志枚举
*/
const NvsSeekFlagEnum = Object.freeze({
    "ShowCaptionPoster" : 2,
    "ShowAnimatedStickerPoster" : 4,
    "BuddyHostVideoFrame" : 16,
    "WebReaderPrefetchForSeek" : 32});


/**
* @description 播放标记枚举
*/
const NvsPlaybackFlagEnum = Object.freeze({
    "LowPipelineSize" : 8,
    "DisableFixedPrerollTime" : 16,
    "BuddyHostVideoFrame" : 32});


/**
* @description 流媒体引擎状态枚举
*/
const NvsStreamingEngineStateEnum = Object.freeze({
    "StreamingEngineStateStopped" : 0,
    "StreamingEngineStatePlayback" : 3,
    "StreamingEngineStateSeeking" : 4,
    "StreamingEngineStateCompile" : 5});


/**
* @description 资源包类型枚举
*/
const NvsAssetPackageTypeEnum = Object.freeze({
    "VideoFx" : 0,
    "VideoTransition" : 1,
    "CaptionStyle" : 2,
    "AnimatedSticker" : 3,
    "Theme" : 4,
    "CaptureScene" : 5,
    "ARScene" : 6,
    "CompoundCaption" : 7,
    "CaptionContext" : 8,
    "CaptionRenderer" : 9,
    "CaptionAnimation" : 10,
    "CaptionInAnimation" : 11,
    "CaptionOutAnimation" : 12,
    "Template" : 13});


/**
* @description 资源包状态枚举
*/
const NvsAssetPackageStatusEnum = Object.freeze({
    "NotInstalled" : 0,
    "Installing" : 1,
    "Ready" : 2,
    "Upgrading" : 3});



/**
* @description 轨道类型枚举
*/
const NvsTrackTypeEnum = Object.freeze({
  "Video" : 0,
  "Audio" : 1});


/**
* @description 片段类型枚举
*/
const NvsClipTypeEnum = Object.freeze({
    "Video" : 0,
    "Audio" : 1});


/**
* @description 视频片段类型枚举
*/
const NvsVideoClipTypeEnum = Object.freeze({
  "AV" : 0,
  "Image" : 1});


/**
* @description 视频片段运动模式枚举
*/
const NvsVideoClipMotionModeEnum = Object.freeze({
  "LetterBoxZoomIn" : 0,
  "LetterBoxZoomOut" : 1,
  "Image_ROI" : 2});


/**
* @description 视频片段扩展旋转枚举
*/
const NvsVideoClipExtraRotationEnum = Object.freeze({
  "Rotation0" : 0,
  "Rotation90" : 1,
  "Rotation180" : 2,
  "Rotation270" : 3});


/**
* @description 视频片段背景模式枚举
*/
const NvsVideoClipBackgroundModeEnum = Object.freeze({
  "ColorSolid" : 0,
  "Blur" : 1});


/**
* @description 片段角色主题枚举
*/
const NvsClipRoleInThemeEnum = Object.freeze({
  "General" : 0,
  "Title" : 1,
  "Trailer" : 2});


/**
* @description 视频特效类型枚举
*/
const NvsVideoFxTypeEnum = Object.freeze({
  "Builtin" : 0,
  "Package" : 1,
  "Custom" : 2});


/**
* @description 视频转场类型枚举
*/
const NvsVideoTransitionTypeEnum = Object.freeze({
  "Builtin" : 0,
  "Package" : 1});


/**
* @description 字幕角色主题枚举
*/
const NvsCaptionRoleInThemeEnum = Object.freeze({
  "General" : 0,
  "Title" : 1,
  "Trailer" : 2});


/**
* @description 字幕文本排列枚举
*/
const NvsCaptionTextAlignmentEnum = Object.freeze({
  "Left" : 0,
  "Center" : 1,
  "Right" : 2});


/**
* @description 字幕文本边界类型枚举
*/
const NvsCaptionTextBoundingTypeEnum = Object.freeze({
  "Text" : 0,
  "TextFrame" : 1,
  "Frame" : 2});


/**
* @description 字幕字符间隔类型枚举
*/
const NvsCaptionLetterSpacingTypeEnum = Object.freeze({
  "Percentage" : 0,
  "Absolute" : 1});


/**
* @description 人体检测功能枚举
*/
const NvsHumanDetectionFeatureEnum = Object.freeze({
  "FaceLandmark" : 1,
  "FaceAction" : 2,
  "AvatarExpression" : 4,
  "VideoMode" : 8,
  "ImageMode" : 16});


/**
* @description 关键帧查询模式枚举
*/
const NvsKeyFrameFindModeEnum = Object.freeze({
  "Before" : 1,
  "After" : 2});



/**
* @description 片段包装模式枚举
*/
const NvsClipWrapModeEnum = Object.freeze({
  "RepeatLastFrame" : 0,
  "RepeatFirstFrame" : 1,
  "Repeat" : 2});


/**
* @description 时间线纵横比枚举
*/
const NvsTimelineAspectRatioEnum = Object.freeze({
    "16v9": 1,
    "1v1": 2,
    "9v16": 4,
    "4v3": 8,
    "3v4": 16,
    "18v9": 32,
    "9v18": 64,
    "21v9": 512,
    "9v21": 1024});



/**
* @description 恢复音频上下文
* @return {Void} 
*/
function nvsResumeAudioContext() {
    // Under some browsers(such as chrome >= 70) The AudioContext was not allowed to start
    // if we don't resume AudioContext after a user gesture on the page.
    // For detailed information please refer to https://developers.google.com/web/updates/2017/09/autoplay-policy-changes#webaudio
    if (typeof(Module['Meishe']) === 'undefined')
        Module['Meishe'] = {};

    var Meishe = Module['Meishe'];
    if (!Meishe.audioContext) {
        if (typeof(AudioContext) !== 'undefined')
            Meishe.audioContext = new AudioContext();
        else if (typeof(webkitAudioContext) !== 'undefined')
            Meishe.audioContext = new webkitAudioContext();
        else
            return;
    }

    var audioCtx = Meishe.audioContext;
    if (audioCtx.state === 'suspended')
        audioCtx.resume();
}



/**
* @description 使用 Promise 恢复 AudioContext
* @return {Void} 
*/
function nvsResumeAudioContextWithPromise() {
    // Under some browsers(such as chrome >= 70) The AudioContext was not allowed to start
    // if we don't resume AudioContext after a user gesture on the page.
    // For detailed information please refer to https://developers.google.com/web/updates/2017/09/autoplay-policy-changes#webaudio
    if (typeof(Module['Meishe']) === 'undefined')
        return Promise.reject(new Error('Module.Meishe is undefined'));

    var Meishe = Module['Meishe'];
    if (!Meishe.audioContext) {
        console.error('Meishe.audioContext is null!');
        return Promise.reject(new Error('Meishe.audioContext is null'));
    }

    if (Meishe.audioContext.state === 'suspended')
        return Meishe.audioContext.resume();
    return Promise.resolve();
}



/**
* @description 获取流媒体上下文实例
* @return {NvsStreamingContext} 流媒体引擎对象 
*/
function nvsGetStreamingContextInstance() {
    return Module.Meishe.streamingContext;
}





/**
* @classdesc 浮点类型数组
*/
// std::vector<float>
class NvsVectorFloat {

/**
* @constructor
*/
    constructor() {
        return new Module.VectorFloat();
    }
}



/**
* @classdesc 对象类型数组
*/
// std::vector<emscripten::val>
class NvsVectorVal {
/**
* @constructor
*/
    constructor() {
        return new Module.VectorVal();
    }
}


/**
* @classdesc AI调色信息
*/
class NvsAIToningInfo {
/**
* @constructor
*/
    constructor() {
        this.exposure = 0;
        this.contrast = 0;
        this.shadow = 0;
        this.highlight = 0;
        this.brightness = 0;
        this.blackpoint = 0;
        this.saturation = 0;
        this.vibrance = 0;
        this.definition = 0;
        this.sharpeness = 0;
    }
}

/**
* @classdesc 流媒体上下文:流媒体上下文类可视作整个SDK框架的入口。开发过程中,NvsStreamingContext提供了静态sharedInstance接口创建流媒体上下文的唯一实例。 通过这个实例对象,我们可以开启采集设备录制视频,添加采集视频特效,设置拍摄时的各项参数,包括自动聚焦,自动曝光调节, 开关换补光灯等。同时还能够创建时间线,并将时间线与实时预览窗口连接起来,实时预览播放已经拍摄完成的视频。整个视频制作完成后,要销毁流媒体上下文的对象实例。 带特效拍摄时,添加素材资源包(采集特效包,场景资源包等),都得先安装,安装成功后获取packageId才能使用,而内建采集特效(builtin)只需获取特效名称即可使用。sdk接口中凡是需要传入资源、授权等文件路径时一定是全路径。
*/
class NvsStreamingContext {

/**
* @constructor
*/
    constructor() {
        this.onWebRequestWaitStatusChange = function(isVideo, waiting) {
        }
        this.onWebRequestAuthFinish = function(success, uuid) {
        }
        this.onPlaybackTimelinePosition = function(timeline, position) {
        }
        this.onPlaybackStopped = function(timeline) {
        }
        this.onPlaybackEOF = function(timeline) {
        }
        this._onStreamingEngineStateChanged = function(state) {
        }
        this.onAudioVUMeter = function(timeline, leftVUValue, rightVUValue, timeStamp) {
        }
        this.onImageGrabbedArrived = function(imageData, time) {
        }
    }

    get onStreamingEngineStateChanged() {
        return (state) => {
            if (state === 0) {
                nvsEventEmitter.emit(streamingEngineStateStopped);
            }
            this._onStreamingEngineStateChanged(state)
        }
    }

    set onStreamingEngineStateChanged(fun) {
        this._onStreamingEngineStateChanged = fun
    }


/**
* @description 流引擎准备好时间线修改
* @return {Promise} Promise
*/
    streamingEngineReadyForTimelineModification() {
        let self = this;
        return new Promise((resolve, reject) => {
            if (Module.Meishe.streamingContext.getStreamingEngineState() === 0)
                resolve();
            else {
              nvsEventEmitter.on(streamingEngineStateStopped, function slot() {
                    resolve();
                });
                self.stop();
            }
        });
    }


/**
* @description 验证SDK许可文件
* @param {} requestUrl 请求url
* @param {} type 类型
* @return {} 
*/
    verifySdkLicenseFile(requestUrl, type = '') {
        return Module.nvs_streamingContext_verifySdkLicenseFile(requestUrl, type);
    }


/**
* @description 使用扩展用户数据验证SDK许可文件
* @param {String} requestUrl 请求的url
* @param {} extraUserData 扩展用户数据
* @return {} 
*/
    verifySdkLicenseFileWithExtraUserData(requestUrl, extraUserData) {
        Module.Meishe.ExtraUserData = extraUserData;
        return Module.nvs_streamingContext_verifySdkLicenseFileWithExtraUserData(requestUrl);
    }


/**
* @description 获取SDK版本号
* @return {NvsSdkVersion} SDK版本号
*/
    getSdkVersion() {
        return Module.nvs_streamingContext_getSdkVersion();
    }


/**
* @description 创建时间线
* @param {} videoRes 视频解析度
* @param {} fps 视频帧率
* @param {} audioRes 音频解析度
* @param {Number} flags 标识
* @return {NvsTimeline} 时间线对象
*/
    createTimeline(videoRes, fps, audioRes, flags = 0) {
        return Module.nvs_streamingContext_createTimeline(videoRes, fps, audioRes, flags);
    }


/**
* @description 根据模板ID,创建模板时间线
* @param {} templateId 模板ID
* @param {} templateFootages 模板素材
* @param {} flags 标识
* @return {NvsTimeline} 时间线对象
*/
    createTemplateTimeline(templateId, templateFootages, flags = 0) {
        return Module.nvs_streamingContext_createTemplateTimeline(templateId, templateFootages, flags);
    }


/**
* @description 创建空模板时间线
* @param {} videoRes 视频解析度
* @param {} fps 视频帧率
* @param {} audioRes 音频解析度 
* @param {} templateId 模板ID
* @param {} flags 标识
* @return {NvsTimeline} 时间线对象
*/
    createEmptyTemplateTimeline(videoRes, fps, audioRes, templateId, flags = 0) {
        return Module.nvs_streamingContext_createEmptyTemplateTimeline(videoRes, fps, audioRes, templateId, flags);
    }


/**
* @description 删除时间线
* @param {} timeline 时间线
* @return {Num} 
*/
    removeTimeline(timeline) {
        return Module.nvs_streamingContext_removeTimeline(timeline);
    }


/**
* @description 根据画板ID,创建流媒体浏览窗口
* @param {} canvasId 画板ID
* @return {Num} 
*/
    createLiveWindow(canvasId) {
        return Module.nvs_streamingContext_createLiveWindow(canvasId);
    }


/**
* @description 删除流媒体浏览窗口
* @param {} liveWindow 流媒体预览窗口
* @return {Num} 
*/
    removeLiveWindow(liveWindow) {
        Module.nvs_streamingContext_removeLiveWindow(liveWindow);
    }


/**
* @description 连接时间线到流媒体窗口
* @param {} timeline 时间线
* @param {} liveWindow 预览窗口
* @return {Num} 
*/
    connectTimelineWithLiveWindow(timeline, liveWindow) {
        return Module.nvs_streamingContext_connectTimelineWithLiveWindow(timeline, liveWindow);
    }


/**
* @description 查找时间线
* @param {} timeline 时间线
* @param {} timestamp 时间戳
* @param {} videoSizeMode 视频大小模式
* @param {} flags 标记
* @return {Num} 
*/
    seekTimeline(timeline, timestamp, videoSizeMode, flags) {
        return Module.nvs_streamingContext_seekTimeline(timeline, timestamp, videoSizeMode, flags);
    }


/**
* @description 播放时间线
* @param {} timeline 时间线
* @param {} startTime 开始时间
* @param {} endTime 结束时间
* @param {} videoSizeMode 视频大小模式
* @param {} preload 预载
* @param {} flags 标识
* @return {Num} 
*/
    playbackTimeline(timeline, startTime, endTime, videoSizeMode, preload, flags) {
        return Module.nvs_streamingContext_playbackTimeline(timeline, startTime, endTime, videoSizeMode, preload, flags);
    }

/**
* @description 使用代理缩放播放时间线
* @param {} timeline 时间线
* @param {} startTime 开始时间
* @param {} endTime 结束时间
* @param {} proxyScale 缩放代理
* @param {} preload 预载
* @param {} flags 标识
* @return {Num} 
*/
    playbackTimelineWithProxyScale(timeline, startTime, endTime, proxyScale, preload, flags) {
        return Module.nvs_streamingContext_playbackTimelineWithProxyScale(timeline, startTime, endTime, proxyScale, preload, flags);
    }


/**
* @description 流媒体上下文停止
* @return {Num} 
*/
    stop() {
        Module.nvs_streamingContext_stop();
    }


/**
* @description 获取当前时间线位置
* @param {} timeline 时间线
* @return {Num} 
*/
    getTimelineCurrentPosition(timeline) {
        return Module.nvs_streamingContext_getTimelineCurrentPosition(timeline);
    }


/**
* @description 获取流媒体引擎状态
* @return {Num} 
*/
    getStreamingEngineState() {
        return Module.nvs_streamingContext_getStreamingEngineState();
    }


/**
* @description 获取资源包管理器
* @return {Num} 
*/
    getAssetPackageManager() {
        return Module.nvs_streamingContext_getAssetPackageManager();
    }


/**
* @description 获取音视频文件信息
* @param {} avFilePath 音视频文件路径
* @param {} extraFlag 扩展标记
* @return {Num} 
*/
    getAVFileInfo(avFilePath, extraFlag) {
        return Module.nvs_streamingContext_getAVFileInfo(avFilePath, extraFlag);
    }


/**
* @description 根据文件路径注册字体
* @param {} fontFilePath
* @return {Num} 
*/
    registerFontByFilePath(fontFilePath) {
        return Module.nvs_streamingContext_registerFontByFilePath(fontFilePath);
    }


/**
* @description 从时间轴抓取图像
* @param {} timeline 时间线
* @param {} timestamp 时间戳
* @param {} proxyScale 缩放代理
* @param {} flags 
* @return {Num} 
*/
    grabImageFromTimeline(timeline, timestamp, proxyScale, flags) {
        return Module.nvs_streamingContext_grabImageFromTimeline(timeline, timestamp, proxyScale, flags);
    }


/**
* @description 设置音频输出设备音量
* @param {} volume 音量
* @return {Num} 
*/
    setAudioOutputDeviceVolume(volume) {
        Module.nvs_streamingContext_setAudioOutputDeviceVolume(volume);
    }


/**
* @description 设置最大视频文件阅读器计数
* @param {} count 计数
* @return {Num} 
*/
    setMaxVideoFileReaderCount(count) {
        Module.nvs_streamingContext_setMaxVideoFileReaderCount(count);
    }


/**
* @description 设置最大视频解码线程数
* @param {} count 计数
* @return {Num} 
*/
    setMaxVideoDecodingThreadCount(count) {
        Module.nvs_streamingContext_setMaxVideoDecodingThreadCount(count);
    }


/**
* @description 功能授权
* @param {} sdkFunctionName 函数名
* @return {Num} 
*/
    functionalityAuthorised(sdkFunctionName) {
        return Module.nvs_streamingContext_functionalityAuthorised(sdkFunctionName);
    }


/**
* @description 设置只使用中文
* @param {} useChineseLanguageOnly 只使用中文
* @return {Num} 
*/
    setUseChineseLanguageOnly(useChineseLanguageOnly) {
        Module.nvs_streamingContext_setUseChineseLanguageOnly(useChineseLanguageOnly);
    }


/**
* @description 是否仅仅使用中文
* @return {Num} 
*/
    isUseChineseLanguageOnly() {
        return Module.nvs_streamingContext_isUseChineseLanguageOnly();
    }



/**
* @description 初始化人体检测
* @param {} modelFilePath 模型文件路径
* @param {} licenseFilePath 许可证文件路径
* @param {} features 特征
* @return {Num} 
*/
    initHumanDetection(modelFilePath, licenseFilePath, features) {
        return Module.nvs_streamingContext_initHumanDetection(modelFilePath, licenseFilePath, features);
    }


/**
* @description 关闭人体检测
* @return {Num} 
*/
    closeHumanDetection() {
        Module.nvs_streamingContext_closeHumanDetection();
    }


/**
* @description 预加载效果资源
* @return {Num} 
*/
    preloadEffectResources() {
        return Module.nvs_streamingContext_preloadEffectResources();
    }


/**
* @description 通知更新到网络阅读器
* @param {} webAVFilePath 网页音视频文件路径
* @return {Num} 
*/
    notifyUpdateToWebReader(webAVFilePath) {
        return Module.nvs_streamingContext_notifyUpdateToWebReader(webAVFilePath);
    }


/**
* @description 启用音频 VU 表
* @param {} enable 是否开启
* @return {Num} 
*/
    enableAudioVUMeter(enable) {
        Module.nvs_streamingContext_enableAudioVUMeter(enable);
    }


/**
* @description 获取自动音调参数
* @param {} imageData 图片数据
* @param {} width 宽度
* @param {} height 高度
* @param {} isRawImage 是否原始图片
* @return {Num} 
*/
    getAutoToneParameters(imageData, width, height, isRawImage) {
        return Module.nvs_AIAdjustColorDetect_getAutoToneParameters(imageData, width, height, isRawImage);
    }
}



/**
* @description 使用模板
*/
const TEMPLATE_KEY_REPLACE_ID = 'MSTemplate-ReplaceId'

/**
* @description 使用模板
*/
const TEMPLATE_KEY_FOOTAGE_ID = 'MSTemplate-FootageId'

/**
* @description 使用模板
*/
const TEMPLATE_KEY_FOOTAGE_TAGS = 'MSTemplate-FootageTags'


/**
* @classdesc 工程对象
*/
class NvsProjObj {

/**
* @constructor
*/
    constructor() {
        this.internalObj = 0;
    }


/**
* @description 设置内置对象
* @param {} obj
* @return {Num} 
*/
    setInternalObject(obj) {
        this.internalObj = obj;
    }


/**
* @description 获取内置对象
* @return {Num} 
*/
    getInternalObject() {
        return this.internalObj;
    }


/**
* @description 设置模板附件
* @param {} key 键
* @param {} value 值
* @return {Num} 
*/
    setTemplateAttachment(key, value) {
        Module.nvs_object_setTemplateAttachment(this.internalObj, key, value);
    }



/**
* @description 根据键,获取模板属性值
* @param {} key 键
* @return {Num} 
*/
    getTemplateAttachment(key) {
        return Module.nvs_object_getTemplateAttachment(this.internalObj, key);
    }
}



/**
* @classdesc 时间线类:编辑场景的时间轴实体,时间线由轨道组成,可视作一系列音视频轨道的集合。在时间线上可添加或者移除多条视频轨道和音轨轨道,多条轨道之间是相互叠加合成的关系。 当编辑视频时,根据需要还会添加上时间线字幕,主题以及相应的动画贴纸,以制作出美观的视频。另外,添加素材资源包(主题包,动画贴纸包,字幕样式包,时间线特效包等), 都得先安装,安装成功后获取packageId才能使用,而内建时间线特效(builtin)只需获取特效名称即可使用。
* @extends NvsProjObj
*/
class NvsTimeline extends NvsProjObj {
/**
* @constructor
*/
    constructor() {
        super();
    }


/**
* @description 获取视频资源
* @return {Num} 
*/
    getVideoRes() {
        return Module.nvs_timeline_getVideoRes(this.internalObj);
    }


/**
* @description 获取音频资源
* @return {Num} 
*/
    getAudioRes() {
        return Module.nvs_timeline_getAudioRes(this.internalObj);
    }


/**
* @description 获取时间线时长
* @return {Num} 
*/
    getDuration() {
        return Module.nvs_timeline_getDuration(this.internalObj);
    }


/**
* @description 附加视频轨道
* @return {Num} 
*/
    appendVideoTrack() {
        return Module.nvs_timeline_appendVideoTrack(this.internalObj);
    }


/**
* @description 添加音频轨道
* @return {Num} 
*/
    appendAudioTrack() {
        return Module.nvs_timeline_appendAudioTrack(this.internalObj);
    }


/**
* @description 插入视频轨道
* @param {} insertPoint 插入点
* @return {Num} 
*/
    insertVideoTrack(insertPoint) {
        return Module.nvs_timeline_insertVideoTrack(this.internalObj, insertPoint);
    }


/**
* @description 插入音频轨道
* @param {} insertPoint 插入点
* @return {Num} 
*/
    insertAudioTrack(insertPoint) {
        return Module.nvs_timeline_insertAudioTrack(this.internalObj, insertPoint);
    }


/**
* @description 删除视频轨道
* @param {} trackIndex 轨道索引
* @return {Num} 
*/
    removeVideoTrack(trackIndex) {
        return Module.nvs_timeline_removeVideoTrack(this.internalObj, trackIndex);
    }


/**
* @description 删除音频轨道
* @param {} trackIndex 轨道索引
* @return {Num} 
*/
    removeAudioTrack(trackIndex) {
        return Module.nvs_timeline_removeAudioTrack(this.internalObj, trackIndex);
    }


/**
* @description 获取视频轨道计数
* @return {Num} 
*/
    videoTrackCount() {
        return Module.nvs_timeline_videoTrackCount(this.internalObj);
    }


/**
* @description 获取音频轨道计数
* @return {Num} 
*/
    audioTrackCount() {
        return Module.nvs_timeline_audioTrackCount(this.internalObj);
    }


/**
* @description 根据索引,获取视频轨道
* @param {} trackIndex 轨道索引
* @return {Num} 
*/
    getVideoTrackByIndex(trackIndex) {
        return Module.nvs_timeline_getVideoTrackByIndex(this.internalObj, trackIndex);
    }


/**
* @description 根据索引,获取音频轨道
* @param {} trackIndex 轨道索引
* @return {Num} 
*/
    getAudioTrackByIndex(trackIndex) {
        return Module.nvs_timeline_getAudioTrackByIndex(this.internalObj, trackIndex);
    }


/**
* @description 改变视频大小
* @param {} videoWidth 视频宽度
* @param {} videoHeight 视频高度
* @return {Num} 
*/
    changeVideoSize(videoWidth, videoHeight) {
        return Module.nvs_timeline_changeVideoSize(this.internalObj, videoWidth, videoHeight);
    }


/**
* @description 改变视频大小
* @param {} videoWidth 视频宽度
* @param {} videoHeight 视频高度
* @return {Num} 
*/
    changeVideoSize2(videoWidth, videoHeight) {
        return Module.nvs_timeline_changeVideoSize2(this.internalObj, videoWidth, videoHeight);
    }


/**
* @description 获取第一个字幕
* @return {Num} 
*/
    getFirstCaption() {
        return Module.nvs_timeline_getFirstCaption(this.internalObj);
    }


/**
* @description 获取最后一个字幕
* @return {Num} 
*/
    getLastCaption() {
        return Module.nvs_timeline_getLastCaption(this.internalObj);
    }


/**
* @description 获取上一个字幕
* @param {} caption 字幕
* @return {Num} 
*/
    getPrevCaption(caption) {
        return Module.nvs_timeline_getPrevCaption(this.internalObj, caption);
    }



/**
* @description 获取下一个字幕
* @param {} caption 字幕
* @return {Num} 
*/
    getNextCaption(caption) {
        return Module.nvs_timeline_getNextCaption(this.internalObj, caption);
    }


/**
* @description 根据时间线位置获取字幕
* @param {} timelinePos 时间线位置
* @return {Num} 
*/
    getCaptionsByTimelinePosition(timelinePos) {
        return Module.nvs_timeline_getCaptionsByTimelinePosition(this.internalObj, timelinePos);
    }


/**
* @description 添加字幕
* @param {} captionText 字幕文本
* @param {} inPoint 入点
* @param {} duration 持续时间
* @param {} captionStylePackageId 字幕风格包ID
* @param {} isPanoramic 是否是全景
* @return {Num} 
*/
    addCaption(captionText, inPoint, duration, captionStylePackageId, isPanoramic) {
        return Module.nvs_timeline_addCaption(this.internalObj, captionText, inPoint, duration, captionStylePackageId, isPanoramic);
    }


/**
* @description 添加模块化字幕
* @param {} captionText 字幕文本
* @param {} inPoint 入点
* @param {} duration 持续时间
* @return {Num} 
*/
    addModularCaption(captionText, inPoint, duration) {
        return Module.nvs_timeline_addModularCaption(this.internalObj, captionText, inPoint, duration);
    }


/**
* @description 删除字幕
* @param {} caption 字幕对象
* @return {Num} 
*/
    removeCaption(caption) {
        return Module.nvs_timeline_removeCaption(this.internalObj, caption);
    }



/**
* @description 获取第一个复合字幕
* @return {Num} 
*/
    getFirstCompoundCaption() {
        return Module.nvs_timeline_getFirstCompoundCaption(this.internalObj);
    }


/**
* @description 获取最后一个复合字幕
* @return {Num} 
*/
    getLastCompoundCaption() {
        return Module.nvs_timeline_getLastCompoundCaption(this.internalObj);
    }



/**
* @description 获取上一个复合字幕
* @param {} caption 字幕对象
* @return {Num} 
*/
    getPrevCompoundCaption(caption) {
        return Module.nvs_timeline_getPrevCompoundCaption(this.internalObj, caption);
    }


/**
* @description 获取下一个复合字幕
* @param {} caption 字幕对象
* @return {Num} 
*/
    getNextCompoundCaption(caption) {
        return Module.nvs_timeline_getNextCompoundCaption(this.internalObj, caption);
    }


/**
* @description 根据时间线位置,获取复合字幕
* @param {} timelinePos 时间线位置
* @return {Num} 
*/
    getCompoundCaptionsByTimelinePosition(timelinePos) {
        return Module.nvs_timeline_getCompoundCaptionsByTimelinePosition(this.internalObj, timelinePos);
    }


/**
* @description 添加复合字幕
* @param {} inPoint 入点
* @param {} duration 持续时间
* @param {} compoundCaptionPackageId 组合字幕包ID
* @return {Num} 
*/
    addCompoundCaption(inPoint, duration, compoundCaptionPackageId) {
        return Module.nvs_timeline_addCompoundCaption(this.internalObj, inPoint, duration, compoundCaptionPackageId);
    }

/**
* @description 删除复合字幕
* @param {} caption 字幕对象
* @return {Num} 
*/
    removeCompoundCaption(caption) {
        return Module.nvs_timeline_removeCompoundCaption(this.internalObj, caption);
    }


/**
* @description 获取第一个动画贴纸
* @return {Num} 
*/
    getFirstAnimatedSticker() {
        return Module.nvs_timeline_getFirstAnimatedSticker(this.internalObj);
    }


/**
* @description 获取最后一个动画贴纸
* @return {Num} 
*/
    getLastAnimatedSticker() {
        return Module.nvs_timeline_getLastAnimatedSticker(this.internalObj);
    }


/**
* @description 获取上一个动画贴纸
* @param {} animatedSticker 动画贴纸
* @return {Num} 
*/
    getPrevAnimatedSticker(animatedSticker) {
        return Module.nvs_timeline_getPrevAnimatedSticker(this.internalObj, animatedSticker);
    }


/**
* @description 获取下一个动画贴纸
* @param {} animatedSticker 动画贴纸对象
* @return {Num} 
*/
    getNextAnimatedSticker(animatedSticker) {
        return Module.nvs_timeline_getNextAnimatedSticker(this.internalObj, animatedSticker);
    }


/**
* @description 根据时间线位置获取动画贴纸
* @param {} timelinePos 时间线位置
* @return {Num} 
*/
    getAnimatedStickersByTimelinePosition(timelinePos) {
        return Module.nvs_timeline_getAnimatedStickersByTimelinePosition(this.internalObj, timelinePos);
    }


/**
* @description 添加动画贴纸
* @param {} inPoint 入点
* @param {} duration 持续时间
* @param {} animatedStickerPackageId 动画贴纸包ID
* @param {} isPanoramic 是否是全景
* @param {} isCustom 是否自定制
* @param {} customImagePath 自定制图片路径
* @return {Num} 
*/
    addAnimatedSticker(inPoint, duration, animatedStickerPackageId, isPanoramic, isCustom, customImagePath) {
        return Module.nvs_timeline_addAnimatedSticker(this.internalObj, inPoint, duration, animatedStickerPackageId, isPanoramic, isCustom, customImagePath);
    }


/**
* @description 删除动画贴纸
* @param {} animatedSticker 动画贴纸
* @return {Num} 
*/
    removeAnimatedSticker(animatedSticker) {
        return Module.nvs_timeline_removeAnimatedSticker(this.internalObj, animatedSticker);
    }


/**
* @description 获取第一个时间线视频特效
* @return {Num} 
*/
    getFirstTimelineVideoFx() {
        return Module.nvs_timeline_getFirstTimelineVideoFx(this.internalObj);
    }


/**
* @description 获取最后时间线视频特效
* @return {Num} 
*/
    getLastTimelineVideoFx() {
        return Module.nvs_timeline_getLastTimelineVideoFx(this.internalObj);
    }


/**
* @description 获取前一个时间线视频特效
* @param {} timelineVideoFx 时间线视频特效
* @return {Num} 
*/
    getPrevTimelineVideoFx(timelineVideoFx) {
        return Module.nvs_timeline_getPrevTimelineVideoFx(this.internalObj, timelineVideoFx);
    }


/**
* @description 获取下一个时间线视频特效
* @param {} timelineVideoFx 时间线视频特效
* @return {Num} 
*/
    getNextTimelineVideoFx(timelineVideoFx) {
        return Module.nvs_timeline_getNextTimelineVideoFx(this.internalObj, timelineVideoFx);
    }


/**
* @description 根据时间线位置获取时间线视频特效
* @param {} timelinePos 时间线位置
* @return {Num} 
*/
    getTimelineVideoFxByTimelinePosition(timelinePos) {
        return Module.nvs_timeline_getTimelineVideoFxByTimelinePosition(this.internalObj, timelinePos);
    }


/**
* @description 添加内置时间线视频特效
* @param {} inPoint 入点
* @param {} duration 持续时间
* @param {} videoFxName 视频特效名字
* @return {Num} 
*/
    addBuiltinTimelineVideoFx(inPoint, duration, videoFxName) {
        return Module.nvs_timeline_addBuiltinTimelineVideoFx(this.internalObj, inPoint, duration, videoFxName);
    }


/**
* @description 添加包时间线视频特效
* @param {} inPoint 入点
* @param {} duration 持续时间
* @param {} videoFxPackageId 视频特效包ID
* @return {Num} 
*/
    addPackagedTimelineVideoFx(inPoint, duration, videoFxPackageId) {
        return Module.nvs_timeline_addPackagedTimelineVideoFx(this.internalObj, inPoint, duration, videoFxPackageId);
    }


/**
* @description 删除时间线视频特效
* @param {} timelineVideoFx 时间线视频特效
* @return {Num} 
*/
    removeTimelineVideoFx(timelineVideoFx) {
        return Module.nvs_timeline_removeTimelineVideoFx(this.internalObj, timelineVideoFx);
    }



/**
* @description 获取当前主题ID
* @return {Num} 
*/
    getCurrentThemeId() {
        return Module.nvs_timeline_getCurrentThemeId(this.internalObj);
    }



/**
* @description 应用主题
* @param {} themeId 主题ID
* @return {Num} 
*/
    applyTheme(themeId) {
        return Module.nvs_timeline_applyTheme(this.internalObj, themeId);
    }



/**
* @description 删除当前主题
* @return {Num} 
*/
    removeCurrentTheme() {
        Module.nvs_timeline_removeCurrentTheme(this.internalObj);
    }



/**
* @description 设置主题标题字幕文本
* @param {} text 文本
* @return {Num} 
*/
    setThemeTitleCaptionText(text) {
        Module.nvs_timeline_setThemeTitleCaptionText(this.internalObj, text);
    }



/**
* @description 设置主题预报字幕文本
* @param {} text 文本
* @return {Num} 
*/
    setThemeTrailerCaptionText(text) {
        Module.nvs_timeline_setThemeTrailerCaptionText(this.internalObj, text);
    }



/**
* @description 设置主题音乐音量增益
* @param {} leftVolumeGain 左音量增益
* @param {} rightVolumeGain 右音量增益
* @return {Num} 
*/
    setThemeMusicVolumeGain(leftVolumeGain, rightVolumeGain) {
        Module.nvs_timeline_setThemeMusicVolumeGain(this.internalObj, leftVolumeGain, rightVolumeGain);
    }


/**
* @description 获取主题音乐音量增益
* @return {Num} 
*/
    getThemeMusicVolumeGain() {
        return Module.nvs_timeline_getThemeMusicVolumeGain(this.internalObj);
    }


/**
* @description 设置播放速率控制
* @param {} playbackRateControlRegions 播放速率控制区域
* @return {Num} 
*/
    setPlaybackRateControl(playbackRateControlRegions) {
        Module.nvs_timeline_setPlaybackRateControl(this.internalObj, playbackRateControlRegions);
    }


/**
* @description 添加水印
* @param {} filePath 文件路径
* @param {} displayWidth 显示宽度
* @param {} displayHeight 显示高度
* @param {} opacity 不透明度
* @param {} position 位置
* @param {} marginX X边界
* @param {} marginY Y边界
* @return {Num} 
*/
    addWatermark(filePath, displayWidth, displayHeight, opacity, position, marginX, marginY) {
        Module.nvs_timeline_addWatermark(this.internalObj, filePath, displayWidth, displayHeight, opacity, position, marginX, marginY);
    }


/**
* @description 添加水印
* @param {} sceneWidth
* @param {} sceneHeight
* @param {} imageName
* @param {} imgWidth
* @param {} imgHeight
* @param {} tx
* @param {} ty
* @param {} dirPath
* @param {} opacity
* @return {Num} 
*/
    addWatermark2(sceneWidth, sceneHeight, imageName, imgWidth, imgHeight, tx, ty, dirPath, opacity) {
        Module.nvs_timeline_addWatermark2(this.internalObj, sceneWidth, sceneHeight, imageName, imgWidth, imgHeight, tx, ty, dirPath, opacity);
    }


/**
* @description 删除水印
* @return {Num} 
*/
    deleteWatermark() {
        Module.nvs_timeline_deleteWatermark(this.internalObj);
    }


/**
* @description 设置水印透明度
* @param {} opacity 不透明度
* @return {Num} 
*/
    setWatermarkOpacity(opacity) {
        Module.nvs_timeline_setWatermarkOpacity(this.internalObj, opacity);
    }


/**
* @description 获取水印信息
* @return {Num} 
*/
    getWatermarkInfo() {
        return Module.nvs_timeline_getWatermarkInfo(this.internalObj);
    }


/**
* @description 设置视频轨道支持的最大音频流
* @param {} maxStream 最大流数量
* @return {Num} 
*/
    setMaxAudioStreamSupportedOnVideoTrack(maxStream) {
        Module.nvs_timeline_setMaxAudioStreamSupportedOnVideoTrack(this.internalObj, maxStream);
    }


/**
* @description 获得视频轨道支持的最大音频流
* @return {Num} 
*/
    getMaxAudioStreamSupportedOnVideoTrack() {
        return Module.nvs_timeline_getMaxAudioStreamSupportedOnVideoTrack(this.internalObj);
    }
}



/**
* @classdesc 轨道类:轨道,容纳片段的结构。轨道可视作片段的集合,分为音频轨道(Audio Track)和视频轨道(Video Track)。创建时间线实例后,可添加或移除多条轨道。在每一条轨道上,可以添加多个要编辑的视音频片段,并对片段进行音量设置,也可以进行移除和位置移动。
* @extends NvsProjObj
*/
class NvsTrack extends NvsProjObj {

/**
* @constructor
*/
    constructor() {
        super();
    }


/**
* @description 获取类型
* @return {Num} 
*/
    getType() {
        return Module.nvs_track_getType(this.internalObj);
    }


/**
* @description 获取轨道索引
* @return {Num} 
*/
    getIndex() {
        return Module.nvs_track_getIndex(this.internalObj);
    }


/**
* @description 获取时长
* @return {Num} 
*/
    getDuration() {
        return Module.nvs_track_getDuration(this.internalObj);
    }


/**
* @description 获取片段数量
* @return {Num} 
*/
    getClipCount() {
        return Module.nvs_track_getClipCount(this.internalObj);
    }


/**
* @description 改变入点
* @param {} clipIndex 片段索引
* @param {} newInPoint 新的入点
* @return {Num} 
*/
    changeInPoint(clipIndex, newInPoint) {
        return Module.nvs_track_changeInPoint(this.internalObj, clipIndex, newInPoint);
    }


/**
* @description 改变出点
* @param {} clipIndex 片段索引
* @param {} newOutPoint 新的出点
* @return {Num} 
*/
    changeOutPoint(clipIndex, newOutPoint) {
        return Module.nvs_track_changeOutPoint(this.internalObj, clipIndex, newOutPoint);
    }


/**
* @description 分割片段
* @param {} clipIndex 片段索引
* @param {} splitPoint 分割点
* @return {Num} 
*/
    splitClip(clipIndex, splitPoint) {
        return Module.nvs_track_splitClip(this.internalObj, clipIndex, splitPoint);
    }


/**
* @description 删除片段
* @param {} clipIndex 片段索引
* @param {} keepSpace 保留空间
* @return {Num} 
*/
    removeClip(clipIndex, keepSpace) {
        return Module.nvs_track_removeClip(this.internalObj, clipIndex, keepSpace);
    }


/**
* @description 删除区间
* @param {} startTimelinePos 开始点在时间线上的位置
* @param {} endTimelinePos 结束点在时间线上的位置
* @param {} keepSpace 保留空间
* @return {Num} 
*/
    removeRange(startTimelinePos, endTimelinePos, keepSpace) {
        return Module.nvs_track_removeRange(this.internalObj, startTimelinePos, endTimelinePos, keepSpace);
    }


/**
* @description 移动片段
* @param {} sourceClipIndex 源片段索引
* @param {} targetClipIndex 目标片段索引
* @return {Num} 
*/
    moveClip(sourceClipIndex, targetClipIndex) {
        return Module.nvs_track_moveClip(this.internalObj, sourceClipIndex, targetClipIndex);
    }


/**
* @description 根据位置,移动片段
* @param {} sourceClipIndex 源片段索引
* @param {} targetTimelinePos 目标时间线位置
* @param {} isInsertTarget 是否是插入目标
* @param {} keepSpace 保留空间
* @return {Num} 
*/
    moveClipByPosition(sourceClipIndex, targetTimelinePos, isInsertTarget, keepSpace) {
        return Module.nvs_track_moveClipByPosition(this.internalObj, sourceClipIndex, targetTimelinePos, isInsertTarget, keepSpace);
    }


/**
* @description 删除所有片段
* @return {Num} 
*/
    removeAllClips() {
        return Module.nvs_track_removeAllClips(this.internalObj);
    }


/**
* @description 设置音量增益
* @param {} leftVolumeGain 左声道增益
* @param {} rightVolumeGain 右声道增益
* @return {Num} 
*/
    setVolumeGain(leftVolumeGain, rightVolumeGain) {
        return Module.nvs_track_setVolumeGain(this.internalObj, leftVolumeGain, rightVolumeGain);
    }


/**
* @description 获取音量增益
* @return {Num} 
*/
    getVolumeGain() {
        return Module.nvs_track_getVolumeGain(this.internalObj);
    }
}



/**
* @classdesc 视频轨道类:视频片段的集合。视频轨道是容纳视频片段的实体,可以添加、插入、删移多个视频片段。视频轨道随着片段的增加不断延展,而片段与片段之间可进行视频转场设置。 添加包裹转场时,都得先安装,安装成功后获取packageId才能使用,而内建转场(builtin)只需获取转场名称即可使用。 注:视频片段的索引都是从0开始。
* @extends NvsTrack
*/
class NvsVideoTrack extends NvsTrack {

/**
* @constructor
*/
    constructor() {
        super();
    }



/**
* @description 插入片段
* @param {} videoFilePath 视频文件路径
* @param {} insertPoint 插入点
* @return {Num} 
*/
    insertClip(videoFilePath, insertPoint) {
        return Module.nvs_videoTrack_insertClip(this.internalObj, videoFilePath, insertPoint);
    }


/**
* @description 插入片段
* @param {} videoFilePath 视频文件路径
* @param {} trimIn 修剪入点
* @param {} trimOut 修剪出点
* @param {} insertPoint 插入点
* @return {Num} 
*/
    insertClip2(videoFilePath, trimIn, trimOut, insertPoint) {
        return Module.nvs_videoTrack_insertClip2(this.internalObj, videoFilePath, trimIn, trimOut, insertPoint);
    }


/**
* @description 追加片段
* @param {} videoFilePath 视频文件路径
* @return {Num} 
*/
    appendClip(videoFilePath) {
        return this.insertClip(videoFilePath, this.getClipCount());
    }


/**
* @description 追加片段
* @param {} videoFilePath 视频文件路径
* @param {} trimIn 修剪入点
* @param {} trimOut 修剪出点
* @return {Num} 
*/
    appendClip2(videoFilePath, trimIn, trimOut) {
        return this.insertClip2(videoFilePath, trimIn, trimOut, this.getClipCount());
    }


/**
* @description 添加片段
* @param {} videoFilePath 视频文件路径
* @param {} inPoint 入点
* @return {Num} 
*/
    addClip(videoFilePath, inPoint) {
        return Module.nvs_videoTrack_addClip(this.internalObj, videoFilePath, inPoint);
    }


/**
* @description 添加片段
* @param {} videoFilePath 视频文件路径
* @param {} inPoint 入点
* @param {} trimIn 修剪入点
* @param {} trimOut 修剪出点
* @return {Num} 
*/
    addClip2(videoFilePath, inPoint, trimIn, trimOut) {
        return Module.nvs_videoTrack_addClip2(this.internalObj, videoFilePath, inPoint, trimIn, trimOut);
    }


/**
* @description 添加速度片段
* @param {} videoFilePath 视频文件路径
* @param {} inPoint 修剪入点
* @param {} speed 速度
* @param {} keepAudioPitch 保持音频音调
* @return {Num} 
*/
    addClipWithSpeed(videoFilePath, inPoint, speed, keepAudioPitch) {
        return Module.nvs_videoTrack_addClipWithSpeed(this.internalObj, videoFilePath, inPoint, speed, keepAudioPitch);
    }


/**
* @description 添加速度片段
* @param {} videoFilePath 视频文件路径
* @param {} inPoint 入点
* @param {} trimIn 修剪入点
* @param {} trimOut 修剪出点
* @param {} speed 速度
* @param {} keepAudioPitch 保持音频音调
* @return {Num} 
*/
    addClipWithSpeed2(videoFilePath, inPoint, trimIn, trimOut, speed, keepAudioPitch) {
        return Module.nvs_videoTrack_addClipWithSpeed2(this.internalObj, videoFilePath, inPoint, trimIn, trimOut, speed, keepAudioPitch);
    }


/**
* @description 根据索引获取片段
* @param {} index 索引
* @return {Num} 
*/
    getClipByIndex(index) {
        return Module.nvs_videoTrack_getClipByIndex(this.internalObj, index);
    }


/**
* @description 根据时间线位置获取片段
* @param {} timelinePos 时间线位置
* @return {Num} 
*/  
	getClipByTimelinePosition(timelinePos) {
        return Module.nvs_videoTrack_getClipByTimelinePosition(this.internalObj, timelinePos);
    }


/**
* @description 设置内置转场
* @param {} srcClipIndex 源片段索引
* @param {} transitionName 转场名字
* @return {Num} 
*/
    setBuiltinTransition(srcClipIndex, transitionName) {
        return Module.nvs_videoTrack_setBuiltinTransition(this.internalObj, srcClipIndex, transitionName);
    }


/**
* @description 设置包转场
* @param {} srcClipIndex 源片段索引
* @param {} packageId 包ID
* @return {Num} 
*/
    setPackagedTransition(srcClipIndex, packageId) {
        return Module.nvs_videoTrack_setPackagedTransition(this.internalObj, srcClipIndex, packageId);
    }


/**
* @description 根据源片段索引获取转场
* @param {} srcClipIndex 源片段索引
* @return {Num} 
*/
    getTransitionBySourceClipIndex(srcClipIndex) {
        return Module.nvs_videoTrack_getTransitionBySourceClipIndex(this.internalObj, srcClipIndex);
    }


/**
* @description 设置在主题中可用
* @param {} available 可用性
* @return {Num} 
*/
    setAvailableInTheme(available) {
        return Module.nvs_videoTrack_setAvailableInTheme(this.internalObj, available);
    }


/**
* @description 是否在主题中可用
* @return {Num} 
*/
    isAvailableInTheme() {
        return Module.nvs_videoTrack_isAvailableInTheme(this.internalObj);
    }
}



/**
* @classdesc 音频轨道,音频片段的集合。音频轨道是容纳音频片段的实体。每条音频轨道可以添加或者移除多个音频片段。一个音频片段播放到另一个音频片段时,需要进行音频转场设置,以便过渡衔接。注:对于音频轨道的一系列接口及所其属参数含义,请参照视频轨道NvsVideoTrack的对应接口来对照理解。
* @extends NvsTrack
*/
class NvsAudioTrack extends NvsTrack {
/**
* @constructor
*/
    constructor() {
        super();
    }


/**
* @description 添加片段
* @param {} audioFilePath 音频文件路径
* @param {} insertPoint 插入点
* @return {Num} 
*/
    insertClip(audioFilePath, insertPoint) {
        return Module.nvs_audioTrack_insertClip(this.internalObj, audioFilePath, insertPoint);
    }


/**
* @description 插入片段
* @param {} audioFilePath 音频文件路径
* @param {} trimIn 修剪入点
* @param {} trimOut 修剪出点
* @param {} insertPoint 插入点
* @return {Num} 
*/
    insertClip2(audioFilePath, trimIn, trimOut, insertPoint) {
        return Module.nvs_audioTrack_insertClip2(this.internalObj, audioFilePath, trimIn, trimOut, insertPoint);
    }


/**
* @description 追加片段
* @param {} audioFilePath 音频文件路径
* @return {Num} 
*/
    appendClip(audioFilePath) {
        return this.insertClip(audioFilePath, this.getClipCount());
    }


/**
* @description 追加片段
* @param {} audioFilePath 音频文件路径
* @param {} trimIn 裁剪入点
* @param {} trimOut 裁剪出点
* @return {Num} 
*/
    appendClip2(audioFilePath, trimIn, trimOut) {
        return this.insertClip2(audioFilePath, trimIn, trimOut, this.getClipCount());
    }


/**
* @description 添加片段
* @param {} audioFilePath 音频文件路径
* @param {} inPoint 入点
* @return {Num} 
*/
    addClip(audioFilePath, inPoint) {
        return Module.nvs_audioTrack_addClip(this.internalObj, audioFilePath, inPoint);
    }


/**
* @description 添加片段
* @param {} audioFilePath 音频文件路径
* @param {} inPoint 入点
* @param {} trimIn 裁剪入点
* @param {} trimOut 裁剪出点
* @return {Num} 
*/
    addClip2(audioFilePath, inPoint, trimIn, trimOut) {
        return Module.nvs_audioTrack_addClip2(this.internalObj, audioFilePath, inPoint, trimIn, trimOut);
    }


/**
* @description 根据索引获取片段
* @param {} index 索引
* @return {Num} 
*/
    getClipByIndex(index) {
        return Module.nvs_audioTrack_getClipByIndex(this.internalObj, index);
    }


/**
* @description 根据时间线位置获取片段
* @param {} timelinePos 时间线位置
* @return {Num} 
*/
    getClipByTimelinePosition(timelinePos) {
        return Module.nvs_audioTrack_getClipByTimelinePosition(this.internalObj, timelinePos);
    }


/**
* @description 设置内置转场
* @param {srcClipIndex}  源片段索引
* @param {transitionName}  转场名字
* @return {Num} 
*/
    setBuiltinTransition(srcClipIndex, transitionName) {
        return Module.nvs_audioTrack_setBuiltinTransition(this.internalObj, srcClipIndex, transitionName);
    }


/**
* @description 根据原片段索引获取转场
* @param {srcClipIndex} 源片段索引
* @return {} 
*/
    getTransitionBySourceClipIndex(srcClipIndex) {
        return Module.nvs_audioTrack_getTransitionBySourceClipIndex(this.internalObj, srcClipIndex);
    }
}


/**
* @classdesc 片段,音视频文件的具体描述。片段是容纳音视频内容的实体,是对视频、音频文件的描述,分为音频片段(Audio Clip)和视频片段(Video Clip)。它定义了不同类型片段所拥有的共同属性和行为, 即派生的音频片段和和视频片段可根据需要修改各自的裁剪出入点,左右声道,播放速度等。在SDK框架中,在轨道(Track)上可添加相应的音频片段和视频片段。
* @extends NvsProjObj
*/
class NvsClip extends NvsProjObj {

/**
* @constructor
*/
    constructor() {
        super();
    }


/**
* @description 获取修剪入点
* @return {} 
*/
    getTrimIn() {
        return Module.nvs_clip_getTrimIn(this.internalObj);
    }


/**
* @description 获取修剪出点
* @return {} 
*/
    getTrimOut() {
        return Module.nvs_clip_getTrimOut(this.internalObj);
    }


/**
* @description 移动修剪点
* @param {} offset
* @return {} 
*/
    moveTrimPoint(offset) {
        return Module.nvs_clip_moveTrimPoint(this.internalObj, offset);
    }


/**
* @description 获取入点
* @return {} 
*/
    getInPoint() {
        return Module.nvs_clip_getInPoint(this.internalObj);
    }



/**
* @description 获取出点
* @return {} 
*/
    getOutPoint() {
        return Module.nvs_clip_getOutPoint(this.internalObj);
    }



/**
* @description 获取类型
* @return {} 
*/
    getType() {
        return Module.nvs_clip_getType(this.internalObj);
    }


/**
* @description 获取索引
* @return {} 
*/
    getIndex() {
        return Module.nvs_clip_getIndex(this.internalObj);
    }


/**
* @description 获取文件路径
* @return {} 
*/
    getFilePath() {
        return Module.nvs_clip_getFilePath(this.internalObj);
    }


/**
* @description 获取特效计数
* @return {} 
*/
    getFxCount() {
        return Module.nvs_clip_getFxCount(this.internalObj);
    }



/**
* @description 改变入点
* @param {} newTrimInPoint 新裁剪入点
* @param {} affectSibling  影响同级
* @return {} 
*/
    changeTrimInPoint(newTrimInPoint, affectSibling) {
        return Module.nvs_clip_changeTrimInPoint(this.internalObj, newTrimInPoint, affectSibling);
    }


/**
* @description 改变出点
* @param {} newTrimOutPoint 新裁剪出点
* @param {} affectSibling 影响同级
* @return {} 
*/
    changeTrimOutPoint(newTrimOutPoint, affectSibling) {
        return Module.nvs_clip_changeTrimOutPoint(this.internalObj, newTrimOutPoint, affectSibling);
    }


/**
* @description 获取速度
* @return {} 
*/
    getSpeed() {
        return Module.nvs_clip_getSpeed(this.internalObj);
    }



/**
* @description 改变速度
* @param {} newSpeed 新速度
* @param {} keepAudioPitch 保持音频音调
* @return {} 
*/
    changeSpeed(newSpeed, keepAudioPitch) {
        Module.nvs_clip_changeSpeed(this.internalObj, newSpeed, keepAudioPitch);
    }



/**
* @description 获取音量增益
* @return {} 
*/
    getVolumeGain() {
        return Module.nvs_clip_getVolumeGain(this.internalObj);
    }


/**
* @description 设置音量增益
* @param {} leftVolumeGain 左音频增益
* @param {} rightVolumeGain 右音频增益
* @return {} 
*/
    setVolumeGain(leftVolumeGain, rightVolumeGain) {
        Module.nvs_clip_setVolumeGain(this.internalObj, leftVolumeGain, rightVolumeGain);
    }


/**
* @description 设置淡入持续时间
* @param {} duration 持续时间
* @return {} 
*/
    setFadeInDuration(duration) {
        Module.nvs_clip_setFadeInDuration(this.internalObj, duration);
    }


/**
* @description 获取淡入持续时间
* @return {} 
*/
    getFadeInDuration() {
        return Module.nvs_clip_getFadeInDuration(this.internalObj);
    }


/**
* @description 设置淡出持续时间
* @param {} duration 持续时间
* @return {} 
*/
    setFadeOutDuration(duration) {
        Module.nvs_clip_setFadeOutDuration(this.internalObj, duration);
    }


/**
* @description 获取淡出持续时间
* @return {} 
*/
    getFadeOutDuration() {
        return Module.nvs_clip_getFadeOutDuration(this.internalObj);
    }


/**
* @description 改变曲线变速
* @param {} curvesString 曲线字符串
* @param {} keepAudioPitch 保持音频音调
* @return {} 
*/
    changeCurvesVariableSpeed(curvesString, keepAudioPitch) {
        return Module.nvs_clip_changeCurvesVariableSpeed(this.internalObj, curvesString, keepAudioPitch);
    }


/**
* @description 获取片段变速曲线字符串
* @return {} 
*/
    getClipVariableSpeedCurvesString() {
        return Module.nvs_clip_getClipVariableSpeedCurvesString(this.internalObj);
    }


/**
* @description 根据时间线位置曲线变速获取片段位置
* @param {} timelinePos 时间线位置
* @return {} 
*/
    getClipPosByTimelinePosCurvesVariableSpeed(timelinePos) {
        return Module.nvs_clip_getClipPosByTimelinePosCurvesVariableSpeed(this.internalObj, timelinePos);
    }


/**
* @description 根据片段位置曲线变速获取时间线位置
* @param {} clipPos 片段位置
* @return {} 
*/
    getTimelinePosByClipPosCurvesVariableSpeed(clipPos) {
        return Module.nvs_clip_getTimelinePosByClipPosCurvesVariableSpeed(this.internalObj, clipPos);
    }
}



/**
* @classdesc 视频片段,对视频文件的描述。视频片段源可以是视频或者图片。每个视频片段可以修改其裁剪入点、裁剪出点以及播放速度,也可以设置摇摄和扫描。编辑视频时,可以按特效类型的不同(内建特效,包裹式特效,美颜特效)添加或者插入多个视频特效。 添加资源包特效时,都得先安装,安装成功后获取packageId才能使用,而内建特效(builtin)只需获取特效名称即可使用。
* @extends NvsClip
*/
class NvsVideoClip extends NvsClip {
	
/**
* @constructor
*/
    constructor() {
        super();
    }


/**
* @description 追加内置特效
* @param {} fxName 特效名字
* @return {} 
*/
    appendBuiltinFx(fxName) {
        return Module.nvs_videoClip_appendBuiltinFx(this.internalObj, fxName, false);
    }


/**
* @description 插入内置特效
* @param {} fxName 特效名字
* @param {} fxIndex 特效索引
* @return {} 
*/
    insertBuiltinFx(fxName, fxIndex) {
        return Module.nvs_videoClip_insertBuiltinFx(this.internalObj, fxName, fxIndex, false);
    }


/**
* @description 追加包特效
* @param {} fxPackageId 特效包ID
* @return {} 
*/
    appendPackagedFx(fxPackageId) {
        return Module.nvs_videoClip_appendPackagedFx(this.internalObj, fxPackageId, false);
    }


/**
* @description 加入包特效
* @param {} fxPackageId 特效包ID
* @param {} fxIndex 特效索引
* @return {} 
*/
    insertPackagedFx(fxPackageId, fxIndex) {
        return Module.nvs_videoClip_insertPackagedFx(this.internalObj, fxPackageId, fxIndex, false);
    }


/**
* @description 删除特效
* @param {} fxIndex 特效索引
* @return {} 
*/
    removeFx(fxIndex) {
        return Module.nvs_videoClip_removeFx(this.internalObj, fxIndex, false);
    }


/**
* @description 删除所有特效
* @return {} 
*/
    removeAllFx() {
        return Module.nvs_videoClip_removeAllFx(this.internalObj);
    }


/**
* @description 根据索引获取特效
* @param {} fxIndex 特效索引
* @return {} 
*/
    getFxByIndex(fxIndex) {
        return Module.nvs_videoClip_getFxByIndex(this.internalObj, fxIndex, false);
    }


/**
* @description 追加原始内置特效
* @param {} fxName 特效名字
* @return {} 
*/
    appendRawBuiltinFx(fxName) {
        return Module.nvs_videoClip_appendBuiltinFx(this.internalObj, fxName, true);
    }


/**
* @description 插入原始内置特效
* @param {} fxName 特效名字
* @param {} fxIndex 特效索引
* @return {} 
*/
    insertRawBuiltinFx(fxName, fxIndex) {
        return Module.nvs_videoClip_insertBuiltinFx(this.internalObj, fxName, fxIndex, true);
    }


/**
* @description 追加原始包特效
* @param {} fxPackageId 特效包ID
* @return {} 
*/
    appendRawPackagedFx(fxPackageId) {
        return Module.nvs_videoClip_appendPackagedFx(this.internalObj, fxPackageId, true);
    }


/**
* @description 加入原始包特效
* @param {} fxPackageId 特效包ID
* @param {} fxIndex 特效索引
* @return {} 
*/
    insertRawPackagedFx(fxPackageId, fxIndex) {
        return Module.nvs_videoClip_insertPackagedFx(this.internalObj, fxPackageId, fxIndex, true);
    }


/**
* @description 删除原始特效
* @param {} fxIndex 特效索引
* @return {} 
*/
    removeRawFx(fxIndex) {
        return Module.nvs_videoClip_removeFx(this.internalObj, fxIndex, true);
    }


/**
* @description 获取原始特效计数
* @return {} 
*/
    getRawFxCount() {
        return Module.nvs_videoClip_getRawFxCount(this.internalObj);
    }


/**
* @description 根据索引获取原始特效
* @param {} fxIndex 特效索引
* @return {} 
*/
    getRawFxByIndex(fxIndex) {
        return Module.nvs_videoClip_getFxByIndex(this.internalObj, fxIndex, true);
    }


/**
* @description 获取视频类型
* @return {} 
*/
    getVideoType() {
        return Module.nvs_videoClip_getVideoType(this.internalObj);
    }


/**
* @description 获取主题角色
* @return {} 
*/
    getRoleInTheme() {
        return Module.nvs_videoClip_getRoleInTheme(this.internalObj);
    }


/**
* @description 设置反向播放
* @param {} playInReverse 反向播放
* @return {} 
*/
    setPlayInReverse(playInReverse) {
        Module.nvs_videoClip_setPlayInReverse(this.internalObj, playInReverse);
    }


/**
* @description 获取反向播放
* @return {} 
*/
    getPlayInReverse() {
        return Module.nvs_videoClip_getPlayInReverse(this.internalObj);
    }


/**
* @description 设置扩展视频旋转
* @param {} rotation 旋转
* @return {} 
*/
    setExtraVideoRotation(rotation) {
        Module.nvs_videoClip_setExtraVideoRotation(this.internalObj, rotation);
    }


/**
* @description 获取扩展视频旋转
* @return {} 
*/
    getExtraVideoRotation() {
        return Module.nvs_videoClip_getExtraVideoRotation(this.internalObj);
    }


/**
* @description 设置遥感和扫描
* @param {} pan 遥感
* @param {} scan 扫描
* @return {} 
*/
    setPanAndScan(pan, scan) {
        Module.nvs_videoClip_setPanAndScan(this.internalObj, pan, scan);
    }


/**
* @description 获取遥感和扫描
* @return {} 
*/
    getPanAndScan() {
        return Module.nvs_videoClip_getPanAndScan(this.internalObj);
    }


/**
* @description 设置源背景模式
* @param {} mode 模式
* @return {} 
*/
    setSourceBackgroundMode(mode) {
        Module.nvs_videoClip_setSourceBackgroundMode(this.internalObj, mode);
    }


/**
* @description 获取源背景模式
* @return {} 
*/
    getSourceBackgroundMode() {
        return Module.nvs_videoClip_getSourceBackgroundMode(this.internalObj);
    }


/**
* @description 设置源背景颜色
* @param {} color 颜色
* @return {} 
*/
    setSourceBackgroundColor(color) {
        Module.nvs_videoClip_setSourceBackgroundColor(this.internalObj, color);
    }


/**
* @description 获取源背景颜色
* @return {} 
*/
    getSourceBackgroundColor() {
        return Module.nvs_videoClip_getSourceBackgroundColor(this.internalObj);
    }


/**
* @description 设置图像运动模式
* @param {} mode 模式 
* @return {} 
*/
    setImageMotionMode(mode) {
        Module.nvs_videoClip_setImageMotionMode(this.internalObj, mode);
    }


/**
* @description 获取图像运动模式
* @return {} 
*/
    getImageMotionMode() {
        return Module.nvs_videoClip_getImageMotionMode(this.internalObj);
    }


/**
* @description 设置图像运动动画启用
* @param {} enabled 开启
* @return {} 
*/
    setImageMotionAnimationEnabled(enabled) {
        Module.nvs_videoClip_setImageMotionAnimationEnabled(this.internalObj, enabled);
    }


/**
* @description 是否启用了图像运动动画
* @return {} 
*/
    isImageMotionAnimationEnabled() {
        return Module.nvs_videoClip_isImageMotionAnimationEnabled(this.internalObj);
    }


/**
* @description 设置片段包装模式
* @param {} wrapMode 包装模式
* @return {} 
*/
    setClipWrapMode(wrapMode) {
        Module.nvs_videoClip_setClipWrapMode(this.internalObj, wrapMode);
    }


/**
* @description 获取片段包装模式
* @return {} 
*/
    getClipWrapMode() {
        return Module.nvs_videoClip_getClipWrapMode(this.internalObj);
    }


/**
* @description 启用片段冻结帧
* @param {} enabled 开启
* @return {} 
*/
    enableClipFreezeFrame(enabled) {
        Module.nvs_videoClip_enableClipFreezeFrame(this.internalObj, enabled);
    }


/**
* @description 是否启用了片段冻结帧
* @return {} 
*/
    isClipFreezeFrameEnabled() {
        return Module.nvs_videoClip_isClipFreezeFrameEnabled(this.internalObj);
    }


/**
* @description 设置片段冻结帧修剪位置
* @param {} trimPos 裁剪点
* @return {} 
*/
    setClipFreezeFrameTrimPosition(trimPos) {
        Module.nvs_videoClip_setClipFreezeFrameTrimPosition(this.internalObj, trimPos);
    }


/**
* @description 获取剪辑冻结帧修剪位置
* @return {} 
*/
    getClipFreezeFrameTrimPosition() {
        return Module.nvs_videoClip_getClipFreezeFrameTrimPosition(this.internalObj);
    }


/**
* @description 获取属性视频特效
* @return {} 
*/
    getPropertyVideoFx() {
        return Module.nvs_videoClip_getPropertyVideoFx(this.internalObj);
    }


/**
* @description 启用属性视频特效
* @param {} enabled 开启
* @return {} 
*/
    enablePropertyVideoFx(enabled) {
        Module.nvs_videoClip_enablePropertyVideoFx(this.internalObj, enabled);
    }
}



/**
* @classdesc 音频片段,对音频文件的描述。音频片段既可以修改其裁剪入点和出点,播放速度等,还可以添加、插入、移除以及获取多个音频特效。
* @extends NvsClip
*/
class NvsAudioClip extends NvsClip {
	
/**
* @constructor
*/
    constructor() {
        super();
    }


/**
* @description 追加特效
* @param {} fxName 特效名字
* @return {} 
*/
    appendFx(fxName) {
        return Module.nvs_audioClip_appendFx(this.internalObj, fxName);
    }


/**
* @description 插入特效
* @param {} fxName 特效名字
* @param {} fxIndex 特效索引
* @return {} 
*/
    insertFx(fxName, fxIndex) {
        return Module.nvs_audioClip_insertFx(this.internalObj, fxName, fxIndex);
    }


/**
* @description 删除特效
* @param {} fxIndex 特效索引
* @return {} 
*/
    removeFx(fxIndex) {
        return Module.nvs_audioClip_removeFx(this.internalObj, fxIndex);
    }


/**
* @description 根据索引获取特效
* @param {} fxIndex 特效索引
* @return {} 
*/
    getFxByIndex(fxIndex) {
        return Module.nvs_audioClip_getFxByIndex(this.internalObj, fxIndex);
    }


/**
* @description 设置音频流索引
* @param {} streamIndex 流索引
* @return {} 
*/
    setAudioStreamIndex(streamIndex) {
        Module.nvs_audioClip_setAudioStreamIndex(this.internalObj, streamIndex);
    }


/**
* @description 获取音频流索引
* @return {} 
*/
    getAudioSteramIndex() {
        return Module.nvs_audioClip_getAudioSteramIndex(this.internalObj);
    }
}


/**
* @classdesc 遥感扫描类
*/
class NvsPanAndScan {
	
/**
* @constructor
* @param {} pan 遥感
* @param {} scan 扫描
*/
    constructor(pan, scan) {
        this.pan = pan;
        this.scan = scan;
    }
}


/**
* @classdesc 音量类,设置音量的左右声道
*/
class NvsVolume {
/**
* @constructor
* @param {} leftVolume 左边音量
* @param {} rightVolume 右边音量
*/
    constructor(leftVolume, rightVolume) {
        this.leftVolume = leftVolume;
        this.rightVolume = rightVolume;
    }
}


/**
* @classdesc 自定义颜色类。SDK中,NvsColor类属性r,g,b,a取值范围是[0,1],而非[0,255]。
*/
class NvsColor {
	
/**
* @constructor
* @param {} r 颜色r分量
* @param {} g 颜色g分量
* @param {} b 颜色g分量
* @param {} a 颜色a分量
*/
    constructor(r, g, b, a) {
        this.r = r;
        this.g = g;
        this.b = b;
        this.a = a;
    }
}


/**
* @classdesc 二维坐标点结构。 参数类型为双精度浮点数。
*/
class NvsPointF {
	
/**
* @constructor
* @param {} x x坐标
* @param {} y y坐标
*/
    constructor(x, y) {
        this.x = x;
        this.y = y;
    }
}



/**
* @classdesc 矩形类
*/
class NvsRectF {
	
/**
* @constructor
* @param {} left  左
* @param {} top 上
* @param {} right 右
* @param {} bottom 下
*/
    constructor(left, top, right, bottom) {
        this.left = left;
        this.top = top;
        this.right = right;
        this.bottom = bottom;
    }
}


/**
* @classdesc 水印信息类
*/
class NvsWatermarkInfo {
	
/**
* @constructor
* @param {} sceneWidth 场景宽度
* @param {} sceneHeight 场景高度
* @param {} imageName 图片名字
* @param {} imgWidth 图片宽度
* @param {} imgHeight 图片高度
* @param {} tx
* @param {} ty
* @param {} dirPath
* @param {} opacity

*/
    constructor(sceneWidth, sceneHeight, imageName, imgWidth, imgHeight, tx, ty, dirPath, opacity) {
        this.sceneWidth = sceneWidth;
        this.sceneHeight = sceneHeight;
        this.imageName = imageName;
        this.imgWidth = imgWidth;
        this.imgHeight = imgHeight;
        this.tx = tx;
        this.ty = ty;
        this.dirPath = dirPath;
        this.opacity = opacity;
    }
}


/**
* @classdesc 资源包管理器,管理视频场景中的资源包。在SDK开发过中,资源包管理器统一对需要的各种特技资源包包括字幕,主题,动画贴纸等进行相应的安装,升级,卸载等操作。在安装,升级,卸载时,出现差错都会有相应的错误提示类型,以便快速定位和解决错误。
*/
class NvsAssetPackageManager {
/**
* @constructor
*/
    constructor() {
        this.internalObj = 0;
        this.onFinishAssetPackageInstallation = function(assetPackageId, assetPackageFilePath, assetPackageType, error) {
        }
        this.onFinishTemplatePackageGenerate = function(assetPackageFilePath, error) {
        }
    }



/**
* @description 设置内置对象
* @param {} obj 对象
* @return {} 
*/
    setInternalObject(obj) {
        this.internalObj = obj;
    }


/**
* @description 获取内置对象
* @return {} 
*/
    getInternalObject() {
        return this.internalObj;
    }


/**
* @description 安装资源包
* @param {} assetPackageFilePath 资源包文件路径
* @param {} licenseFilePath 许可证文件路径
* @param {} type 类型
* @return {} 
*/
    installAssetPackage(assetPackageFilePath, licenseFilePath, type) {
        return Module.nvs_assetPackageManager_installAssetPackage(assetPackageFilePath, licenseFilePath, type);
    }


/**
* @description 卸载资源包
* @param {} assetPackageId 资源包ID
* @param {} type 类型
* @return {} 
*/
    uninstallAssetPackage(assetPackageId, type) {
        return Module.nvs_assetPackageManager_uninstallAssetPackage(assetPackageId, type);
    }


/**
* @description 获取资源包状态
* @param {} assetPackageId 资源包ID
* @param {} type 类型
* @return {} 
*/
    getAssetPackageStatus(assetPackageId, type) {
        return Module.nvs_assetPackageManager_getAssetPackageStatus(assetPackageId, type);
    }


/**
* @description 是否是粒子特效
* @param {} uuidString
* @return {} 
*/
    isParticleFX(uuidString) {
        return Module.nvs_assetPackageManager_isParticleFX(uuidString);
    }


/**
* @description 获取视频特效资源包描述
* @param {} uuidString 字符串唯一标识
* @return {} 
*/
    getVideoFxAssetPackageDescription(uuidString) {
        return Module.nvs_assetPackageManager_getVideoFxAssetPackageDescription(uuidString);
    }



/**
* @description 获取模板素材
* @param {} uuidString 字符串唯一标识
* @return {} 
*/
    getTemplateFootages(uuidString) {
        return Module.nvs_assetPackageManager_getTemplateFootages(uuidString);
    }


/**
* @description 获取模板字幕
* @param {} uuidString 字符串唯一标识
* @return {} 
*/
    getTemplateCaptions(uuidString) {
        return Module.nvs_assetPackageManager_getTemplateCaptions(uuidString);
    }


/**
* @description 获取模板组合字幕
* @return {} 
*/
    getTemplateCompoundCaptions() {
        return Module.nvs_assetPackageManager_getTemplateCompoundCaptions(uuidString);
    }



/**
* @description 获取模板包路径
* @param {} uuidString
* @return {} 
*/
    getTemplatePackageDirPath(uuidString) {
        return Module.nvs_assetPackageManager_getTemplatePackageDirPath(uuidString);
    }



/**
* @description 获取模板当前纵横比
* @param {} uuidString 字符串唯一标识
* @return {} 
*/
    getTemplateCurrentAspectRatio(uuidString) {
        return Module.nvs_assetPackageManager_getTemplateCurrentAspectRatio(uuidString);
    }


/**
* @description 获取模板缺省纵横比
* @param {} uuidString 字符串唯一标识
* @return {} 
*/
    getTemplateDefaultAspectRatio(uuidString) {
        return Module.nvs_assetPackageManager_getTemplateDefaultAspectRatio(uuidString);
    }



/**
* @description 写XML模板
* @param {} timeline
* @param {} aspectRatio
* @param {} uuidString
* @return {} 
*/
    writeTemplateXml(timeline, aspectRatio, uuidString) {
        return Module.nvs_assetPackageManager_writeTemplateXml(timeline, aspectRatio, uuidString);
    }



/**
* @description 生成模板包
* @param {} innerAssetDir 内置资源路径
* @param {} uuidString 字符串唯一标识
* @param {} outputPath 输出路径
* @return {} 
*/
    generateTemplatePackage(innerAssetDir, uuidString, outputPath) {
        return Module.nvs_assetPackageManager_generateTemplatePackage(innerAssetDir, uuidString, outputPath);
    }


/**
* @description 获取资源包根路径
* @return {} 
*/
    getAssetPackageRootDir() {
        return Module.nvs_assetPackageManager_getAssetPackageRootDir();
    }


/**
* @description 改变模板纵横比
* @param {} uuidString 字符串唯一标识
* @param {} aspectRatio 纵横比
* @return {} 
*/
    changeTemplateAspectRatio(uuidString, aspectRatio) {
        return Module.nvs_assetPackageManager_changeTemplateAspectRatio(uuidString, aspectRatio);
    }
}



/**
* @classdesc 区域信息类
*/
class NvsRegionInfo {

/**
* @constructor
*/
    constructor() {
        this.type = '';
        this.center = undefined;
        this.a = undefined;
        this.b = undefined;
        this.theta = undefined;
        this.points = [];
    }
}


/**
* @classdesc 特效类。特效类是视频特效(Video Fx),音频特效(Audio Fx),音频转场(Audio Transition),视频转场(Video Transition)等不同类型特效的基类。 在SDK框架中,特效是很关键的一部分,派生自NvsFx的每种不同类型的特效,或通过片段实例,或时间线实例,或轨道实例来添加,移除和获取。 同时,特效类中提供了不同的API接口来设置和获取特效参数类型。
* @extends NvsProjObj
*/
class NvsFx extends NvsProjObj {

/**
* @constructor
*/
    constructor() {
        super();
    }


/**
* @description 获取描述信息
* @return {} 
*/
    getDescription() {
        return Module.nvs_fx_getDescription(this.internalObj);
    }


/**
* @description 设置整数值
* @param {} fxParam 特效参数
* @param {} val 值
* @return {} 
*/
    setIntVal(fxParam, val) {
        Module.nvs_fx_setIntVal(this.internalObj, fxParam, val);
    }


/**
* @description 获取整数值
* @param {} fxParam 特效参数
* @return {} 
*/
    getIntVal(fxParam) {
        return Module.nvs_fx_getIntVal(this.internalObj, fxParam);
    }


/**
* @description 在某个时间设置整数值
* @param {} fxParam 特效参数
* @param {} val 值
* @param {} time 时间
* @return {} 
*/
    setIntValAtTime(fxParam, val, time) {
        Module.nvs_fx_setIntValAtTime(this.internalObj, fxParam, val, time);
    }


/**
* @description 在某个时间获取整数值
* @param {} fxParam 特效参数
* @param {} time 时间
* @return {} 
*/
    getIntValAtTime(fxParam, time) {
        return Module.nvs_fx_getIntValAtTime(this.internalObj, fxParam, time);
    }


/**
* @description 设置浮点值
* @param {} fxParam 特效参数
* @param {} val 值
* @return {} 
*/
    setFloatVal(fxParam, val) {
        Module.nvs_fx_setFloatVal(this.internalObj, fxParam, val);
    }


/**
* @description 获取浮点值
* @param {} fxParam 特效参数
* @return {} 
*/
    getFloatVal(fxParam) {
        return Module.nvs_fx_getFloatVal(this.internalObj, fxParam);
    }


/**
* @description 在某个时间设置浮点值
* @param {} fxParam 特效参数值
* @param {} val 值
* @param {} time 时间点
* @return {} 
*/
    setFloatValAtTime(fxParam, val, time) {
        Module.nvs_fx_setFloatValAtTime(this.internalObj, fxParam, val, time);
    }


/**
* @description 在某个时间获取浮点值
* @param {} fxParam 特效参数
* @param {} time 时间
* @return {} 
*/
    getFloatValAtTime(fxParam, time) {
        return Module.nvs_fx_getFloatValAtTime(this.internalObj, fxParam, time);
    }


/**
* @description 设置布尔值
* @param {} fxParam 特效参数
* @param {} val 具体值
* @return {} 
*/
    setBooleanVal(fxParam, val) {
        Module.nvs_fx_setBooleanVal(this.internalObj, fxParam, val);
    }



/**
* @description 获取布尔值
* @param {} fxParam 特效参数
* @return {} 
*/
    getBooleanVal(fxParam) {
        return Module.nvs_fx_getBooleanVal(this.internalObj, fxParam);
    }


/**
* @description 在某个时间设置布尔值
* @param {} fxParam 特效参数
* @param {} val 具体值
* @param {} time 时间
* @return {} 
*/
    setBooleanValAtTime(fxParam, val, time) {
        Module.nvs_fx_setBooleanValAtTime(this.internalObj, fxParam, val, time);
    }


/**
* @description 在某个时间获取布尔值
* @param {} fxParam 特效参数
* @param {} time 时间
* @return {} 
*/
    getBooleanValAtTime(fxParam, time) {
        return Module.nvs_fx_getBooleanValAtTime(this.internalObj, fxParam, time);
    }


/**
* @description 设置菜单值
* @param {} fxParam 特效参数
* @param {} val 菜单值
* @return {} 
*/
    setMenuVal(fxParam, val) {
        Module.nvs_fx_setMenuVal(this.internalObj, fxParam, val);
    }


/**
* @description 获取菜单值
* @param {} fxParam 特效参数
* @return {} 
*/
    getMenuVal(fxParam) {
        return Module.nvs_fx_getMenuVal(this.internalObj, fxParam);
    }



/**
* @description 在某个时间设置菜单值
* @param {} fxParam 特效参数
* @param {} val 值
* @param {} time 时间点
* @return {} 
*/
    setMenuValAtTime(fxParam, val, time) {
        Module.nvs_fx_setMenuValAtTime(this.internalObj, fxParam, val, time);
    }


/**
* @description 在某个时间获取菜单值
* @param {} fxParam 特效参数
* @param {} time 时间点
* @return {} 
*/
    getMenuValAtTime(fxParam, time) {
        return Module.nvs_fx_getMenuValAtTime(this.internalObj, fxParam, time);
    }


/**
* @description 设置字符串值
* @param {} fxParam 特效参数
* @param {} val 字符串值
* @return {} 
*/
    setStringVal(fxParam, val) {
        Module.nvs_fx_setStringVal(this.internalObj, fxParam, val);
    }


/**
* @description 获取字符串值
* @param {} fxParam 特效参数
* @return {} 
*/
    getStringVal(fxParam) {
        return Module.nvs_fx_getStringVal(this.internalObj, fxParam);
    }


/**
* @description 在某个时间点设置字符串值
* @param {} fxParam 特效参数
* @param {} val 字符串值
* @param {} time 时间点
* @return {} 
*/
    setStringValAtTime(fxParam, val, time) {
        Module.nvs_fx_setStringValAtTime(this.internalObj, fxParam, val, time);
    }


/**
* @description 在某个时间获取字符串值
* @param {} fxParam 特效参数
* @param {} time 时间点
* @return {} 
*/
    getStringValAtTime(fxParam, time) {
        return Module.nvs_fx_getStringValAtTime(this.internalObj, fxParam, time);
    }


/**
* @description 设置颜色值
* @param {} fxParam 特效参数
* @param {} val 颜色值
* @return {} 
*/
    setColorVal(fxParam, val) {
        Module.nvs_fx_setColorVal(this.internalObj, fxParam, val);
    }


/**
* @description 获取颜色值
* @param {} fxParam 特效参数
* @return {} 
*/
    getColorVal(fxParam) {
        return Module.nvs_fx_getColorVal(this.internalObj, fxParam);
    }


/**
* @description 在某个时间设置颜色
* @param {} fxParam 特效参数
* @param {} val 颜色值
* @param {} time 时间点
* @return {} 
*/
    setColorValAtTime(fxParam, val, time) {
        Module.nvs_fx_setColorValAtTime(this.internalObj, fxParam, val, time);
    }


/**
* @description 在某个时间点获取颜色值
* @param {} fxParam 特效参数
* @param {} time 时间点
* @return {} 
*/
    getColorValAtTime(fxParam, time) {
        return Module.nvs_fx_getColorValAtTime(this.internalObj, fxParam, time);
    }


/**
* @description 在某个时间删除关键帧
* @param {} fxParam 特效参数
* @param {} time 时间点
* @return {} 
*/
    removeKeyframeAtTime(fxParam, time) {
        return Module.nvs_fx_removeKeyframeAtTime(this.internalObj, fxParam, time);
    }


/**
* @description 删除所有关键帧
* @param {} fxParam 特效参数
* @return {} 
*/
    removeAllKeyframe(fxParam) {
        return Module.nvs_fx_removeAllKeyframe(this.internalObj, fxParam);
    }


/**
* @description 是否有关键帧列表
* @param {} fxParam 特效参数
* @return {} 
*/
    hasKeyframeList(fxParam) {
        return Module.nvs_fx_hasKeyframeList(this.internalObj, fxParam);
    }


/**
* @description 在某个时间查询关键帧
* @param {} fxParam 特效参数
* @param {} time 时间点
* @param {} flags 标识
* @return {} 
*/
    findKeyframeTime(fxParam, time, flags) {
        return Module.nvs_fx_findKeyframeTime(this.internalObj, fxParam, time, flags);
    }


/**
* @description 设置滤镜强度
* @param {} intensity 强度值
* @return {} 
*/
    setFilterIntensity(intensity) {
        Module.nvs_fx_setFilterIntensity(this.internalObj, intensity);
    }


/**
* @description 获取滤镜强度
* @return {} 
*/
    getFilterIntensity() {
        return Module.nvs_fx_getFilterIntensity(this.internalObj);
    }


/**
* @description 设置区域
* @param {} isRegional 是区域的
* @return {} 
*/
    setRegional(isRegional) {
        Module.nvs_fx_setRegional(this.internalObj, isRegional);
    }


/**
* @description 获取区域范围
* @return {} 
*/
    getRegional() {
        return Module.nvs_fx_getRegional(this.internalObj);
    }


/**
* @description 设置忽略背景
* @param {} isIgnoreBackground 是否忽略背景
* @return {} 
*/
    setIgnoreBackground(isIgnoreBackground) {
        Module.nvs_fx_setIgnoreBackground(this.internalObj, isIgnoreBackground);
    }


/**
* @description 获取忽略背景
* @return {} 
*/
    getIgnoreBackground() {
        return Module.nvs_fx_getIgnoreBackground(this.internalObj);
    }


/**
* @description 设置反转区域
* @param {} isInverseRegion 是否反转区域
* @return {} 
*/
    setInverseRegion(isInverseRegion) {
        Module.nvs_fx_setInverseRegion(this.internalObj, isInverseRegion);
    }


/**
* @description 获取反转区域
* @return {} 
*/
    getInverseRegion() {
        return Module.nvs_fx_getInverseRegion(this.internalObj);
    }


/**
* @description 设置区域
* @param {} region 区域对象
* @return {} 
*/
    setRegion(region) {
        Module.nvs_fx_setRegion(this.internalObj, region);
    }


/**
* @description 在某个时间设置区域
* @param {} region 区域对象
* @param {} time 时间点
* @return {} 
*/
    setRegionAtTime(region, time) {
        Module.nvs_fx_setRegionAtTime(this.internalObj, region, time);
    }


/**
* @description 设置椭圆区域
* @param {} center 居中
* @param {} a 长半轴
* @param {} b 短半轴
* @param {} angle 角度
* @return {} 
*/
    setEllipseRegion(center, a, b, angle) {
        Module.nvs_fx_setEllipseRegion(this.internalObj, center, a, b, angle);
    }


/**
* @description 在某个时间点设置椭圆区域
* @param {} center 居中
* @param {} a 长半轴
* @param {} b 短半轴
* @param {} angle 角度
* @param {} time 时间
* @return {} 
*/
    setEllipseRegionAtTime(center, a, b, angle, time) {
        Module.nvs_fx_setEllipseRegionAtTime(this.internalObj, center, a, b, angle, time);
    }


/**
* @description 获取区域信息
* @return {} 
*/
    getRegionInfos() {
        return Module.nvs_fx_getRegionInfos(this.internalObj);
    }


/**
* @description 在某个时间点获取区域信息
* @param {} time 时间点
* @return {} 
*/
    getRegionInfosAtTime(time) {
        return Module.nvs_fx_getRegionInfosAtTime(this.internalObj, time);
    }


/**
* @description 设置区域羽化宽度
* @param {} featherWidth 宽度值
* @return {} 
*/
    setRegionalFeatherWidth(featherWidth) {
        Module.nvs_fx_setRegionalFeatherWidth(this.internalObj, featherWidth);
    }


/**
* @description 获取区域羽化宽度
* @return {} 
*/
    getRegionalFeatherWidth() {
        return Module.nvs_fx_getRegionalFeatherWidth(this.internalObj);
    }


/**
* @description 获取粒子系统上下文
* @return {} 
*/
    getParticleSystemContext() {
        return Module.nvs_fx_getParticleSystemContext(this.internalObj);
    }


/**
* @description 获取ARScene操作
* @return {} 
*/
    getARSceneManipulate() {
        return Module.nvs_fx_getARSceneManipulate(this.internalObj);
    }


/**
* @description 设置Expr变量
* @param {} varName 变量名字
* @param {} varValue 变量值
* @return {} 
*/
    setExprVar(varName, varValue) {
        Module.nvs_fx_setExprVar(this.internalObj, varName, varValue);
    }

/**
* @description 获取Expr值
* @param {} varName 变量名字
* @return {} 
*/
    getExprVar(varName) {
        return Module.nvs_fx_getExprVar(this.internalObj, varName);
    }

/**
* @description 清除Expr值
* @return {} 
*/
    clearExprVar() {
        Module.nvs_fx_clearExprVar(this.internalObj);
    }


/**
* @description 清空表达式中定义的全部参数的值,并设置为默认值0
* @return {} 
*/
    clearExprVarCtx() {
        Module.nvs_fx_clearExprVarCtx(this.internalObj);
    }
}



/**
* @classdesc 时间线视频特效 时间线视频特效是作用于时间线实例上的视频特效。 时间线视频特效分为內建特效、包裹特效和自定义特效三种类型。 內建特效是集成在sdk内部的,不需要授权即可直接使用。包裹特效是将特效资源整合成了特效包,每个特效包都有其一一对应的授权文件,并且要先安装再使用,具体情况请参见素材包安装 自定义特效是用户通过编写代码实现的特效 时间线视频特效包含特效入点和出点,通过入点和出点我们可以指定特效作用于时间线的位置和长度,入点要小于出点,单位为微秒。 时间线视频特效允许叠加,渲染顺序通过预设Z值控制。
* @extends NvsFx
*/
class NvsTimelineVideoFx extends NvsFx {
/**
* @constructor
*/
    constructor() {
        super();
    }


/**
* @description 获取时间线视频特效类型
* @return {} 
*/
    getTimelineVideoFxType() {
        return Module.nvs_timelineVideoFx_getTimelineVideoFxType(this.internalObj);
    }


/**
* @description 获取内置时间线视频特效名字
* @return {} 
*/
    getBuiltinTimelineVideoFxName() {
        return Module.nvs_timelineVideoFx_getBuiltinTimelineVideoFxName(this.internalObj);
    }


/**
* @description 获取时间线视频特效包ID
* @return {} 
*/
    getTimelineVideoFxPackageId() {
        return Module.nvs_timelineVideoFx_getTimelineVideoFxPackageId(this.internalObj);
    }


/**
* @description 获取入点
* @return {} 
*/
    getInPoint() {
        return Module.nvs_timelineVideoFx_getInPoint(this.internalObj);
    }


/**
* @description 获取出点
* @return {} 
*/
    getOutPoint() {
        return Module.nvs_timelineVideoFx_getOutPoint(this.internalObj);
    }


/**
* @description 改变入点
* @param {} newInPoint 新的入点
* @return {} 
*/
    changeInPoint(newInPoint) {
        return Module.nvs_timelineVideoFx_changeInPoint(this.internalObj, newInPoint);
    }


/**
* @description 改变出点
* @param {} newOutPoint 新的出点
* @return {} 
*/
    changeOutPoint(newOutPoint) {
        return Module.nvs_timelineVideoFx_changeOutPoint(this.internalObj, newOutPoint);
    }


/**
* @description 移动位置
* @param {} offset 偏移量
* @return {} 
*/
    movePosition(offset) {
        Module.nvs_timelineVideoFx_movePosition(this.internalObj, offset);
    }


/**
* @description 设置Z值
* @param {} value Z值
* @return {} 
*/
    setZValue(value) {
        Module.nvs_timelineVideoFx_setZValue(this.internalObj, value);
    }


/**
* @description 获取Z值
* @return {} 
*/
    getZValue() {
        return Module.nvs_timelineVideoFx_getZValue(this.internalObj);
    }


/**
* @description 将点从规范映射到粒子系统
* @param {} ptCanonical
* @return {} 
*/
    mapPointFromCanonicalToParticleSystem(ptCanonical) {
        return Module.nvs_timelineVideoFx_mapPointFromCanonicalToParticleSystem(this.internalObj, ptCanonical);
    }
}



/**
* @classdesc 时间线字幕是视频上叠加的自定义文字。编辑视频时,可以添加和移除时间线字幕,并对字幕位置进行调整处理。添加完字幕,还可以进行样式设置,包括字体大小,颜色,阴影,描边等。
* @extends NvsFx
*/
class NvsTimelineCaption extends NvsFx {

/**
* @constructor
*/
    constructor() {
        super();
    }


/**
* @description 获取入点
* @return {} 
*/
    getInPoint() {
        return Module.nvs_caption_getInPoint(this.internalObj);
    }


/**
* @description 获取出点
* @return {} 
*/
    getOutPoint() {
        return Module.nvs_caption_getOutPoint(this.internalObj);
    }


/**
* @description 改变入点
* @param {} newInPoint 新的入点
* @return {} 
*/
    changeInPoint(newInPoint) {
        return Module.nvs_caption_changeInPoint(this.internalObj, newInPoint);
    }


/**
* @description 改变出点
* @param {} newOutPoint 新的出点
* @return {} 
*/
    changeOutPoint(newOutPoint) {
        return Module.nvs_caption_changeOutPoint(this.internalObj, newOutPoint);
    }


/**
* @description 移动位置
* @param {} offset 偏移量
* @return {} 
*/
    movePosition(offset) {
        Module.nvs_caption_movePosition(this.internalObj, offset);
    }


/**
* @description 获取主题角色
* @return {} 
*/
    getRoleInTheme() {
        return Module.nvs_caption_getRoleInTheme(this.internalObj);
    }


/**
* @description 获取分类
* @return {} 
*/
    getCategory() {
        return Module.nvs_caption_getCategory(this.internalObj);
    }


/**
* @description 获取字幕风格包ID
* @return {} 
*/
    getCaptionStylePackageId() {
        return Module.nvs_caption_getCaptionStylePackageId(this.internalObj);
    }


/**
* @description 获取模块化字幕上下文包 ID
* @return {} 
*/
    getModularCaptionContextPackageId() {
        return Module.nvs_caption_getModularCaptionContextPackageId(this.internalObj);
    }


/**
* @description 获取模块字幕渲染包ID
* @return {} 
*/
    getModularCaptionRendererPackageId() {
        return Module.nvs_caption_getModularCaptionRendererPackageId(this.internalObj);
    }


/**
* @description 获取模块字幕动画包ID
* @return {} 
*/
    getModularCaptionAnimationPackageId() {
        return Module.nvs_caption_getModularCaptionAnimationPackageId(this.internalObj);
    }


/**
* @description 获取模块字幕入动画包ID
* @return {} 
*/
    getModularCaptionInAnimationPackageId() {
        return Module.nvs_caption_getModularCaptionInAnimationPackageId(this.internalObj);
    }


/**
* @description 获取模块字幕出动画包ID
* @return {} 
*/
    getModularCaptionOutAnimationPackageId() {
        return Module.nvs_caption_getModularCaptionOutAnimationPackageId(this.internalObj);
    }


/**
* @description 应用字幕风格
* @param {} captionStylePackageId 字幕风格包ID
* @param {} isUseDefaultAssetParam 使用默认的资源参数
* @return {} 
*/
    applyCaptionStyle(captionStylePackageId, isUseDefaultAssetParam) {
        Module.nvs_caption_applyCaptionStyle(this.internalObj, captionStylePackageId, isUseDefaultAssetParam);
    }


/**
* @description 应用模块字幕上下文
* @param {} captionContextPackageId 字幕上下文包ID
* @return {} 
*/
    applyModularCaptionContext(captionContextPackageId) {
        Module.nvs_caption_applyModularCaptionContext(this.internalObj, captionContextPackageId);
    }


/**
* @description 应用模块字幕渲染
* @param {} captionRendererPackageId 字幕渲染包ID
* @return {} 
*/
    applyModularCaptionRenderer(captionRendererPackageId) {
        Module.nvs_caption_applyModularCaptionRenderer(this.internalObj, captionRendererPackageId);
    }


/**
* @description 应用模块字幕动画
* @param {} captionAnimationPackageId 字幕动画包ID
* @return {} 
*/
    applyModularCaptionAnimation(captionAnimationPackageId) {
        Module.nvs_caption_applyModularCaptionAnimation(this.internalObj, captionAnimationPackageId);
    }


/**
* @description 应用模块字幕入动画
* @param {} captionInAnimationPackageId 字幕入动画包ID
* @return {} 
*/
    applyModularCaptionInAnimation(captionInAnimationPackageId) {
        Module.nvs_caption_applyModularCaptionInAnimation(this.internalObj, captionInAnimationPackageId);
    }


/**
* @description 应用模块字幕出动画
* @param {} captionOutAnimationPackageId 字幕出动画包ID
* @return {} 
*/
    applyModularCaptionOutAnimation(captionOutAnimationPackageId) {
        Module.nvs_caption_applyModularCaptionOutAnimation(this.internalObj, captionOutAnimationPackageId);
    }


/**
* @description 设置模块字幕动画周期
* @param {} periodInMS 周期时间,毫秒计数
* @return {} 
*/
    setModularCaptionAnimationPeroid(periodInMS) {
        Module.nvs_caption_setModularCaptionAnimationPeroid(this.internalObj, periodInMS);
    }


/**
* @description 获取模块字幕动画周期
* @return {} 
*/
    getModularCaptionAnimationPeroid() {
        return Module.nvs_caption_getModularCaptionAnimationPeroid(this.internalObj);
    }


/**
* @description 设置模块字幕入动画时长
* @param {} inAnimationDurationInMS 入动画时长,毫秒计数
* @return {} 
*/
    setModularCaptionInAnimationDuration(inAnimationDurationInMS) {
        Module.nvs_caption_setModularCaptionInAnimationDuration(this.internalObj, inAnimationDurationInMS);
    }



/**
* @description 设置模块字幕入动画时长
* @return {} 
*/
    getModularCaptionInAnimationDuration() {
        return Module.nvs_caption_getModularCaptionInAnimationDuration(this.internalObj);
    }


/**
* @description 设置模块字幕出动画时长
* @param {} outAnimationDurationInMS 出动画时长,毫秒计数
* @return {} 
*/
    setModularCaptionOutAnimationDuration(outAnimationDurationInMS) {
        Module.nvs_caption_setModularCaptionOutAnimationDuration(this.internalObj, outAnimationDurationInMS);
    }


/**
* @description 获取模块字幕出动画持续时长
* @return {} 
*/
    getModularCaptionOutAnimationDuration() {
        return Module.nvs_caption_getModularCaptionOutAnimationDuration(this.internalObj);
    }


/**
* @description 设置字幕文本
* @param {} text 文本字符串
* @return {} text
*/
    setText(text) {
        Module.nvs_caption_setText(this.internalObj, text);
    }


/**
* @description 获取字幕文本
* @return {} 
*/
    getText() {
        return Module.nvs_caption_getText(this.internalObj);
    }


/**
* @description 设置文本对齐方式
* @param {} textAlign 对齐方式
* @return {} 
*/
    setTextAlignment(textAlign) {
        Module.nvs_caption_setTextAlignment(this.internalObj, textAlign);
    }



/**
* @description 获取文本对齐方式
* @return {} 
*/
    getTextAlignment() {
        return Module.nvs_caption_getTextAlignment(this.internalObj);
    }


/**
* @description 设置粗体
* @param {} bold 粗体
* @return {} 
*/
    setBold(bold) {
        Module.nvs_caption_setBold(this.internalObj, bold);
    }


/**
* @description 获取粗体
* @return {} 
*/
    getBold() {
        return Module.nvs_caption_getBold(this.internalObj);
    }


/**
* @description 设置斜体
* @param {} italic 斜体
* @return {} 
*/
    setItalic(italic) {
        Module.nvs_caption_setItalic(this.internalObj, italic);
    }


/**
* @description 获取斜体
* @return {} 
*/
    getItalic() {
        return Module.nvs_caption_getItalic(this.internalObj);
    }


/**
* @description 设置下划线
* @param {} underline 下划线
* @return {} 
*/
    setUnderline(underline) {
        Module.nvs_caption_setUnderline(this.internalObj, underline);
    }


/**
* @description 获取下划线
* @return {} 
*/
    getUnderline() {
        return Module.nvs_caption_getUnderline(this.internalObj);
    }


/**
* @description 设置字符间距类型
* @param {} letterSpacingType 类型标识
* @return {} 
*/
    setLetterSpacingType(letterSpacingType) {
        Module.nvs_caption_setLetterSpacingType(this.internalObj, letterSpacingType);
    }


/**
* @description 获取字符间距类型
* @return {} 
*/
    getLetterSpacingType() {
        return Module.nvs_caption_getLetterSpacingType(this.internalObj);
    }


/**
* @description 设置字符间距
* @param {} letterSpacing 字符间距
* @return {} 
*/
    setLetterSpacing(letterSpacing) {
        Module.nvs_caption_setLetterSpacing(this.internalObj, letterSpacing);
    }


/**
* @description 获取字符间距
* @return {} 
*/
    getLetterSpacing() {
        return Module.nvs_caption_getLetterSpacing(this.internalObj);
    }


/**
* @description 设置行距
* @param {} lineSpacing 行间距
* @return {} 
*/
    setLineSpacing(lineSpacing) {
        Module.nvs_caption_setLineSpacing(this.internalObj, lineSpacing);
    }


/**
* @description 获取行距
* @return {} 
*/
    getLineSpacing() {
        return Module.nvs_caption_getLineSpacing(this.internalObj);
    }


/**
* @description 设置字重
* @param {} weight 字重
* @return {} 
*/
    setWeight(weight) {
        Module.nvs_caption_setWeight(this.internalObj, weight);
    }



/**
* @description 获取字重
* @return {} 
*/
    getWeight() {
        return Module.nvs_caption_getWeight(this.internalObj);
    }



/**
* @description 设置文本颜色
* @param {} color 文字颜色
* @return {} 
*/
    setTextColor(color) {
        if (color === undefined || color === null || color === '')
            return;
        Module.nvs_caption_setTextColor(this.internalObj, color);
    }


/**
* @description 获取文本颜色
* @return {} 
*/
    getTextColor() {
        return Module.nvs_caption_getTextColor(this.internalObj);
    }


/**
* @description 设置绘制轮廓
* @param {} drawOutline 下划线
* @return {} 
*/
    setDrawOutline(drawOutline) {
        Module.nvs_caption_setDrawOutline(this.internalObj, drawOutline);
    }


/**
* @description 获取绘制轮廓
* @return {} 
*/
    getDrawOutline() {
        return Module.nvs_caption_getDrawOutline(this.internalObj);
    }


/**
* @description 设置轮廓宽度
* @param {} outlineWidth 轮廓宽度
* @return {} 
*/
    setOutlineWidth(outlineWidth) {
        Module.nvs_caption_setOutlineWidth(this.internalObj, outlineWidth);
    }


/**
* @description 获取轮廓宽度
* @return {} 
*/
    getOutlineWidth() {
        return Module.nvs_caption_getOutlineWidth(this.internalObj);
    }


/**
* @description 设置轮廓颜色
* @param {} color 颜色
* @return {} 
*/
    setOutlineColor(color) {
        if (color === undefined || color === null || color === '')
            return;
        Module.nvs_caption_setOutlineColor(this.internalObj, color);
    }


/**
* @description 获取轮廓颜色
* @return {} 
*/
    getOutlineColor() {
        return Module.nvs_caption_getOutlineColor(this.internalObj);
    }


/**
* @description 设置绘制阴影
* @param {} drawShadow 绘制阴影
* @return {} 
*/
    setDrawShadow(drawShadow) {
        Module.nvs_caption_setDrawShadow(this.internalObj, drawShadow);
    }


/**
* @description 获取绘制阴影
* @return {} 
*/
    getDrawShadow() {
        return Module.nvs_caption_getDrawShadow(this.internalObj);
    }


/**
* @description 设置阴影偏移
* @param {} offset 偏移量
* @return {} 
*/
    setShadowOffset(offset) {
        Module.nvs_caption_setShadowOffset(this.internalObj, offset);
    }


/**
* @description 获得阴影偏移
* @return {} 
*/
    getShadowOffset() {
        return Module.nvs_caption_getShadowOffset(this.internalObj);
    }


/**
* @description 设置阴影颜色
* @param {} color 背景颜色
* @return {} 
*/
    setShadowColor(color) {
        if (color === undefined || color === null || color === '')
            return;
        Module.nvs_caption_setShadowColor(this.internalObj, color);
    }


/**
* @description 获取阴影颜色
* @return {} 
*/
    getShadowColor() {
        return Module.nvs_caption_getShadowColor(this.internalObj);
    }


/**
* @description 设置阴影羽化
* @param {} feather 羽化
* @return {} 
*/
    setShadowFeather(feather) {
        Module.nvs_caption_setShadowFeather(this.internalObj, feather);
    }


/**
* @description 获取阴影羽化
* @return {} 
*/
    getShadowFeather() {
        return Module.nvs_caption_getShadowFeather(this.internalObj);
    }


/**
* @description 设置字体大小
* @param {} fontSize 字体大小
* @return {} 
*/
    setFontSize(fontSize) {
        Module.nvs_caption_setFontSize(this.internalObj, fontSize);
    }


/**
* @description 获取字体大小
* @return {} 
*/
    getFontSize() {
        return Module.nvs_caption_getFontSize(this.internalObj);
    }


/**
* @description 根据文件路径设置字体
* @param {} filePath 文件路径
* @return {} 
*/
    setFontByFilePath(filePath) {
        Module.nvs_caption_setFontByFilePath(this.internalObj, filePath);
    }


/**
* @description 获取字体文件路径
* @return {} 
*/
    getFontFilePath() {
        return Module.nvs_caption_getFontFilePath(this.internalObj);
    }


/**
* @description 设置字体家族
* @param {} family 字体家族
* @return {} 
*/
    setFontFamily(family) {
        Module.nvs_caption_setFontFamily(this.internalObj, family);
    }


/**
* @description 获取字体家族
* @return {} 
*/
    getFontFamily() {
        return Module.nvs_caption_getFontFamily(this.internalObj);
    }


/**
* @description 设置字幕转场
* @param {} translation 转场
* @return {} 
*/
    setCaptionTranslation(translation) {
        Module.nvs_caption_setCaptionTranslation(this.internalObj, translation);
    }


/**
* @description 获取字幕转场
* @return {} 
*/
    getCaptionTranslation() {
        return Module.nvs_caption_getCaptionTranslation(this.internalObj);
    }


/**
* @description 字幕转场
* @param {} translationOffset 转场偏移
* @return {} 
*/
    translateCaption(translationOffset) {
        Module.nvs_caption_translateCaption(this.internalObj, translationOffset);
    }


/**
* @description 设置锚点
* @param {} anchor 锚点
* @return {} 
*/
    setAnchorPoint(anchor) {
        Module.nvs_caption_setAnchorPoint(this.internalObj, anchor);
    }


/**
* @description 获取锚点
* @return {} 
*/
    getAnchorPoint() {
        return Module.nvs_caption_getAnchorPoint(this.internalObj);
    }


/**
* @description 设置X方向缩放
* @param {} scale 缩放比例
* @return {} 
*/
    setScaleX(scale) {
        Module.nvs_caption_setScaleX(this.internalObj, scale);
    }


/**
* @description 获取X方向缩放
* @return {} 
*/
    getScaleX() {
        return Module.nvs_caption_getScaleX(this.internalObj);
    }


/**
* @description 设置Y方向缩放
* @param {} scale 缩放比例
* @return {} 
*/
    setScaleY(scale) {
        Module.nvs_caption_setScaleY(this.internalObj, scale);
    }


/**
* @description 获取Y方向缩放
* @return {} 
*/
    getScaleY() {
        return Module.nvs_caption_getScaleY(this.internalObj);
    }


/**
* @description 缩放字幕
* @param {} scaleFactor 缩放因子
* @param {} anchor 锚点
* @return {} 
*/
    scaleCaption(scaleFactor, anchor) {
        Module.nvs_caption_scaleCaption(this.internalObj, scaleFactor, anchor);
    }


/**
* @description 缩放字幕
* @param {} scaleFactor 缩放因子
* @return {} 
*/
    scaleCaption2(scaleFactor) {
        var rect = this.getTextBoundingRect();
        this.scaleCaption(scaleFactor, new NvsPointF((rect.left + rect.right) / 2, (rect.top + rect.bottom) / 2));
    }



/**
* @description 设置Z方向旋转
* @param {} angle 角度
* @return {} 
*/
    setRotationZ(angle) {
        Module.nvs_caption_setRotationZ(this.internalObj, angle);
    }



/**
* @description 获取Z方向旋转
* @return {} 
*/
    getRotationZ() {
        return Module.nvs_caption_getRotationZ(this.internalObj);
    }


/**
* @description 旋转字幕
* @param {} angle 角度
* @param {} anchor 锚点
* @return {} 
*/
    rotateCaption(angle, anchor) {
        Module.nvs_caption_rotateCaption(this.internalObj, angle, anchor);
    }


/**
* @description 旋转字幕
* @param {} angle 角度
* @return {} 
*/
    rotateCaption2(angle) {
        var rect = this.getTextBoundingRect();
        this.rotateCaption(angle, new NvsPointF((rect.left + rect.right) / 2, (rect.top + rect.bottom) / 2));
    }


/**
* @description 获取文本边界矩形
* @return {} 
*/
    getTextBoundingRect() {
        return Module.nvs_caption_getTextBoundingRect(this.internalObj);
    }


/**
* @description 获取边界矩形顶点
* @return {} 
*/
    getBoundingRectangleVertices() {
        return Module.nvs_caption_getBoundingRectangleVertices(this.internalObj);
    }


/**
* @description 获取字幕边界顶点
* @param {} boundingType 边界类型
* @return {} 
*/
    getCaptionBoundingVertices(boundingType) {
        return Module.nvs_caption_getCaptionBoundingVertices(this.internalObj, boundingType);
    }


/**
* @description 设置Z值
* @param {} value Z值
* @return {} 
*/
    setZValue(value) {
        Module.nvs_caption_setZValue(this.internalObj, value);
    }


/**
* @description 获取Z值
* @return {} 
*/
    getZValue() {
        return Module.nvs_caption_getZValue(this.internalObj);
    }


/**
* @description 设置录制用户操作
* @param {} recordingUserOperation 记录用户操作
* @return {} 
*/
    setRecordingUserOperation(recordingUserOperation) {
        Module.nvs_caption_setRecordingUserOperation(this.internalObj, recordingUserOperation);
    }


/**
* @description 设置不透明度
* @param {} opacity 不透明度
* @return {} 
*/
    setOpacity(opacity) {
        Module.nvs_caption_setOpacity(this.internalObj, opacity);
    }


/**
* @description 获取不透明度
* @return {} 
*/
    getOpacity() {
        return Module.nvs_caption_getOpacity(this.internalObj);
    }


/**
* @description 是否帧字幕
* @return {} 
*/
    isFrameCaption() {
        return Module.nvs_caption_isFrameCaption(this.internalObj);
    }



/**
* @description 是否文本颜色改变
* @return {} 
*/
    isTextColorChanged() {
        return Module.nvs_caption_isTextColorChanged(this.internalObj);
    }


/**
* @description 是否是模块化
* @return {} 
*/
    isModular() {
        return Module.nvs_caption_isModular(this.internalObj);
    }



/**
* @description 设置背景颜色
* @param {} backgroundColor 背景颜色
* @return {} 
*/
    setBackgroundColor(backgroundColor) {
        Module.nvs_caption_setBackgroundColor(this.internalObj, backgroundColor);
    }


/**
* @description 获取背景颜色
* @return {} 
*/
    getBackgroundColor() {
        return Module.nvs_caption_getBackgroundColor(this.internalObj);
    }


/**
* @description 设置背景半径
* @param {} radius 半径
* @return {} 
*/
    setBackgroundRadius(radius) {
        Module.nvs_caption_setBackgroundRadius(this.internalObj, radius);
    }


/**
* @description 获取背景半径
* @return {} 
*/
    getBackgroundRadius() {
        return Module.nvs_caption_getBackgroundRadius(this.internalObj);
    }


/**
* @description 设置当前关键帧时间
* @param {} time 时间
* @return {} 
*/
    setCurrentKeyFrameTime(time) {
        Module.nvs_caption_setCurrentKeyFrameTime(this.internalObj, time);
    }


/**
* @description 设置是否是歌词
* @param {} isLyrics 是否是歌词
* @return {} 
*/
    setIsLyrics(isLyrics) {
        Module.nvs_caption_setIsLyrics(this.internalObj, isLyrics);
    }


/**
* @description 是否是歌词
* @return {} 
*/
    isLyrics() {
        return Module.nvs_caption_isLyrics(this.internalObj);
    }


/**
* @description 设置帧字幕最大字体大小
* @param {} maxFontSize 最大字体大小
* @return {} 
*/
    setFrameCaptionMaxFontSize(maxFontSize) {
        Module.nvs_caption_setFrameCaptionMaxFontSize(this.internalObj, maxFontSize);
    }


/**
* @description 设置文本框原点矩形
* @param {} rect 矩形
* @return {} 
*/
    setTextFrameOriginRect(rect) {
        Module.nvs_caption_setTextFrameOriginRect(this.internalObj, rect);
    }
}



/**
* @classdesc 运动参数
*/
class NvsMotionParameters {

/**
* @constructor
*/
    constructor() {
        this.anchorX = 0;
        this.anchorY = 0;
        this.scaleX = 1;
        this.scaleY = 1;
        this.rotationZ = 0;
        this.transX = 0;
        this.transY = 0;
    }
}



/**
* @classdesc 时间线复合字幕。时间线复合字幕是视频上叠加的组合型文字,每个复合字幕包含若干个子字幕。编辑视频时,可以添加和移除时间线复合字幕,并对字幕位置进行调整处理,还可以对字体,颜色属性进行修改。
* @extends NvsFx
*/
class NvsTimelineCompoundCaption extends NvsFx {
	
/**
* @constructor
*/
    constructor() {
        super();
    }


/**
* @description 获取字幕数量
* @return {} 
*/
    getCaptionCount() {
        return Module.nvs_compoundCaption_getCaptionCount(this.internalObj);
    }


/**
* @description 获取入点
* @return {} 
*/
    getInPoint() {
        return Module.nvs_compoundCaption_getInPoint(this.internalObj);
    }


/**
* @description 获取出点
* @return {} 
*/
    getOutPoint() {
        return Module.nvs_compoundCaption_getOutPoint(this.internalObj);
    }


/**
* @description 改变入点
* @param {} newInPoint 新入点
* @return {} 
*/
    changeInPoint(newInPoint) {
        return Module.nvs_compoundCaption_changeInPoint(this.internalObj, newInPoint);
    }


/**
* @description 改变出点
* @param {} newOutPoint 新出点
* @return {} 
*/
    changeOutPoint(newOutPoint) {
        return Module.nvs_compoundCaption_changeOutPoint(this.internalObj, newOutPoint);
    }


/**
* @description 移动位置
* @param {} offset 偏移量
* @return {} 
*/
    movePosition(offset) {
        Module.nvs_compoundCaption_movePosition(this.internalObj, offset);
    }


/**
* @description 设置文本
* @param {} captionIndex 字幕索引
* @param {} text 文本
* @return {} 
*/
    setText(captionIndex, text) {
        Module.nvs_compoundCaption_setText(this.internalObj, captionIndex, text);
    }


/**
* @description 获取文本
* @param {} captionIndex 字幕索引
* @return {} 
*/
    getText(captionIndex) {
        return Module.nvs_compoundCaption_getText(this.internalObj, captionIndex);
    }


/**
* @description 设置文本颜色
* @param {} captionIndex 字幕索引
* @param {} color 颜色
* @return {} 
*/
    setTextColor(captionIndex, color) {
        if (color === undefined || color === null || color === '')
            return;
        Module.nvs_compoundCaption_setTextColor(this.internalObj, captionIndex, color);
    }


/**
* @description 获取文本颜色
* @param {} captionIndex 字幕索引
* @return {} 
*/
    getTextColor(captionIndex) {
        return Module.nvs_compoundCaption_getTextColor(this.internalObj, captionIndex);
    }


/**
* @description 设置字体家族
* @param {} captionIndex 字幕索引
* @param {} family 字体家族
* @return {} 
*/
    setFontFamily(captionIndex, family) {
        Module.nvs_compoundCaption_setFontFamily(this.internalObj, captionIndex, family);
    }


/**
* @description 获取字体家族
* @param {} captionIndex 字幕索引
* @return {} 
*/
    getFontFamily(captionIndex) {
        return Module.nvs_compoundCaption_getFontFamily(this.internalObj, captionIndex);
    }


/**
* @description 设置字幕平移
* @param {} translation 转场
* @return {} 
*/
    setCaptionTranslation(translation) {
        Module.nvs_compoundCaption_setCaptionTranslation(this.internalObj, translation);
    }


/**
* @description 获取字幕平移
* @return {} 
*/
    getCaptionTranslation() {
        return Module.nvs_compoundCaption_getCaptionTranslation(this.internalObj);
    }


/**
* @description 平移字幕
* @param {} translationOffset 转场偏移
* @return {} 
*/
    translateCaption(translationOffset) {
        Module.nvs_compoundCaption_translateCaption(this.internalObj, translationOffset);
    }


/**
* @description 设置锚点
* @param {} anchor 锚点
* @return {} 
*/
    setAnchorPoint(anchor) {
        Module.nvs_compoundCaption_setAnchorPoint(this.internalObj, anchor);
    }


/**
* @description 获取锚点
* @return {} 
*/
    getAnchorPoint() {
        return Module.nvs_compoundCaption_getAnchorPoint(this.internalObj);
    }


/**
* @description 设置X方向缩放
* @param {} scale 缩放
* @return {} 
*/
    setScaleX(scale) {
        Module.nvs_compoundCaption_setScaleX(this.internalObj, scale);
    }


/**
* @description 获取X方向缩放
* @return {} 
*/
    getScaleX() {
        return Module.nvs_compoundCaption_getScaleX(this.internalObj);
    }



/**
* @description 设置Y方向缩放
* @param {} scale 缩放
* @return {} 
*/
    setScaleY(scale) {
        Module.nvs_compoundCaption_setScaleY(this.internalObj, scale);
    }


/**
* @description 获取Y方向缩放
* @return {} 
*/
    getScaleY() {
        return Module.nvs_compoundCaption_getScaleY(this.internalObj);
    }


/**
* @description 缩放字幕
* @param {} scaleFactor 缩放因子
* @param {} anchor 锚点
* @return {} 
*/
    scaleCaption(scaleFactor, anchor) {
        Module.nvs_compoundCaption_scaleCaption(this.internalObj, scaleFactor, anchor);
    }


/**
* @description 设置Z方向旋转
* @param {} angle 角度
* @return {} 
*/
    setRotationZ(angle) {
        Module.nvs_compoundCaption_setRotationZ(this.internalObj, angle);
    }



/**
* @description 获取Z方向旋转
* @return {} 
*/
    getRotationZ() {
        return Module.nvs_compoundCaption_getRotationZ(this.internalObj);
    }


/**
* @description 旋转字幕
* @param {} angle 角度
* @param {} anchor 锚点
* @return {} 
*/
    rotateCaption(angle, anchor) {
        Module.nvs_compoundCaption_rotateCaption(this.internalObj, angle, anchor);
    }


/**
* @description 旋转字幕
* @param {} angle 角度
* @return {} 
*/
    rotateCaption2(angle) {
        var vertices = this.getCompoundBoundingVertices(1);
        if (!vertices || vertices.size() !== 4) return;

        var cx = 0;
        var cy = 0;
        for (var i = 0; i < 4; ++i) {
            var pt = vertices.get(i);
            cx += pt.x;
            cy += pt.y;
        }
        this.rotateCaption(angle, new NvsPointF(cx / 4, cy / 4));
    }



/**
* @description 获取字幕边界顶点
* @param {} captionIndex 字幕索引
* @param {} boudingType 边界类型
* @param {} motionParams 运动参数
* @return {} 
*/
    getCaptionBoundingVertices(captionIndex, boudingType, motionParams) {
        return Module.nvs_compoundCaption_getCaptionBoundingVertices(this.internalObj, captionIndex, boudingType, motionParams);
    }


/**
* @description 获取组合边界顶点
* @param {} boudingType 边界类型
* @param {} motionParams 运动参数
* @return {} 
*/
    getCompoundBoundingVertices(boudingType, motionParams) {
        return Module.nvs_compoundCaption_getCompoundBoundingVertices(this.internalObj, boudingType, motionParams);
    }



/**
* @description 设置Z值
* @param {} value Z值大小
* @return {} 
*/
    setZValue(value) {
        Module.nvs_compoundCaption_setZValue(this.internalObj, value);
    }


/**
* @description 获取Z值
* @return {} 
*/
    getZValue() {
        return Module.nvs_compoundCaption_getZValue(this.internalObj);
    }


/**
* @description 设置不透明度
* @param {} value 不透明度大小
* @return {} 
*/
    setOpacity(value) {
        Module.nvs_compoundCaption_setOpacity(this.internalObj, value);
    }


/**
* @description 获取不透明度
* @return {} 
*/
    getOpacity() {
        return Module.nvs_compoundCaption_getOpacity(this.internalObj);
    }


/**
* @description 是否帧字幕
* @param {} captionIndex 字幕索引
* @return {} 
*/
    isFrameCaption(captionIndex) {
        return Module.nvs_compoundCaption_isFrameCaption(this.internalObj, captionIndex);
    }



/**
* @description 获取字幕风格包ID
* @return {} 
*/
    getCaptionStylePackageId() {
        return Module.nvs_compoundCaption_getCaptionStylePackageId(this.internalObj);
    }
}



/**
* @classdesc 时间线动画贴纸类。时间线动画贴纸是视频编辑时使用的一种美化特效,可以产生动画效果。 用户可以在时间线上添加和移除动画贴纸,也可以通过各种API调整贴纸的各种属性,如位置、大小、显示时间等等。注:动画贴纸在时间线上的入点和出点单位都为微秒。
* @extends NvsFx
*/
class NvsTimelineAnimatedSticker extends NvsFx {
	
/**
* @constructor
*/
    constructor() {
        super();
    }


/**
* @description 获取入点
* @return {} 
*/
    getInPoint() {
        return Module.nvs_animatedSticker_getInPoint(this.internalObj);
    }


/**
* @description 获取出点
* @return {} 
*/
    getOutPoint() {
        return Module.nvs_animatedSticker_getOutPoint(this.internalObj);
    }


/**
* @description 改变入点
* @param {} newInPoint 新的入点
* @return {} 
*/
    changeInPoint(newInPoint) {
        return Module.nvs_animatedSticker_changeInPoint(this.internalObj, newInPoint);
    }


/**
* @description 改变出点
* @param {} newOutPoint 新的出点
* @return {} 
*/
    changeOutPoint(newOutPoint) {
        return Module.nvs_animatedSticker_changeOutPoint(this.internalObj, newOutPoint);
    }


/**
* @description 移动位置
* @param {} offset 偏移量
* @return {} 
*/
    movePosition(offset) {
        Module.nvs_animatedSticker_movePosition(this.internalObj, offset);
    }


/**
* @description 设置转场
* @param {} translation 转场
* @return {} 
*/
    setTranslation(translation) {
        Module.nvs_animatedSticker_setTranslation(this.internalObj, translation);
    }


/**
* @description 获取转场
* @return {} 
*/
    getTranslation() {
        return Module.nvs_animatedSticker_getTranslation(this.internalObj);
    }


/**
* @description 转场动画贴纸
* @param {} translationOffset 转场偏移量
* @return {} 
*/
    translateAnimatedSticker(translationOffset) {
        Module.nvs_animatedSticker_translateAnimatedSticker(this.internalObj, translationOffset);
    }


/**
* @description 设置缩放
* @param {} scale 缩放值
* @return {} 
*/
    setScale(scale) {
        Module.nvs_animatedSticker_setScale(this.internalObj, scale);
    }


/**
* @description 获取缩放
* @return {} 
*/
    getScale() {
        return Module.nvs_animatedSticker_getScale(this.internalObj);
    }


/**
* @description 缩放动画贴纸
* @param {} scaleFactor 缩放因子
* @param {} anchor 锚点
* @return {} 
*/
    scaleAnimatedSticker(scaleFactor, anchor) {
        Module.nvs_animatedSticker_scaleAnimatedSticker(this.internalObj, scaleFactor, anchor);
    }


/**
* @description 缩放动画贴纸
* @param {} scaleFactor 缩放因子
* @return {} 
*/
    scaleAnimatedSticker2(scaleFactor) {
        var left, right, top, bottom;
        var list = this.getBoundingRectangleVertices();
        var point = list.get(0);
        left = right = point.x;
        top = bottom = point.y;
        for (var i = 1; i < 4; i++) {
            point = list.get(i);
            if (point.x < left)
                left = point.x;
            else if (point.x > right)
                right = point.x;
            if (point.y < bottom)
                bottom = point.y;
            else if (point.y > top)
                top = point.y;
        }
        this.scaleAnimatedSticker(scaleFactor, new NvsPointF((left + right) / 2, (top + bottom) / 2));
    }



/**
* @description 设置Z方向旋转
* @param {} angle 角度
* @return {} 
*/
    setRotationZ(angle) {
        Module.nvs_animatedSticker_setRotationZ(this.internalObj, angle);
    }


/**
* @description 获取Z方向旋转
* @return {} 
*/
    getRotationZ() {
        return Module.nvs_animatedSticker_getRotationZ(this.internalObj);
    }


/**
* @description 旋转动画贴纸
* @param {} angle 角度
* @param {} anchor 锚点
* @return {} 
*/
    rotateAnimatedSticker(angle, anchor) {
        Module.nvs_animatedSticker_rotateAnimatedSticker(this.internalObj, angle, anchor);
    }


/**
* @description 旋转动画贴纸
* @param {} angle 角度
* @return {} 
*/
    rotateAnimatedSticker2(angle) {
        var left, right, top, bottom;
        var list = this.getBoundingRectangleVertices();
        var point = list.get(0);
        left = right = point.x;
        top = bottom = point.y;
        for (var i = 1; i < 4; i++) {
            point = list.get(i);
            if (point.x < left)
                left = point.x;
            else if (point.x > right)
                right = point.x;
            if (point.y < bottom)
                bottom = point.y;
            else if (point.y > top)
                top = point.y;
        }
        this.rotateAnimatedSticker(angle, new NvsPointF((left + right) / 2, (top + bottom) / 2));
    }


/**
* @description 设置水平翻转
* @param {} flip 翻转
* @return {} 
*/
    setHorizontalFlip(flip) {
        Module.nvs_animatedSticker_setHorizontalFlip(this.internalObj, flip);
    }


/**
* @description 获取水平翻转
* @return {} 
*/
    getHorizontalFlip() {
        return Module.nvs_animatedSticker_getHorizontalFlip(this.internalObj);
    }


/**
* @description 设置垂直翻转
* @param {} flip 翻转
* @return {} 
*/
    setVerticalFlip(flip) {
        Module.nvs_animatedSticker_setVerticalFlip(this.internalObj, flip);
    }



/**
* @description 获取垂直翻转
* @return {} 
*/
    getVerticalFlip() {
        return Module.nvs_animatedSticker_getVerticalFlip(this.internalObj);
    }


/**
* @description 获取边界矩形顶点
* @return {} 
*/
    getBoundingRectangleVertices() {
        return Module.nvs_animatedSticker_getBoundingRectangleVertices(this.internalObj);
    }


/**
* @description 获取动画贴纸包ID
* @return {} 
*/
    getAnimatedStickerPackageId() {
        return Module.nvs_animatedSticker_getAnimatedStickerPackageId(this.internalObj);
    }



/**
* @description 设置Z值
* @param {} value Z值大小
* @return {} 
*/
    setZValue(value) {
        Module.nvs_animatedSticker_setZValue(this.internalObj, value);
    }


/**
* @description 获取Z值
* @return {} 
*/
    getZValue() {
        return Module.nvs_animatedSticker_getZValue(this.internalObj);
    }


/**
* @description 是否是音频
* @return {} 
*/
    hasAudio() {
        return Module.nvs_animatedSticker_hasAudio(this.internalObj);
    }


/**
* @description 设置音量增益
* @param {} leftVolumeGain 左音量增益
* @param {} rightVolumeGain 右音量增益
* @return {}  
*/
    setVolumeGain(leftVolumeGain, rightVolumeGain) {
        Module.nvs_animatedSticker_setVolumeGain(this.internalObj, leftVolumeGain, rightVolumeGain);
    }


/**
* @description 获取音量增益
* @return {} 
*/
    getVolumeGain() {
        return Module.nvs_animatedSticker_getVolumeGain(this.internalObj);
    }


/**
* @description 设置不透明度
* @param {} opacity 不透明度值
* @return {} 
*/
    setOpacity(opacity) {
        Module.nvs_animatedSticker_setOpacity(this.internalObj, opacity);
    }


/**
* @description 获取不透明度
* @return {} 
*/
    getOpacity() {
        return Module.nvs_animatedSticker_getOpacity(this.internalObj);
    }


/**
* @description 设置当前关键帧时间
* @param {} time 时间
* @return {} 
*/
    setCurrentKeyFrameTime(time) {
        Module.nvs_animatedSticker_setCurrentKeyFrameTime(this.internalObj, time);
    }
}



/**
* @classdesc 视频转场,片段间切换的特效。轨道上有多个片段,转场是从一个视频片段播放到另一个视频片段的衔接过渡效果,而在有间隙的片段之间不能添加视频转场。目前支持多种视频转场, 包括Fade(淡入淡出)、Turning(翻转)、Swap(层叠)、Stretch In(伸展进入)、Page Curl(卷页)、Lens Flare(镜头眩光)、Star(星形)、Dip To Black(闪黑)、Dip To White(闪白)、 Push To Right(右推拉)、Push To Top(上推拉)、Upper Left Into(斜推)。每种视频转场都可通过视频轨道(NvsVideoTrack)来设置和获取。默认转场是Fade(淡入淡出)。
* @extends NvsFx
*/
class NvsVideoTransition extends NvsFx {
	
/**
* @constructor
*/
    constructor() {
        super();
    }


/**
* @description 获取视频转场类型
* @return {} 
*/
    getVideoTransitionType() {
        return Module.nvs_videoTransition_getVideoTransitionType(this.internalObj);
    }


/**
* @description 获取内置视频转场名字
* @return {} 
*/
    getBuiltinVideoTransitionName() {
        return Module.nvs_videoTransition_getBuiltinVideoTransitionName(this.internalObj);
    }


/**
* @description 获取视频转场包ID
* @return {} 
*/
    getVideoTransitionPackageId() {
        return Module.nvs_videoTransition_getVideoTransitionPackageId(this.internalObj);
    }


/**
* @description 设置视频转场持续时间
* @param {} duration 持续时间
* @param {} matchMode 比较模式
* @return {} 
*/
    setVideoTransitionDuration(duration, matchMode) {
        return Module.nvs_videoTransition_setVideoTransitionDuration(this.internalObj, duration, matchMode);
    }


/**
* @description 获取视频转场持续时间
* @return {} 
*/
    getVideoTransitionDuration() {
        return Module.nvs_videoTransition_getVideoTransitionDuration(this.internalObj);
    }
}



/**
* @classdesc 音频转场,音频片段间切换的特效。一般通过音频轨道(Audio Track)来设置和获取音频转场。目前默认音频转场是淡入淡出转场(fade)。
* @extends NvsFx
*/
class NvsAudioTransition extends NvsFx {

/**
* @constructor
*/
    constructor() {
        super();
    }
}



/**
* @classdesc 视频特效。视频特效是显示在视频片段上的特效,能够改变视频图像整体或者局部的颜色、亮度、透明度等,使视频显示出特殊的效果。在视频片段(Video Clip)上,可以添加、移除、获取多个视频特效。
* @extends NvsFx
*/
class NvsVideoFx extends NvsFx {
/**
* @constructor
*/
    constructor() {
        super();
    }


/**
* @description 获取视频特效类型
* @return {} 
*/
    getVideoFxType() {
        return Module.nvs_videoFx_getVideoFxType(this.internalObj);
    }


/**
* @description 获取视频特效索引
* @return {} 
*/
    getIndex() {
        return Module.nvs_videoFx_getIndex(this.internalObj);
    }


/**
* @description 获取内置视频特效名字
* @return {} 
*/
    getBuiltinVideoFxName() {
        return Module.nvs_videoFx_getBuiltinVideoFxName(this.internalObj);
    }


/**
* @description 获取视频特效包ID
* @return {} 
*/
    getVideoFxPackageId() {
        return Module.nvs_videoFx_getVideoFxPackageId(this.internalObj);
    }



/**
* @description 将点从规范映射到粒子系统
* @param {} ptCanonical
* @return {} 
*/
    mapPointFromCanonicalToParticleSystem(ptCanonical) {
        return Module.nvs_videoFx_mapPointFromCanonicalToParticleSystem(this.internalObj, ptCanonical);
    }
}



/**
* @classdesc 音频特效。音频特效是叠加显示在音频片段上的特效,可以改变音频片段的声调和速率。获取音频片段(Audio Clip)对象实例后,根据需要来添加或者移除多个音频特效。
* @extends NvsFx
*/
class NvsAudioFx extends NvsFx {

/**
* @constructor
*/
    constructor() {
        super();
    }



/**
* @description 获取音频特效索引
* @return {} 
*/
    getIndex() {
        return Module.nvs_audioFx_getIndex(this.internalObj);
    }



/**
* @description 获取内置音频特效名字
* @return {} 
*/
    getBuiltinAudioFxName() {
        return Module.nvs_audioFx_getBuiltinAudioFxName(this.internalObj);
    }
}


/**
* @classdesc 参数信息对象类
*/
class NvsParamInfoObject {

/**
* @constructor
*/
    constructor() {
        this.paramName = '';
        this.paramType = '';
        this.intDefVal = 0;
        this.intMinVal = 0;
        this.intMaxVal = 0;
        this.floatDefVal = 0;
        this.floatMinVal = 0;
        this.floatMaxVal = 0;
        this.boolDefVal = false;
        this.colorDefR = 0;
        this.colorDefG = 0;
        this.colorDefB = 0;
        this.colorDefA = 0;
        this.stringType = 0;
        this.stringDef = '';
    }
}


/**
* @classdesc 特效参数描述类。在视频拍摄和编辑时会设置各种不同参数类型的特效,特效参数描述类就是专门用来获取各种特效参数值的,以便查看和了解。
*/
class NvsFxDescription {
/**
* @constructor
*/
    constructor() {
        this.internalObj = 0;
    }


/**
* @description 获取名字
* @return {} 
*/
    getName() {
        return Module.nvs_fxDescription_getName(this.internalObj);
    }


/**
* @description 获取所有参数信息
* @return {} 
*/
    getAllParamsInfo() {
        return Module.nvs_fxDescription_getAllParamsInfo(this.internalObj);
    }
}


/**
* @classdesc 粒子特效上下文 粒子系统的由若干粒子发生器和子粒子发生器构成。粒子发生器会随着时间推移不断发射出粒子,而子粒子发生器则会在粒子发生器发射出的粒子上面发射出粒子。
*/
class NvsParticleSystemContext {
/**
* @constructor
*/
    constructor() {
        this.contextInterface = 0;
    }


/**
* @description 设置发射器启用
* @param {} emitterName 发射器名称
* @param {} enable 启动标记
* @return {} 
*/
    setEmitterEnabled(emitterName, enable) {
        Module.nvs_particleSystemContext_setEmitterEnabled(this.contextInterface, emitterName, enable);
    }


/**
* @description 设置发射器位置
* @param {} emitterName 发射器名称
* @param {} emitterPositionX 发射器位置X坐标
* @param {} emitterPositionY 发射器位置Y坐标
* @return {} 
*/
    setEmitterPosition(emitterName, emitterPositionX, emitterPositionY) {
        Module.nvs_particleSystemContext_setEmitterPosition(this.contextInterface, emitterName, emitterPositionX, emitterPositionY);
    }


/**
* @description 将位置附加到发射器位置曲线
* @param {} emitterName 发射器名称
* @param {} timeSec
* @param {} emitterPositionX
* @param {} emitterPositionY
* @return {} 
*/
    appendPositionToEmitterPositionCurve(emitterName, timeSec, emitterPositionX, emitterPositionY) {
        Module.nvs_particleSystemContext_appendPositionToEmitterPositionCurve(this.contextInterface, emitterName, timeSec, emitterPositionX, emitterPositionY);
    }


/**
* @description 设置发射器速率增益
* @param {} emitterName 发射器名称
* @param {} emitterGain 发和气增益
* @return {} 
*/
    setEmitterRateGain(emitterName, emitterGain) {
        Module.nvs_particleSystemContext_setEmitterRateGain(this.contextInterface, emitterName, emitterGain);
    }



/**
* @description 设置发射粒子大小增益
* @param {} emitterName 发射器名称
* @param {} emitterGain 发射器增益
* @return {} 
*/
    setEmitterParticleSizeGain(emitterName, emitterGain) {
        Module.nvs_particleSystemContext_setEmitterParticleSizeGain(this.contextInterface, emitterName, emitterGain);
    }
}


/**
* @classdesc ARScene 操作。
*/
class NvsARSceneManipulate {
/**
* @constructor
*/
    constructor() {
        this.contextInterface = 0;
    }



/**
* @description 设置检测模式
* @param {} mode 检测模式
* @return {} 
*/
    setDetectionMode(mode) {
        Module.nvs_arSceneManipulate_setDetectionMode(this.contextInterface, mode);
    }
}



/**
* @description 使用模板
*/
const NvsParticleTypeEnum = Object.freeze({
    "PARTICLE_TYPE_NORMAL" : 0,
    "PARTICLE_TYPE_TOUCH" : 1,
    "PARTICLE_TYPE_GESTURE" : 2,
    "PARTICLE_TYPE_EYE" : 3,
    "PARTICLE_TYPE_MOUTH" : 4});



/**
* @description 使用模板
*/
const NvsEmitterPlaceEnum = Object.freeze({
    "EMITTER_PLACE_LEFT" : 0,
    "EMITTER_PLACE_RIGHT" : 1,
    "EMITTER_PLACE_TOP" : 2,
    "EMITTER_PLACE_BOTTOM" : 3,
    "EMITTER_PLACE_CENTER" : 4});


/**
* @classdesc 粒子发生器描述文件类。包含该粒子发生器放置的位置以及其子粒子发生器名称列表
*/
class NvsParticleEmitterDesc {
    constructor() {
        this.emitterPlace = NvsEmitterPlaceEnum.EMITTER_PLACE_CENTER;
        this.emitterNames = [];
    }
}



/**
* @classdesc 粒子特效包解析类
*/
class NvsAssetPackageParticleDescParser {
	
/**
* @constructor
* @param {} fxDescription
*/
    constructor(fxDescription) {
        this.particleType = NvsParticleTypeEnum.PARTICLE_TYPE_NORMAL;
        this.emitters = [];

        var fxDescobj = JSON.parse(fxDescription);
        if (typeof(fxDescobj.particleType) !== 'undefined') {
            if (fxDescobj.particleType === 'touch') {
                this.particleType = NvsParticleTypeEnum.PARTICLE_TYPE_TOUCH
            } else if (fxDescobj.particleType === 'gesture') {
                this.particleType = NvsParticleTypeEnum.PARTICLE_TYPE_GESTURE
            } else if (fxDescobj.particleType === 'eye') {
                this.particleType = NvsParticleTypeEnum.PARTICLE_TYPE_EYE
            } else if (fxDescobj.particleType === 'mouth') {
                this.particleType = NvsParticleTypeEnum.PARTICLE_TYPE_MOUTH
            }
        }

       var array = fxDescobj.emitterDesc;
       for (var i = 0; i < array.length; i++) {
            var emitterDesc = array[i];
            var placeDesc = new NvsParticleEmitterDesc();
            placeDesc.emitterPlace = NvsEmitterPlaceEnum.EMITTER_PLACE_CENTER;
            if (typeof(emitterDesc.place) !== 'undefined') {
                if (emitterDesc.place === 'left') {
                    placeDesc.emitterPlace = NvsEmitterPlaceEnum.EMITTER_PLACE_LEFT;
                } else if (emitterDesc.place === 'right') {
                    placeDesc.emitterPlace = NvsEmitterPlaceEnum.EMITTER_PLACE_RIGHT;
                } else if (emitterDesc.place === 'top') {
                    placeDesc.emitterPlace = NvsEmitterPlaceEnum.EMITTER_PLACE_TOP;
                } else if (emitterDesc.place === 'bottom') {
                    placeDesc.emitterPlace = NvsEmitterPlaceEnum.EMITTER_PLACE_BOTTOM;
                }
            }

            if (typeof(emitterDesc.emitterName) !== 'undefined') {
                var emitterNames = emitterDesc.emitterName;
                for (var j = 0; j < emitterNames.length; j++) {
                    var name = emitterNames[j];
                    placeDesc.emitterNames.push(name);
                }
            }
            this.emitters.push(placeDesc);
        }
    }


/**
* @description 获取粒子分区发射器
* @param {} partitionIndex 分区索引
* @return {} 
*/
    getParticlePartitionEmitter(partitionIndex) {
        if (partitionIndex >= this.emitters.length)
            return undefined;
        var emitterDesc = this.emitters[partitionIndex];
        return emitterDesc.emitterNames;
    }
}


/**
* @classdesc 视频流信息
*/
class NvsVideoStreamInfo {
	
/**
* @constructor
*/
    constructor() {
        this.width = 0;
        this.height = 0;
        this.duration = 0;
        this.frameRate = new NvsRational(0, 0);
        this.pixelAspectRatio = new NvsRational(1, 1);
        this.codecType = 0;
        this.rotation = 0;
    }
}


/**
* @classdesc 音频流信息
*/
class NvsAudioStreamInfo {
	
/**
* @constructor
*/
    constructor() {
        this.channelCount = 0;
        this.sampleRate = 0;
        this.duration = 0;
    }
}


/**
* @classdesc 音视频文件信息。显示音视频文件的信息,包括音视频文件的时长,数据速率,像素横纵比,音视频流数目等。
*/
class NvsAVFileInfo {
	
/**
* @constructor
*/
    constructor() {
        this.duration = 0;
        this.videoStreamInfo = undefined;
        this.audioStreamInfo = [];
    }
}

/**
* @classdesc 播放速率控制区域
*/
class NvsPlaybackRateControlRegion {
	
/**
* @constructor
*/
    constructor() {
        this.startTime = 0;
        this.endTime = 0;
        this.playbackRate = 1;
        this.audioGain = 1;
    }
}


/**
* @classdesc XML流书写类
*/
class NvsXmlStreamWriter {
	
/**
* @constructor
* @param {} filePath 文件路径
*/
    constructor(filePath) {
        this.filePath = filePath;
    }



/**
* @description 打开书写器
* @return {} 
*/
    open() {
        return Module.nvs_xmlStreamWriter_open(this.filePath);
    }


/**
* @description 关闭,释放资源
* @return {} 
*/
    close() {
        return Module.nvs_xmlStreamWriter_close(this.filePath);
    }


/**
* @description 写开始文档
* @return {} 
*/
    writeStartDocument() {
        return Module.nvs_xmlStreamWriter_writeStartDocument(this.filePath);
    }


/**
* @description 写结束文档
* @return {} 
*/
    writeEndDocument() {
        return Module.nvs_xmlStreamWriter_writeEndDocument(this.filePath);
    }



/**
* @description 写开始元素
* @param {} element 开始元素
* @return {} 
*/
    writeStartElement(element) {
        return Module.nvs_xmlStreamWriter_writeStartElement(this.filePath, element);
    }


/**
* @description 写结束元素
* @param {} 
* @param {} 
* @return {} 
*/
    writeEndElement() {
        return Module.nvs_xmlStreamWriter_writeEndElement(this.filePath);
    }


/**
* @description 根据属性名字,设置属性值
* @param {} name 属性名字
* @param {} value 属性值
* @return {} 
*/
    writeAttribute(name, value) {
        return Module.nvs_xmlStreamWriter_writeAttribute(this.filePath, name, value)
    }



/**
* @description DTD书写
* @param {} dtd
* @return {} 
*/
    writeDTD(dtd) {
        return Module.nvs_xmlStreamWriter_writeDTD(this.filePath, dtd)
    }


/**
* @description  写文本元素
* @param {} name 元素名字
* @param {} text 元素值
* @return {} 
*/
    writeTextElement(name, text) {
        return Module.nvs_xmlStreamWriter_writeTextElement(this.filePath, name, text)
    }
}


/**
* @classdesc 读XML流
*/
class NvsXmlStreamReader {
	
/**
* @constructor
* @param {} filePath
*/
    constructor(filePath) {
        this.filePath = filePath;
    }


/**
* @description 打开流阅读器
* @return {} 
*/
    open() {
        return Module.nvs_xmlStreamReader_open(this.filePath);
    }


/**
* @description 关闭,是否资源
* @return {} 
*/
    close() {
        return Module.nvs_xmlStreamReader_close(this.filePath);
    }


/**
* @description 获取结束点
* @return {} 
*/
    atEnd() {
        return Module.nvs_xmlStreamReader_atEnd(this.filePath);
    }



/**
* @description 是否有错误
* @return {} 
*/
    hasError() {
        return Module.nvs_xmlStreamReader_hasError(this.filePath);
    }



/**
* @description 读取下一个
* @return {} 
*/
    readNext() {
        return Module.nvs_xmlStreamReader_readNext(this.filePath);
    }


/**
* @description 读取下一个开始元素
* @return {} 
*/
    readNextStartElement() {
        return Module.nvs_xmlStreamReader_readNextStartElement(this.filePath);
    }



/**
* @description 获取读取器名字
* @return {} 
*/
    name() {
        return Module.nvs_xmlStreamReader_name(this.filePath);
    }


/**
* @description 是否是文档开始
* @return {} 
*/
    isStartDocument() {
        return Module.nvs_xmlStreamReader_isStartDocument(this.filePath)
    }


/**
* @description 是否是文档结束
* @return {} 
*/
    isEndDocument() {
        return Module.nvs_xmlStreamReader_isEndDocument(this.filePath)
    }


/**
* @description 是否是开始元素
* @return {} 
*/
    isStartElement() {
        return Module.nvs_xmlStreamReader_isStartElement(this.filePath)
    }


/**
* @description 是否是结束元素
* @return {} 
*/
    isEndElement() {
        return Module.nvs_xmlStreamReader_isEndElement(this.filePath)
    }



/**
* @description 根据属性名字,获取属性值
* @param {} attributeName 属性名字
* @return {} 
*/
    getAttributeValue(attributeName) {
        return Module.nvs_xmlStreamReader_getAttributeValue(this.filePath, attributeName)
    }
}


/**
* @classdesc 音频文件写入器
*/
class NvsAudioFileWriter {
	
/**
* @constructor
* @param {} sampleRate 采样率
* @param {} channelCount 通道数
* @param {} outputAudioFilePath 输出音频文件路径
*/
    constructor(sampleRate, channelCount, outputAudioFilePath) {
        this.internalObj = 0;
        Module.nvs_audioFileWriter_init(this, sampleRate, channelCount, outputAudioFilePath);
    }


/**
* @description 设置内部对象
* @param {} obj 内置对象
* @return {} 
*/
    setInternalObject(obj) {
        this.internalObj = obj;
    }


/**
* @description 获取内部对象
* @return {} 
*/
    getInternalObject() {
        return this.internalObj;
    }


/**
* @description 写音频数据
* @param {} audioData 音频数据
* @return {} 
*/
    writeAudioData(audioData) {
        return Module.nvs_audioFileWriter_writeAudioData(this, audioData);
    }



/**
* @description 关闭。您必须调用 close() 来生成最终的音频文件并释放 wasm 持有的资源!
* @return {} 
*/
    // NOTE: You must call close() to generate the final audio file and release resources hold by wasm!
    close() {
        return Module.nvs_audioFileWriter_close(this);
    }
}

/**
* @description 使用模板
*/
const NvsFootageTypeEnum = Object.freeze({
    "VideoImage" : 0,
    "Video" : 1,
    "Image" : 2,
    "Audio" : 3});


/**
* @classdesc 模板资源包里footage对应的片段信息
*/
class NvsTemplateFootageCorrespondingClipInfo {
/**
* @constructor
*/
    constructor() {
        this.trackIndex = 0;
        this.clipIndex = 0;
    }
}



/**
* @classdesc 模板资源包里footage信息(TEIMPLATE_FOOTAGE_TYPE)
*/
class NvsTemplateFootageDesc {
	
/**
* @constructor
*/
    constructor() {
        this.id = '';
        this.type = 0;
        this.canReplace = false;
        this.name = '';
        this.tags = [];
        this.correspondingClipInfos = [];
    }
}


/**
* @classdesc 模板资源包里footage对应的字幕信息
*/
class NvsTemplateCaptionDesc {
	
/**
* @constructor
*/
    constructor() {
        this.replaceId = 0;
        this.text = '';
        this.fontFamily = '';
    }
}


/**
* @classdesc 模板资源包里footage对应的组合字幕信息
*/
class NvsTemplateCompoundCaptionItemDesc {
	
/**
* @constructor
*/
    constructor() {
        this.index = 0;
        this.text = '';
        this.fontFamily = '';
    }
}


/**
* @classdesc 模板资源包里footage包含的全部组合字幕信息
*/
class NvsTemplateCompoundCaptionDesc {
	
/**
* @constructor
*/
    constructor() {
        this.replaceId = 0;
        this.itemList = [];
    }
}


function nvsInitClasses() {
    Module.Meishe.classMap = {
        NvsSdkVersion,
        NvsRational,
        NvsVideoResolution,
        NvsAudioResolution,
        NvsLiveWindow,
        NvsAIToningInfo,
        NvsStreamingContext,
        NvsProjObj,
        NvsTimeline,
        NvsTrack,
        NvsVideoTrack,
        NvsAudioTrack,
        NvsClip,
        NvsVideoClip,
        NvsAudioClip,
        NvsPanAndScan,
        NvsVolume,
        NvsColor,
        NvsPointF,
        NvsRectF,
        NvsWatermarkInfo,
        NvsAssetPackageManager,
        NvsRegionInfo,
        NvsFx,
        NvsTimelineVideoFx,
        NvsTimelineCaption,
        NvsMotionParameters,
        NvsTimelineCompoundCaption,
        NvsTimelineAnimatedSticker,
        NvsVideoTransition,
        NvsAudioTransition,
        NvsVideoFx,
        NvsAudioFx,
        NvsParamInfoObject,
        NvsFxDescription,
        NvsParticleSystemContext,
        NvsARSceneManipulate,
        NvsVideoStreamInfo,
        NvsAudioStreamInfo,
        NvsAVFileInfo,
        NvsPlaybackRateControlRegion,
        NvsTemplateFootageCorrespondingClipInfo,
        NvsTemplateFootageDesc,
        NvsTemplateCaptionDesc
    };


    Module.Meishe.getClassByName = function(className) {
        return Module.Meishe.classMap[className];
    }
}