uniapp播放音乐更新进度条、拖动进度条更新音乐进度

首先使用的是uniapp的uni.createInnerAudioContext() 和 进度条组件<slider>

<template>
  <view>
		<view>{{ currentTime }}</view>
		 <slider v-model="sliderValue" @change="onSliderChange" max="100" style="width: 80%;" :block-size='blockSize' block-color='#A2ABAA' activeColor='#19C590'></slider>
		<view>{{ duration }}</view>
		<button @click="startAudio()">开始播放</button>
  </view>
</template>

<script>
export default {
  data() {
    return {
      duration: '',
	  currentTime: '',
	   juuaa: null, // 将 juuaa 声明在 data 中以便在多个方法中使用
	   intervalIDqw: null,
	   sliderValue: 0,
	   blockSize: 12, // 滑块大小
    };
  },
	onReady(){
		
		// ------------------------------
			this.juuaa = uni.createInnerAudioContext()
			this.juuaa.src = 'https://www.xmhigame.com/static/uploads/s54/out-4252dac2792c5f48628dfa25e51e6ae5.mp3'
			console.log('播放器:',this.juuaa)
			
			this.juuaa.onCanplay(() => {
			    let intervalID = setInterval(() => {
			      if (this.juuaa.duration !== 0) {
			        clearInterval(intervalID);
					this.duration = this.formatTime(this.juuaa.duration) // 总时长
					this.currentTime = this.formatTime(this.juuaa.currentTime) // 当前时长
					console.log("当前时长", this.currentTime)
			        console.log("音频时长", this.duration);
					if(this.currentTime === this.duration){
						// this.currentTime = 0
						clearInterval(intervalID);
					}
			      }
			    }, 500);
			})
			
			  this.juuaa.onTimeUpdate(() => {
			      this.currentTime = this.formatTime(this.juuaa.currentTime);
			      if (!this.dragging) { // 避免拖动滑块时自动更新
			             this.sliderValue = (this.juuaa.currentTime / this.juuaa.duration) * 100;
			           }
			    })
			
			
			
	},
	methods:{
		startAudio() {
		  if (this.juuaa) {
		    this.juuaa.play(); // 开始播放音频
		  }
		  let intervalIDs = setInterval(() => {
		    if (this.juuaa.duration !== 0) {
		      // clearInterval(intervalID);
		  	this.duration = this.formatTime(this.juuaa.duration) // 总时长
		  	this.currentTime = this.formatTime(this.juuaa.currentTime) // 当前时长
		  	console.log("当前时长", this.currentTime)
		      console.log("音频时长", this.duration);
		  	if(this.currentTime === this.duration){
		  		// this.currentTime = 0
		  		clearInterval(intervalIDs);
		  	}
		    }
		  }, 500);
		    // 启动定时器,每秒更新一次进度条位置
		          this.intervalIDqw = setInterval(() => {
		            if (this.juuaa.duration > 0) {
		              this.sliderValue = (this.juuaa.currentTime / this.juuaa.duration) * 100;
		            }
		          }, 1000);
		  
		},
		// 格式化时间的函数,将秒转换为分:秒格式
		formatTime(seconds) {
		  const minutes = Math.floor(seconds / 60);
		  const remainingSeconds = Math.floor(seconds % 60);
		  return `${minutes}:${remainingSeconds < 10 ? '0' : ''}${remainingSeconds}`;
		},
		
		
		onSliderChange(event) {
			const value = event.detail.value;
		  if (this.juuaa && this.juuaa.duration > 0) {
		    // 验证 value 是否是有效的百分比值(0-100之间)
		    if (isNaN(value) || value < 0 || value > 100) {
		      console.error("Invalid value:", value);
		      return;
		    }
		
		    // 计算新的位置
		    const newPosition = (value / 100) * this.juuaa.duration;
		
		    // 验证 newPosition 是否是有效的数字,不是 NaN,并且在有效范围内
		    if (!isNaN(newPosition) && newPosition >= 0 && newPosition <= this.juuaa.duration) {
		      // 设置音频播放位置
		      this.juuaa.seek(newPosition);
		      console.log("Seeking to position:", newPosition);
		      if (!this.dragging) { // 避免拖动滑块时自动更新
		        this.sliderValue = value;
		      }
		    } else {
		      console.error("Invalid newPosition:", newPosition);
		    }
		  }
		}





	}
}
</script>

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要实现进度条,需要以下步骤: 1. 在页面中引入uni-ui组件库,可以使用uni-progress组件来实现进度条。 2. 绑定uni-progress组件的value属性到当前歌曲的播放进度,可以使用uni.getBackgroundAudioManager()获取全局唯一的背景音频管理器,通过onTimeUpdate事件监听音乐播放进度的变化,在事件回调中更新进度条的value属性。 3. uni-progress组件提供了一个show-info属性,可以用来显示进度条的百分比,可以根据需要选择是否显示。 4. 如果需要拖动进度条来调整歌曲的播放进度,可以给uni-progress组件绑定一个change事件,当进度条的值发生变化时,在事件回调中调用背景音频管理器的seek方法来跳转到指定的播放时间。 示例代码如下: ```html <template> <view> <audio :src="musicUrl" @play="onPlay" @pause="onPause"></audio> <uni-progress :value="progress" show-info @change="onChange"></uni-progress> </view> </template> <script> export default { data() { return { musicUrl: 'http://music.163.com/song/media/outer/url?id=1330348068.mp3', playing: false, duration: 0, currentTime: 0, progress: 0, } }, mounted() { uni.getBackgroundAudioManager().onTimeUpdate(() => { const audio = uni.getBackgroundAudioManager() this.duration = audio.duration this.currentTime = audio.currentTime this.progress = this.currentTime / this.duration * 100 }) }, methods: { onPlay() { this.playing = true }, onPause() { this.playing = false }, onChange(e) { const audio = uni.getBackgroundAudioManager() const position = e.detail.value / 100 * this.duration audio.seek(position) }, } } </script> ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值