Source: ZegoExpressMediaPlayer.js

  1. const EventEmitter = require('events').EventEmitter;
  2. const WebGLRender = require('./ZegoExpressWebgl');
  3. const {ZegoViewMode} = require('./ZegoExpressDefines');
  4. /**
  5. * ZegoMediaPlayer
  6. */
  7. class ZegoMediaPlayer extends EventEmitter {
  8. /**
  9. * 开始播放
  10. *
  11. * 必须在加载资源完成后才能调用
  12. */
  13. start(){
  14. this.nativeMediaPlayer.start({});
  15. }
  16. /**
  17. * 停止播放
  18. */
  19. stop(){
  20. this.nativeMediaPlayer.stop({});
  21. }
  22. /**
  23. * 暂停播放
  24. */
  25. pause(){
  26. this.nativeMediaPlayer.pause({});
  27. }
  28. /**
  29. * 恢复播放
  30. */
  31. resume(){
  32. this.nativeMediaPlayer.resume({});
  33. }
  34. /**
  35. * 加载媒体资源
  36. *
  37. * 可传本地资源的绝对路径或者网络资源的 URL
  38. * @param {string} path - 本地资源路径或网络资源的 URL,不能传入 null 或 ""。
  39. * @return {Promise<number>} - 加载资源的结果
  40. */
  41. loadResource(path){
  42. return this.nativeMediaPlayer.loadResource({path});
  43. }
  44. /**
  45. * 获取当前播放状态
  46. *
  47. * @return {ZegoMediaPlayerState} - 当前播放器状态
  48. */
  49. getCurrentState(){
  50. return this.nativeMediaPlayer.getCurrentState({});
  51. }
  52. /**
  53. * 设置指定的播放进度
  54. *
  55. * 单位为毫秒
  56. * @param {number} millisecond - 指定的播放进度的时间点
  57. * @return {Promise<number>} - 设置播放进度的结果
  58. */
  59. seekTo(millisecond){
  60. return this.nativeMediaPlayer.seekTo({millisecond});
  61. }
  62. /**
  63. * 设置播放器音量,会同时设置本地播放音量和推流音量
  64. *
  65. * @param {number} volume - 范围为 0 ~ 200,默认为 60。
  66. */
  67. setVolume(volume){
  68. this.nativeMediaPlayer.setVolume({volume});
  69. }
  70. /**
  71. * 设置播放器本地播放音量
  72. *
  73. * @param {number} volume - 范围为 0 ~ 200,默认为 60。
  74. */
  75. setPlayVolume(volume){
  76. this.nativeMediaPlayer.setPlayVolume({volume});
  77. }
  78. /**
  79. * 设置播放器推流音量
  80. *
  81. * @param {number} volume - 范围为 0 ~ 200,默认为 60。
  82. */
  83. setPublishVolume(volume){
  84. this.nativeMediaPlayer.setPublishVolume({volume});
  85. }
  86. /**
  87. * 获取当前媒体播放器本地播放的音量,范围为 0 ~ 200,默认值为 60
  88. *
  89. * @return {number} - 当前音量
  90. */
  91. getPlayVolume(){
  92. return this.nativeMediaPlayer.getPlayVolume({});
  93. }
  94. /**
  95. * 获取当前媒体播放器推流的音量,范围为 0 ~ 200,默认值为 60
  96. *
  97. * @return {number} - 当前音量
  98. */
  99. getPublishVolume(){
  100. return this.nativeMediaPlayer.getPublishVolume({});
  101. }
  102. /**
  103. * 获取媒体资源的总进度
  104. *
  105. * 必须在加载资源完成后才能调用,否则返回值为 0
  106. * @return {number} - 单位为毫秒
  107. */
  108. getTotalDuration(){
  109. return this.nativeMediaPlayer.getTotalDuration({});
  110. }
  111. /**
  112. * 获取当前播放进度
  113. *
  114. * 必须在加载资源完成后才能调用,否则返回值为 0
  115. * @return {number} - 当前播放进度
  116. */
  117. getCurrentProgress(){
  118. return this.nativeMediaPlayer.getCurrentProgress({});
  119. }
  120. /**
  121. * 是否静默本地播放
  122. *
  123. * 若开启了混音入流则推的流中仍然有声音,默认为 false。
  124. * @param {boolean} mute - 本地静音标记,默认为 false。
  125. */
  126. muteLocal(mute){
  127. this.nativeMediaPlayer.muteLocal({mute});
  128. }
  129. /**
  130. * 设置播放器播放视频的视图
  131. *
  132. * @param {ZegoView} view - 视频渲染的画布对象
  133. */
  134. setPlayerView(view){
  135. if(view == null){
  136. this.localGLRender = null;
  137. }
  138. else{
  139. view = Object.assign({ viewMode: ZegoViewMode.AspectFit, backgroundColor: 0x000000, preserveDrawingBuffer: false}, view);
  140. this.localGLRender = new WebGLRender();
  141. this.localGLRender.setViewMode(view.viewMode);
  142. this.localGLRender.enablePreserveDrawingBuffer(view.preserveDrawingBuffer);
  143. this.localGLRender.initBkColor(view.backgroundColor);
  144. this.localGLRender.initGLfromCanvas(view.canvas);
  145. this.nativeMediaPlayer.setPlayerCanvas({});
  146. }
  147. }
  148. /**
  149. * 是否将播放器的声音混入正在推的流中
  150. *
  151. * 此接口仅会将媒体播放器声音混到主通道中
  152. * @param {boolean} enable - 是否混音标记,默认为 false
  153. */
  154. enableAux(enable){
  155. this.nativeMediaPlayer.enableAux({enable});
  156. }
  157. /**
  158. * 是否将播放器的视频混入正在推的流中
  159. *
  160. * @param {boolean} enable - 是否推视频
  161. * @param {number} channel - channel
  162. */
  163. enablePublishVideo(enable, channel){
  164. this.nativeMediaPlayer.enablePublishVideo({enable, channel});
  165. }
  166. /**
  167. * 是否重复播放
  168. *
  169. * @param {boolean} enable - 重复播放标记,默认为 false
  170. */
  171. enableRepeat(enable){
  172. this.nativeMediaPlayer.enableRepeat({enable});
  173. }
  174. /**
  175. * 设置播放进度回调间隔
  176. *
  177. * 可通过此函数控制 [onMediaPlayerPlayingProgress] 的回调频率,当设置回调间隔为 0 时,停止回调。默认回调间隔为 1s
  178. * 回调不会严格按照设定的回调间隔值返回,而是以处理音频帧或者视频帧的频率来判断是否需要回调
  179. * @param {number} millisecond - 播放进度回调间隔时间,单位为毫秒
  180. */
  181. setProgressInterval(millisecond){
  182. this.nativeMediaPlayer.setProgressInterval({millisecond});
  183. }
  184. /**
  185. * 获取播放文件的音轨个数
  186. *
  187. * @return {number} - 音轨个数
  188. */
  189. getAudioTrackCount(){
  190. return this.nativeMediaPlayer.getAudioTrackCount({});
  191. }
  192. /**
  193. * 设置播放文件的音轨
  194. *
  195. * @param {number} index - 音轨序号,可以通过 [getAudioTrackCount] 获取音轨个数
  196. */
  197. setAudioTrackIndex(index){
  198. this.nativeMediaPlayer.setAudioTrackIndex({index});
  199. }
  200. /**
  201. * 设置变声的具体参数
  202. *
  203. * @param {ZegoMediaPlayerAudioChannel} audioChannel - 要进行变声的声道
  204. * @param {ZegoVoiceChangerParam} param - 变声参数
  205. */
  206. setVoiceChangerParam(audioChannel, param){
  207. this.nativeMediaPlayer.setVoiceChangerParam({audioChannel, param});
  208. }
  209. /**
  210. * 截取媒体播放器当前播放画面
  211. *
  212. * 只有在调用 [setPlayerCanvas] 设置显示控件和播放状态的情况下,才能正常截图
  213. * @return {Promise<number, string>} - 快照错误代码和jpg格式图片的 base64 字符串
  214. */
  215. takeSnapshot(){
  216. return this.nativeMediaPlayer.takeSnapshot({});
  217. }
  218. getCustomVideoCapturePlugin(){
  219. return this.nativeMediaPlayer.getCustomVideoCapturePlugin();
  220. }
  221. /**
  222. * @event ZegoMediaPlayer#onMediaPlayerStateUpdate
  223. * @desc 媒体播放器播放状态回调。
  224. *
  225. * 详情描述:媒体播放器播放状态回调。
  226. * 通知时机:当媒体播放器的播放状态改变时会触发此回调。
  227. * 使用限制:无。
  228. * @property {object} result - 结果数据对象
  229. * @property {ZegoMediaPlayerState} result.state - 播放器状态。
  230. * @property {number} result.errorCode - 错误码,详情请参考 常见错误码文档 https://doc-zh.zego.im/zh/4378.html 。
  231. */
  232. /**
  233. * @event ZegoMediaPlayer#onMediaPlayerNetworkEvent
  234. * @desc 媒体播放器网络状态事件回调。
  235. *
  236. * 详情描述:媒体播放器网络状态事件回调。
  237. * 通知时机:当媒体播放器在播放网络资源时,当缓存数据的状态改变时会触发此回调。
  238. * 使用限制:只有在播放网络资源时才会触发该回调。
  239. * 相关接口:[setNetWorkBufferThreshold]。
  240. * @property {object} result - 结果数据对象
  241. * @property {ZegoMediaPlayerNetworkEvent} result.networkEvent - 网络状态事件。
  242. */
  243. /**
  244. * @event ZegoMediaPlayer#onMediaPlayerPlayingProgress
  245. * @desc 播放器播放进度回调。
  246. *
  247. * 详情描述:媒体播放器播放进度回调。通过调用 [setProgressInterval] 可以设置回调间隔时间。当设置回调间隔为 0 时,停止回调。默认回调间隔为 1 秒。
  248. * 通知时机:当媒体播放器开始播放资源后会触发此回调。
  249. * 使用限制:无。
  250. * 相关接口:[setProgressInterval]。
  251. * @property {object} result - 结果数据对象
  252. * @property {number} result.millisecond - 进度,单位为毫秒。
  253. */
  254. callEmit() {
  255. try {
  256. if (arguments[0] === "onVideoData") {
  257. if(this.localGLRender){
  258. let videoFrame = {
  259. "videoFrameParam": arguments[1]["videoFrameParam"],
  260. "videoFrameBuffer": Buffer.from(arguments[1]["videoFrameBuffer"])
  261. }
  262. this.localGLRender.drawVideoFrame(videoFrame);
  263. }
  264. }
  265. } catch (error) {
  266. // console.log("callEmit: ", error);
  267. }
  268. try {
  269. this.emit(arguments[0], arguments[1]);
  270. } catch (error) {
  271. console.log(`error catched in your callback ${arguments[0]} : ${error}`)
  272. }
  273. }
  274. }
  275. module.exports = ZegoMediaPlayer;