2***@qq.com
2***@qq.com
  • 发布:2025-09-16 15:03
  • 更新:2025-09-16 15:03
  • 阅读:13

关于音频播放器切换多个音频播放会卡死的问题

分类:uni-app

两套代码 自己选一套用就能解决

export class Audio {  
    constructor() {  
        this.audio = uni.createInnerAudioContext()  
        this.audio.onCanplay(() => {  
            uni.hideLoading()  
        });  
        this.audio.onTimeUpdate(() => {  
            uni.$emit('time', this.audio.currentTime)  
        });  
        this.audio.onPlay(() => {  

        });  
        this.audio.onPause(() => {});  
        this.audio.onEnded(() => {  
            this.audio.playbackRate = 1  
            uni.$emit('playend')  
        })  
    }  
    changePlaySudu(sudu) {  
        this.audio.playbackRate = sudu  
    }  
    play(url) {  
        if (this.audio.src == url) {  
            this.audio.seek(0)  
        } else {  
            this.audio.src = url  
        }  
        this.audio.play()  
    }  
    end() {  
        this.audio.pause()  
    }  
    dele() {  
        this.audio.pause();  
        this.audio.destroy();  
        this.audio = null;  
    }  
}  
export class Audios {  
    constructor() {  
        this.audio = uni.createInnerAudioContext();  
        this.audio.autoplay = true;  
        this.subscribers = {};  
        this.startSlider = 0;  
        this.endSlider = 0;  
        this.isPaused = false;  
        this.loadInitialAudio();  
    }  
    async loadInitialAudio() {  
        this.audio.onCanplay(() => {  
            if (this.startSlider) {  
                this.audio.pause();  
                this.audio.seek(this.startSlider);  
                this.audio.play();  
            }  
            this.emit('duration', this.audio.duration);  
            uni.hideLoading();  
        });  
        this.audio.onTimeUpdate(() => {  
            console.log(this.audio.currentTime);  
            this.emit('time', this.audio.currentTime, this.audio.duration);  
            if (this.endSlider > 0 && this.audio.currentTime > this.endSlider) {  
                this.audio.pause();  
            }  
        });  
        this.audio.onPlay(() => this.emit('alignPlay'));  
        this.audio.onPause(() => this.emit('playPause'));  
        this.audio.onEnded(() => this.emit('playend'));  
    }  
    // 切换音频 重新播放  
    playAudio(audioSrc, play = true, start, end) {  
        this.audio.pause();  
        if (this.audio.src === audioSrc && !this.isPaused) {  
            this.audio.play();  
            return;  
        }  
        if (this.audio.src === audioSrc && this.isPaused) {  
            this.audio.pause();  
            this.audio.seek(0);  
            this.audio.play();  
            return;  
        }  
        this.audio.src = audioSrc;  
    }  
    //切换播放时间点  
    changeAudioPlayCurrentTime(time) {  
        this.audio.pause();  
        this.audio.seek(time);  
        this.audio.play();  
    }  
    //暂停  
    pause() {  
        this.audio.pause();  
    }  
    //继续播放  
    play() {  
        if (this.audio.src && !this.isPaused) {  
            this.audio.play();  
            return;  
        }  
    }  
    //静音  
    toggleMute() {  
        this.audio.volume = this.audio.volume == 0 ? 1 : 0;  
    }  
    //播放速度  
    changePlaybackRate(value) {  
        if (this.audio) this.audio.playbackRate = value;  
    }  
    on(event, callback) {  
        if (!this.subscribers[event]) {  
            this.subscribers[event] = [];  
        }  
        this.subscribers[event].push(callback);  
    }  
    emit(event, ...args) {  
        if (this.subscribers[event]) {  
            this.subscribers[event].forEach((callback) => callback(...args));  
        }  
    }  
    onDestroy() {  
        this.audio.pause();  
        this.audio.offEnded();  
        this.audio.offPlay();  
        this.audio.offPause();  
        this.audio.offCanplay();  
        this.audio.offTimeUpdate();  
        this.audio.destroy();  
        this.audio = null;  
        this.subscribers = {};  
    }  
}
0 关注 分享

要回复文章请先登录注册