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

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()
		}
	}

<think>好的,我需要回答用户关于在UniApp中实现音频文件播放的问题,特别是使用API的示例教程。首先,我需要回顾用户提供的引用内容,看看是否有相关的信息。引用[1]提到了uni.getBackgroundAudioManager(),这个API显然是用于背景音频播放的,适合音乐播放器之类的应用。引用[2]和[3]则更多涉及文件预览和媒体文件管理,但可能也包含一些有用的信息。 用户想要知道如何播放音频文件,可能需要两种方式:普通音频播放和后台播放。根据引用[1],uni.getBackgroundAudioManager()是处理后台播放的,而普通播放可能使用innerAudioContext。我需要确认UniApp的文档是否支持这两种方式,并给出示例代码。 接下来,我应该分步骤说明如何实现这两种播放方式。对于普通播放使用uni.createInnerAudioContext(),设置src,然后调用play()。对于后台播放使用uni.getBackgroundAudioManager(),同样设置src和title,然后播放。需要注意两者的区别,比如后台播放需要设置title,且在退出页面时仍能播放。 另外,用户可能需要处理音频源的问题,比如本地文件还是远程URL。引用[2]提到在线下载并预览文件,所以可能需要从网络获取音频文件,但播放API应该支持远程URL。同时,引用[3]中的MediaStore可能涉及如何获取本地文件路径,不过UniApp通常使用相对路径或网络路径,可能需要使用uni.downloadFile下载远程文件到本地临时路径后再播放。 还需要考虑权限问题,比如在manifest.json中配置音频播放权限,特别是安卓平台。此外,测试时要注意真机调试,因为模拟器可能不支持某些功能。 最后,生成相关问题,帮助用户进一步了解音频播放的其他方面,比如控制播放进度、事件监听、UI设计等。</think>### UniApp音频文件播放实现方法 在UniApp中实现音频播放功能,主要涉及两种场景:普通音频播放和后台持续播放。以下是具体实现方法和示例代码: --- #### 一、普通音频播放(适合短音频使用`uni.createInnerAudioContext()` API实现基础播放功能,适合短音频且不需要后台持续播放的场景。 **实现步骤:** 1. 创建音频实例 2. 配置音频源与参数 3. 添加播放控制逻辑 ```javascript // 创建音频实例 const innerAudioContext = uni.createInnerAudioContext(); // 配置音频源(支持本地和远程路径) innerAudioContext.src = 'https://example.com/audio.mp3'; // 监听播放事件 innerAudioContext.onPlay(() => { console.log('开始播放'); }); // 播放控制 function playAudio() { innerAudioContext.play(); } function pauseAudio() { innerAudioContext.pause(); } // 销毁实例(页面卸载时调用) onUnload(() => { innerAudioContext.destroy(); }); ``` --- #### 二、后台音频播放(长音频场景) 通过`uni.getBackgroundAudioManager()`实现后台播放功能,支持锁屏状态持续播放[^1]。 ```javascript const bgAudioManager = uni.getBackgroundAudioManager(); // 必须设置title属性(安卓平台要求) bgAudioManager.title = '音频标题'; bgAudioManager.singer = '创作者'; bgAudioManager.coverImgUrl = 'https://example.com/cover.jpg'; // 设置音频源(支持本地和网络路径) bgAudioManager.src = '/static/audio.mp3'; // 播放控制 function startBackgroundPlay() { bgAudioManager.play(); } function stopBackgroundPlay() { bgAudioManager.stop(); // 停止后会清空src } ``` --- #### 三、关键注意事项 1. **音频源类型** - 网络地址需配置域名白名单(manifest.json中设置) - 本地文件建议放在`static`目录下 2. **平台差异** - iOS需在manifest.json中勾选`audio`权限 - 安卓需添加`<uses-permission android:name="android.permission.WAKE_LOCK"/>` 3. **事件监听** 建议监听`onTimeUpdate`更新进度条,监听`onError`处理异常 ```javascript bgAudioManager.onError((res) => { console.log('播放错误:', res.errMsg); }); ``` --- #### 四、完整功能扩展建议 1. 实现进度条控制 ```javascript bgAudioManager.onTimeUpdate(() => { const progress = bgAudioManager.currentTime / bgAudioManager.duration; }); ``` 2. 添加播放列表管理 可通过数组存储多个音频地址,配合索引切换 3. 状态持久化 使用`uni.setStorage`保存播放进度 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值