/** *作者:gxx *时间:2024/11/1 14:32 *功能: **/import { media } from "@kit.MediaKit";import { BusinessError } from "@kit.BasicServicesKit";import { promptAction } from "@kit.ArkUI";
export class MediaPlayer { private player: media.AVPlayer private source: media.AVFileDescriptor | string private state: media.AVPlayerState = 'idle'
constructor(player: media.AVPlayer, source: media.AVFileDescriptor | string) { // 创建出来player this.player = player; // 设置监听 this.setListener() this.source = source; // 设置播放资源 if (typeof source == 'string') { this.player.url = source } else { this.player.fdSrc = source } }
// 设置监听 private setListener() { // 播放错误 this.player.on('error', (err: BusinessError) => { console.error('gxxt play err: ', err.message) }) // 播放完毕 this.player.on("endOfStream", () => { console.log('gxxt play 完毕') }) this.player.on("stateChange", (state, reason) => { // 更新当前状态 this.state = state switch (state) { case 'idle': console.log('gxxt play 刚创建') break; case 'initialized': console.log('gxxt play 初始化好了播放资源') this.player.prepare() break; case 'prepared': console.log('gxxt play 准备好的状态') break; case 'playing': console.log('gxxt play 播放中状态') break; case 'paused': console.log('gxxt play 暂停的状态') break; case 'stopped': console.log('gxxt play 停止的状态') break; case 'released': console.log('gxxt play 释放资源') break; } }) }
play() { // 如果当前状态是准备态或者暂停可以直接播放 否则先准备 if (this.state == 'prepared' || this.state == 'paused') { this.player.play() } else if (this.state == 'stopped') { this.player.prepare(() => { // 停止状态进来的 要先准备 再开始播放 this.player.play() }) } }
pause() { // 只有是播放状态才能暂停 if (this.state == 'playing') { this.player.pause() } else { promptAction.showToast({ message: '当前状态不支持暂停' }) } } // 停止播放 stop() { this.player.stop() } //释放资源 release() { this.player.release() }
seekto(time: number) { // 滑动播放时间 if (time < this.player.duration) { this.player.seek(time) } }}
评论