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;