vue中如何实现音频轮流播放的功能?

vue中如何实现音频轮流播放的功能?

小弟刚学前端,在写自己的demo时有一个需求。
点击START按钮,播放音频A,等待1秒,再播放音频B。如此循环
点击STOP按钮,停止播放

请问如何实现呢?谢谢?
这是我的代码

<template>

<div id="Metronome">

<div class="container">

<div class="metronome">

<div class="bpm-display">

<span class="tempo">{{ tempo }}</span>

<span class="bpm">BPM</span>

</div>

<div class="tempo-text">

<div v-if="this.tempo <= 40">Super Slow</div>

<div v-if="this.tempo > 40 && this.tempo <= 80">Slow</div>

<div v-if="this.tempo > 80 && this.tempo <= 120">Getting there</div>

<div v-if="this.tempo > 120 && this.tempo <= 180">

Nice and Steady

</div>

<div v-if="this.tempo > 180 && this.tempo <= 220">Rock n' Roll</div>

<div v-if="this.tempo > 220 && this.tempo <= 240">Funky Stuff</div>

<div v-if="this.tempo > 240 && this.tempo <= 260">Relax Dude</div>

<div v-if="this.tempo > 260 && this.tempo <= 280">

Eddie Van Halen

</div>

</div>

<div class="tempo-settings">

<div class="adjust-tempo-btn decrease-tempo" @click="decreaseTempo">

-

</div>

<input

type="range"

min="20"

max="280"

step="1"

class="slider"

v-model.number="tempo"

/>

<div class="adjust-tempo-btn increase-tempo" @click="increaseTempo">

+

</div>

</div>

<button class="start-stop" @click="changeStart()">

{{ !isStart ? "START" : "STOP" }}

</button>

<audio ref="click1" src="../sound/click1.mp3"></audio>

<audio ref="click2" src="../sound/click2.mp3"></audio>

<audio></audio>

<div class="measures">

<div class="subtract-beats stepper" @click="decreaseBeat">-</div>

<div class="measure-count">{{ beat }}</div>

<div class="add-beats stepper" @click="increaseBeat">+</div>

</div>

<span class="beats-per-measure-text">Beats per measure</span>

</div>

</div>

</div>

</template>

<script>

export default {

name: "Metronome",

data() {

return {

tempo: 140,

beat: 4,

isStart: false,

};

},

methods: {

increaseTempo() {

if (this.tempo >= 280) return;

this.tempo++;

},

decreaseTempo() {

if (this.tempo <= 20) return;

this.tempo--;

},

increaseBeat() {

if (this.beat < 12) {

this.beat++;

}

},

decreaseBeat() {

if (this.beat > 2) {

this.beat--;

}

},

startPlay() {

//play A

this.$refs.click1.play();

console.log("click1 is playing!")

//play B after 1000ms

setInterval(this.playClick2,1000);

},

playClick2(){

this.$refs.click2.play();

console.log("click2 is playing!")

},

stopPlay() {

clearInterval(this.playClick2);

},

changeStart() {

this.isStart = !this.isStart;

if (this.isStart) {

this.startPlay();

} else {

this.stopPlay();

}

},

},

};

</script>


回答:

大概这样吧,代码直接写的,没跑过不知道会不会有问题,只提供个大概思路

创建一个LoopAudio类的对象,来控制开始结束,这样比较清晰

interface LoopListItem {

audio: HTMLAudioElement,

loopTime: number

}

class LoopAudio {

private start = false;

private activeIndex = 0;

private loopID = 0;

private loopList: LoopListItem[];

constructor (loopList: LoopListItem[]) {

this.loopList = loopList || [];

}

private loop() {

this.playAudio(this.activeIndex, () => {

let audioOption = this.loopList[this.activeIndex];

if (audioOption) {

audioOption.audio.pause();

}

this.activeIndex = (this.activeIndex + 1) % this.loopList.length;

this.loop();

});

}

startLoop () {

if (!this.loopList.length || this.start) {

return;

}

this.start = true;

this.loop();

}

stopLoop() {

if (!this.start) {

return;

}

clearTimeout(this.loopID);

this.loopID = 0;

this.activeIndex = 0;

this.start = false;

this.loopList.forEach(audioOption => {

audioOption.audio.pause();

});

}

playAudio(index: number, nextFn?: Function) {

let audioOption = this.loopList[index];

if (!audioOption) {

return;

}

let { audio, loopTime } = audioOption;

if (!audio.duration) {

return;

}

if (audio.currentTime >= audio.duration) {

audio.currentTime = 0;

}

audio.play();

if (nextFn) {

this.loopID = setTimeout(nextFn, loopTime);

}

}

}

以上是 vue中如何实现音频轮流播放的功能? 的全部内容, 来源链接: utcz.com/p/936043.html

回到顶部