首页 > 其他分享 >uniapp使用uni.createInnerAudioContext()播放指定音频并且切换

uniapp使用uni.createInnerAudioContext()播放指定音频并且切换

时间:2024-11-03 18:50:12浏览次数:3  
标签:uniapp 播放 createInnerAudioContext index playComm value uni audio const

uniapp使用uni.createInnerAudioContext()播放指定音频并且切换

  1. 因为做的小程序或者h5需要视频讲解或者音乐组件的 默认展示播放按钮,当点击播放的时候 显示暂停音乐这样的一个效果。

在unipp中我们直接只用uni.createInnerAudioContext()代替audio,使用更加方便,更加简洁,uniapp内部创建并返回内部 audio 上下文 uni.innerAudioContext 对象。

1.创建uni.innerAudioContext

直接使用内置api不需要引入下载

const audio = uni.createInnerAudioContext()

创建完成 把你想要播放的音频给到audio

const audio = uni.createInnerAudioContext()
audio.src = "http://xxxxxxx"

这样我们就创建完成并且把音频已经给到了audio,接下来就是就是需要一个方法去播放暂停

const audio = uni.createInnerAudioContext()
audio.src = "http://xxxxxxx"
audio.play() //播放  //注意 先要把音频给到audio再去进行播放  
audio.pause() //暂停

现在已经实现了一个基本的播放音频了,下面深入详解

2.深入了解uni.innerAudioContext

倒计时

倒计时,首先我们需要先获取到当前播放音频的总时长,然后获取到当前播放到那一秒

<slider class="audio-slider" activeColor="rgb(248, 78, 81)" block-size="8"
:value="playDetailInfo.current_value" :max="playDetailInfo.duration_value"
@change="handleChange"></slider>

这个组件是uni内置的一个组件滑动选择器。可以使用当成音乐倒计时。

在这里插入图片描述

然后我们需要在点击开始播放的时候,获取到时间

const audio = uni.createInnerAudioContext()
audio.src = "http://xxxxxxx"
audio.play() //播放  //注意 先要把音频给到audio再去进行播放  

//获取总时间赋值
playDetailInfo.value.duration_value = innerAudioContext.duration 

然后去获取当前播放的时间,使用onTimeUpdate内置方法进行监听,然后去赋值给滑动组件,那么滑动组件会根据当前的时间滑到对应的位置

	audio.onTimeUpdate(() => {
		// 获取当前播放的总时长,单位:秒
		const currentTime = audio.currentTime;
		if(currentTime > 0){
		playDetailInfo.value.current_value = innerAudioContext.duration 
		}
		initLyric()
		// console.log('当前播放时间:', currentTime);
	});
上一首,下一首,暂停,播放

当点击切换歌曲的时候,上一首或者下一首的时候,我们的歌曲地址,包括进度条时间,都会发生改变,对应着新的播放音频

上一首或者下一首

	const handleChangePlay = (val) => {
	//1是上一首,其他是下一首
	//playComm.tabDate是我们的播放列表,当前的歌在播放列表中
		// if (val == 1) {
			playComm.tabDate.forEach((el,index) => {
				console.log(el.sid , playInfo.sid)
				//判断我们当前播放的歌,在播放列表中索引是多少,如果找到了之后 
				//找到后如果是下一首那么我们把当前歌曲切换 并且抛出错误终止循环
				if (el.sid == playInfo.sid) {
                    if (playComm.tabDate[ val == 1 ? index + 1 :  index -1]) {
					     nextSong(playComm.tabDate[val ==1 ? index + 1 : index -1],index)
					     throw Error();
                                  }else{
					       nextSong(playComm.tabDate[val ==1 ? 0 :playComm.tabDate.length - 1],index)
					       throw Error();
				       }
				}
			})
		// }
	}
	
	//清空事件
		const nextSong = (item, index) => {
		playDetailInfo.value.current_value = 0 //当前播放时间清空
		playComm.paused = true  //播放按钮或者停止按照变
		playInfo.sid = item.sid //当前播放的id赋值
		playInfo.nickName = item.nickName //当前播放的歌词名字
		playInfo.name = item.name //当前播放歌词谁唱的
		setTimeout(()=>{
			playDetailInfo.value.duration = convertSecondsToMinutesAndSeconds(innerAudioContext
				.duration)
			playDetailInfo.value.duration_value = innerAudioContext.duration
		},500)
		playMusic()
	}
	
	//播放事件开始结束
		const playMusic = () => {
		console.log(123)
		audio.src = playInfo.souce;
		
		audio.volume = 0.5
		playComm.paused = !playComm.paused
		
		if (!playComm.paused) {
			// seek
			audio.seek(playDetailInfo.value.duration_value) //跳转播放的时间
			audio.play()
		} else {
			audio.pause()
		}
	}
顺序播放,循环播放

在事件onEnded播放完成里面实现

	audio.onEnded(() => {
	//顺序播放
		if (!playComm.xunhuan) {
			handleChangePlay(1)
		}else{ //随机播放
		// 传入当前列表获取随机
			const X = getRandomItem(playComm.tabDate)
			console.log(X)
			nextSong(X)
		}
	})
	
	const getRandomItem = (array)=> {  
	    // 生成一个从 0 到 array.length - 1 的随机索引  
	    const randomIndex = Math.floor(Math.random() * array.length);  
	    // 返回数组中该索引对应的元素  
	    return array[randomIndex];  
	}  
	
	
	const handleChangePlay = (val) => {
	//1是上一首,其他是下一首
	//playComm.tabDate是我们的播放列表,当前的歌在播放列表中
		// if (val == 1) {
			playComm.tabDate.forEach((el,index) => {
				console.log(el.sid , playInfo.sid)
				//判断我们当前播放的歌,在播放列表中索引是多少,如果找到了之后 
				//找到后如果是下一首那么我们把当前歌曲切换 并且抛出错误终止循环
				if (el.sid == playInfo.sid) {
                    if (playComm.tabDate[ val == 1 ? index + 1 :  index -1]) {
					     nextSong(playComm.tabDate[val ==1 ? index + 1 : index -1],index)
					     throw Error();
                                  }else{
					       nextSong(playComm.tabDate[val ==1 ? 0 :playComm.tabDate.length - 1],index)
					       throw Error();
				       }
				}
			})
		// }
	}
	
	//清空事件
		const nextSong = (item, index) => {
		playDetailInfo.value.current_value = 0 //当前播放时间清空
		playComm.paused = true  //播放按钮或者停止按照变
		playInfo.sid = item.sid //当前播放的id赋值
		playInfo.nickName = item.nickName //当前播放的歌词名字
		playInfo.name = item.name //当前播放歌词谁唱的
		setTimeout(()=>{
			playDetailInfo.value.duration = convertSecondsToMinutesAndSeconds(innerAudioContext
				.duration)
			playDetailInfo.value.duration_value = innerAudioContext.duration
		},500)
		playMusic()
	}
	
	//播放事件开始结束
		const playMusic = () => {
		console.log(123)
		audio.src = playInfo.souce;
		
		audio.volume = 0.5
		playComm.paused = !playComm.paused
		
		if (!playComm.paused) {
			// seek
			audio.seek(playDetailInfo.value.duration_value) //跳转播放的时间
			audio.play()
		} else {
			audio.pause()
		}
	}

标签:uniapp,播放,createInnerAudioContext,index,playComm,value,uni,audio,const
From: https://blog.csdn.net/m0_74079648/article/details/143468816

相关文章

  • unity3d————坐标转换(世界转本地)
    this.transform.InverseTransformPoint1. 世界坐标系与局部坐标系世界坐标系:Unity3D中的全局参考框架,所有游戏对象的位置、旋转和缩放都是相对于这个框架来定义的。局部坐标系:每个游戏对象都有自己的局部坐标系,这个坐标系是相对于该游戏对象的位置、旋转和缩放来定义的。2......
  • unity3d——Time
    在Unity3D中,Time类是一个非常重要的工具类,它提供了一系列与时间相关的属性和方法,帮助开发者在游戏中实现各种时间相关的操作。以下是一些Time类常用的方法及其示例:一、常用属性Time.time含义:表示从游戏开始到现在的时间,以秒为单位。该时间会随着游戏的暂停而停止计算。示例......
  • unity3d——Vector3
    在Unity3D中,Vector3是一个非常重要的结构体,用于表示三维空间中的位置和方向。以下是关于Vector3的一些关键知识点:一、Vector3的基本概念和属性定义:Vector3是一个包含三个浮点数的结构体,分别代表X、Y和Z轴上的分量。它用于描述具有大小和方向两个属性的物理量,如速度、加速度......
  • The 3rd Universal Cup. Stage 15: Chengdu
    A.ArrowaRow一个简单的构造题,构造的思路是先把又侧的连续>放满,再从左侧逐个开始放,如果是>就放一个长度为5的,如果是-,可以一次性直接把连续的都放了。#include<bits/stdc++.h>usingnamespacestd;usingi32=int32_t;usingi64=longlong;usingvi=vector<int>......
  • Java+Uni-App基于微信小程序的生日礼品管理系统/生日礼物策划系统
    项目介绍科学技术日新月异,人们的生活都发生了翻天覆地的变化,生日福利管理当然也不例外。过去的信息管理都使用传统的方式实行,既花费了时间,又浪费了精力。在信息如此发达的今天,我们可以通过网络这个媒介,快速的查找自己想要的信息,更加全方面的了解自己的网站信息。而......
  • [python]Gunicorn加持,轻松提升Flask超7倍性能
    前言之前学习和实际生产环境的flask都是用app.run()的默认方式启动的,因为只是公司内部服务,请求量不高,一直也没出过什么性能问题。最近接管其它小组的服务时,发现他们的服务使用Gunicorn+Flask的方式运行的,本地开发用的gevent的WSGIServer。对于Gunicorn之前只是耳闻,没实际用过,正......
  • uniapp - 运行打包出现警告报错The legacy JS API is deprecated and will be removed
    问题描述在uniapp项目运行打包时警告提示ThelegacyJSAPIisdeprecatedandwillberemovedinDartSass2.0.0,另外还有可能存在其他sass错误或报错警告,uniapp正常运行项目也可能会提示此错误,无论是Hbuilder升级还是降级都不行(还有更坑的是就是升级完hbuilder才报的),详......
  • Unity——删除一个DontDestroyOnLoad的物体
    文章目录前言一、示例前言在Unity中,如果你想要删除一个被标记为DontDestroyOnLoad的GameObject,你可以通过调用Destroy方法来实现。但是由于DontDestroyOnLoad会在场景切换时保持对象不被销毁,你需要先取消这个标记,然后再销毁它。一、示例usingUnityEngine;publ......
  • 【MySQL系列】理解 `utf8mb4` 和 `utf8mb4_unicode_ci`
    ......