Source: ZegoExpressMediaPlayer.js



const EventEmitter = require('events').EventEmitter;
const WebGLRender = require('./ZegoExpressWebgl');
const {ZegoViewMode} = require('./ZegoExpressDefines');

/**
 * ZegoMediaPlayer
 */
class ZegoMediaPlayer extends EventEmitter {

    /**
     * 开始播放
     *
     * 必须在加载资源完成后才能调用
     */
    start(){
        this.nativeMediaPlayer.start({});
    }

    /**
     * 停止播放
     */
    stop(){
        this.nativeMediaPlayer.stop({});
    }

    /**
     * 暂停播放
     */
    pause(){
        this.nativeMediaPlayer.pause({});
    }

    /**
     * 恢复播放
     */
    resume(){
        this.nativeMediaPlayer.resume({});
    }

    /**
     * 加载媒体资源
     *
     * 可传本地资源的绝对路径或者网络资源的 URL
     * @param {string} path - 本地资源路径或网络资源的 URL,不能传入 null 或 ""。
     * @return {Promise<number>} - 加载资源的结果
     */
    loadResource(path){
        return this.nativeMediaPlayer.loadResource({path});
    }

    /**
     * 获取当前播放状态
     *
     * @return {ZegoMediaPlayerState} - 当前播放器状态
     */
    getCurrentState(){
        return this.nativeMediaPlayer.getCurrentState({});
    }

    /**
     * 设置指定的播放进度
     *
     * 单位为毫秒
     * @param {number} millisecond - 指定的播放进度的时间点
     * @return {Promise<number>} - 设置播放进度的结果
     */
    seekTo(millisecond){
        return this.nativeMediaPlayer.seekTo({millisecond});
    }

    /**
     * 设置播放器音量,会同时设置本地播放音量和推流音量
     *
     * @param {number} volume - 范围为 0 ~ 200,默认为 60。
     */
    setVolume(volume){
        this.nativeMediaPlayer.setVolume({volume});
    }

    /**
     * 设置播放器本地播放音量
     *
     * @param {number} volume - 范围为 0 ~ 200,默认为 60。
     */
    setPlayVolume(volume){
        this.nativeMediaPlayer.setPlayVolume({volume});
    }

    /**
     * 设置播放器推流音量
     *
     * @param {number} volume - 范围为 0 ~ 200,默认为 60。
     */
    setPublishVolume(volume){
        this.nativeMediaPlayer.setPublishVolume({volume});
    }

    /**
     * 获取当前媒体播放器本地播放的音量,范围为 0 ~ 200,默认值为 60
     *
     * @return {number} - 当前音量
     */
    getPlayVolume(){
        return this.nativeMediaPlayer.getPlayVolume({});
    }

    /**
     * 获取当前媒体播放器推流的音量,范围为 0 ~ 200,默认值为 60
     *
     * @return {number} - 当前音量
     */
    getPublishVolume(){
        return this.nativeMediaPlayer.getPublishVolume({});
    }

    /**
     * 获取媒体资源的总进度
     *
     * 必须在加载资源完成后才能调用,否则返回值为 0
     * @return {number} - 单位为毫秒
     */
    getTotalDuration(){
        return this.nativeMediaPlayer.getTotalDuration({});
    }

    /**
     * 获取当前播放进度
     *
     * 必须在加载资源完成后才能调用,否则返回值为 0
     * @return {number} - 当前播放进度
     */
    getCurrentProgress(){
        return this.nativeMediaPlayer.getCurrentProgress({});
    }

    /**
     * 是否静默本地播放
     *
     * 若开启了混音入流则推的流中仍然有声音,默认为 false。
     * @param {boolean} mute - 本地静音标记,默认为 false。
     */
    muteLocal(mute){
        this.nativeMediaPlayer.muteLocal({mute});
    }

    /**
     * 设置播放器播放视频的视图
     *
     * @param {ZegoView} view - 视频渲染的画布对象
     */
    setPlayerView(view){
        if(view == null){
            this.localGLRender = null;
        }
        else{
            view = Object.assign({ viewMode: ZegoViewMode.AspectFit, backgroundColor: 0x000000, preserveDrawingBuffer: false}, view);
            this.localGLRender = new WebGLRender();
            this.localGLRender.setViewMode(view.viewMode);
            this.localGLRender.enablePreserveDrawingBuffer(view.preserveDrawingBuffer);
            this.localGLRender.initBkColor(view.backgroundColor);
            this.localGLRender.initGLfromCanvas(view.canvas);
            
            this.nativeMediaPlayer.setPlayerCanvas({});
        }
    }

    /**
     * 是否将播放器的声音混入正在推的流中
     *
     * 此接口仅会将媒体播放器声音混到主通道中
     * @param {boolean} enable - 是否混音标记,默认为 false
     */
    enableAux(enable){
        this.nativeMediaPlayer.enableAux({enable});
    }

    /**
     * 是否将播放器的视频混入正在推的流中
     *
     * @param {boolean} enable - 是否推视频
     * @param {number} channel - channel
     */
    enablePublishVideo(enable, channel){
        this.nativeMediaPlayer.enablePublishVideo({enable, channel});
    }

    /**
     * 是否重复播放
     *
     * @param {boolean} enable - 重复播放标记,默认为 false
     */
    enableRepeat(enable){
        this.nativeMediaPlayer.enableRepeat({enable});
    }

    /**
     * 设置播放进度回调间隔
     *
     * 可通过此函数控制 [onMediaPlayerPlayingProgress] 的回调频率,当设置回调间隔为 0 时,停止回调。默认回调间隔为 1s
     * 回调不会严格按照设定的回调间隔值返回,而是以处理音频帧或者视频帧的频率来判断是否需要回调
     * @param {number} millisecond - 播放进度回调间隔时间,单位为毫秒
     */
    setProgressInterval(millisecond){
        this.nativeMediaPlayer.setProgressInterval({millisecond});
    }

    /**
     * 获取播放文件的音轨个数
     *
     * @return {number} - 音轨个数
     */
    getAudioTrackCount(){
        return this.nativeMediaPlayer.getAudioTrackCount({});
    }

    /**
     * 设置播放文件的音轨
     *
     * @param {number} index - 音轨序号,可以通过 [getAudioTrackCount] 获取音轨个数
     */
    setAudioTrackIndex(index){
        this.nativeMediaPlayer.setAudioTrackIndex({index});
    }

    /**
     * 设置变声的具体参数
     *
     * @param {ZegoMediaPlayerAudioChannel} audioChannel - 要进行变声的声道
     * @param {ZegoVoiceChangerParam} param - 变声参数
     */
    setVoiceChangerParam(audioChannel, param){
        this.nativeMediaPlayer.setVoiceChangerParam({audioChannel, param});
    }

    /**
     * 截取媒体播放器当前播放画面
     *
     * 只有在调用 [setPlayerCanvas] 设置显示控件和播放状态的情况下,才能正常截图
     * @return {Promise<number, string>} - 快照错误代码和jpg格式图片的 base64 字符串
     */
    takeSnapshot(){
        return this.nativeMediaPlayer.takeSnapshot({});
    }

    getCustomVideoCapturePlugin(){
        return this.nativeMediaPlayer.getCustomVideoCapturePlugin();
    }

    /**
     * @event ZegoMediaPlayer#onMediaPlayerStateUpdate
     * @desc 媒体播放器播放状态回调。
     *
     * 详情描述:媒体播放器播放状态回调。
     * 通知时机:当媒体播放器的播放状态改变时会触发此回调。
     * 使用限制:无。
     * @property {object} result - 结果数据对象
     * @property {ZegoMediaPlayerState} result.state - 播放器状态。
     * @property {number} result.errorCode - 错误码,详情请参考 常见错误码文档 https://doc-zh.zego.im/zh/4378.html 。
     */

    /**
     * @event ZegoMediaPlayer#onMediaPlayerNetworkEvent
     * @desc 媒体播放器网络状态事件回调。
     *
     * 详情描述:媒体播放器网络状态事件回调。
     * 通知时机:当媒体播放器在播放网络资源时,当缓存数据的状态改变时会触发此回调。
     * 使用限制:只有在播放网络资源时才会触发该回调。
     * 相关接口:[setNetWorkBufferThreshold]。
     * @property {object} result - 结果数据对象
     * @property {ZegoMediaPlayerNetworkEvent} result.networkEvent - 网络状态事件。
     */

    /**
     * @event ZegoMediaPlayer#onMediaPlayerPlayingProgress
     * @desc 播放器播放进度回调。
     *
     * 详情描述:媒体播放器播放进度回调。通过调用 [setProgressInterval] 可以设置回调间隔时间。当设置回调间隔为 0 时,停止回调。默认回调间隔为 1 秒。
     * 通知时机:当媒体播放器开始播放资源后会触发此回调。
     * 使用限制:无。
     * 相关接口:[setProgressInterval]。
     * @property {object} result - 结果数据对象
     * @property {number} result.millisecond - 进度,单位为毫秒。
     */


    callEmit() {
        try {
            if (arguments[0] === "onVideoData") {
                if(this.localGLRender){
                    let videoFrame = {
                    "videoFrameParam": arguments[1]["videoFrameParam"],
                    "videoFrameBuffer": Buffer.from(arguments[1]["videoFrameBuffer"])
                    }
                    this.localGLRender.drawVideoFrame(videoFrame);
                }
            }
        } catch (error) {
            // console.log("callEmit: ", error);
        }
        try {
            this.emit(arguments[0], arguments[1]);
        } catch (error) {
            console.log(`error catched in your callback ${arguments[0]} : ${error}`)
        }
    }
}

module.exports = ZegoMediaPlayer;