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.5playComm.paused = !playComm.pausedif (!playComm.paused) {// seekaudio.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.5playComm.paused = !playComm.pausedif (!playComm.paused) {// seekaudio.seek(playDetailInfo.value.duration_value) //跳转播放的时间audio.play()} else {audio.pause()}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/463147.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《TCP/IP网络编程》学习笔记 | Chapter 2:套接字类型与协议设置

《TCP/IP网络编程》学习笔记 | Chapter 2&#xff1a;套接字类型与协议设置 《TCP/IP网络编程》学习笔记 | Chapter 2&#xff1a;套接字类型与协议设置套接字协议及其数据传输特性协议&#xff08;Protocol&#xff09;创建套接字协议族&#xff08;Protocol Family&#xff0…

小林渗透入门:burpsuite+proxifier抓取小程序流量

目录 前提&#xff1a; 代理&#xff1a; proxifier&#xff1a; 步骤&#xff1a; bp证书安装 bp设置代理端口&#xff1a; proxifier设置规则&#xff1a; proxifier应用规则&#xff1a; 结果&#xff1a; 前提&#xff1a; 在介绍这两个工具具体实现方法之前&#xff0…

举重场景哑铃图像分割系统:全面改进提升

举重场景哑铃图像分割系统源码&#xff06;数据集分享 [yolov8-seg-GhostHGNetV2&#xff06;yolov8-seg-EfficientHead等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目来源AA…

【机器学习】连续属性离散化与sklearn.preprocessing.KBinsDiscretizer

1. KBinsDiscretizer的定义 KBinsDiscretizer是 scikit-learn 库中的一个类&#xff0c;用于将连续数据离散化成区间&#xff08;bins&#xff09;。这个类通过将特征值分配到 k 个等宽的区间&#xff08;bins&#xff09;来实现离散化&#xff0c;并且可以配置不同的编码方式…

OpenGL入门002——顶点着色器和片段着色器

文章目录 一些概念坐标转换阶段顶点着色器片段着色器VBOVAO 实战简介main.cppCMakeLists.txt最终效果 一些概念 坐标转换阶段 概述&#xff1a; 模型空间、世界空间、视图空间和裁剪空间是对象在3D场景中经历的不同坐标变换阶段。每个空间对应渲染管道的一个步骤&#xff0c;…

使用 Elastic、OpenLLMetry 和 OpenTelemetry 跟踪 LangChain 应用程序

作者&#xff1a;来自 Elastic Bahubali Shetti Langchain 应用程序的使用正在增长。构建基于 RAG 的应用程序、简单的 AI 助手等的能力正在成为常态。观察这些应用程序更加困难。考虑到现有的各种选项&#xff0c;本博客展示了如何将 OpenTelemetry 检测与 OpenLLMetry 结合使…

【Linux】从零开始使用多路转接IO --- select

碌碌无为&#xff0c;则余生太长&#xff1b; 欲有所为&#xff0c;则人生苦短。 --- 中岛敦 《山月记》--- 从零开始认识五种IO模型 1 前言2 认识多路转接select3 多路转接select等待连接4 完善代码5 总结 1 前言 上一篇文章我们讲解了五种IO模型的基本概念&#xff0c;并…

客户端与微服务之间的桥梁---网关

当我们创建好了N多个微服务或者微服务的实例之后&#xff0c;每个服务暴露出不同的端口地址&#xff0c;一般对于客户端请求&#xff0c;只需要请求一个端口&#xff0c;要隔离客户端和微服务的直接关系&#xff0c;保证微服务的安全性和灵活性&#xff0c;避免敏感信息的泄露。…

docker部署nginx+nacos+redis+java镜像和容器

nginx镜像制作 Dockerfile内容&#xff1a; # 基础镜像 FROM nginx # author MAINTAINER ruoyi# 挂载目录 VOLUME /home/ruoyi/projects/ruoyi-ui # 创建目录 RUN mkdir -p /home/ruoyi/projects/ruoyi-ui # 指定路径 WORKDIR /home/ruoyi/projects/ruoyi-ui # 复制conf文件到路…

MiniWord

1.nuget 下载配置 2.引用 3. var value = new Dictionary<string, object>() { ["nianfen"] = nianfen, ["yuefen"] = yuefen, ["yuefenjian1"] = (int.Par…

SpringBoot篇(简化操作的原理)

目录 一、代码位置 二、统一版本管理&#xff08;parent&#xff09; 三、提供 starter简化 Maven 配置 四、自动配置 Spring&#xff08;引导类&#xff09; 五、嵌入式 servlet 容器 一、代码位置 二、统一版本管理&#xff08;parent&#xff09; SpringBoot项目都会继…

Jetson OrinNX平台CSI相机导致cpu load average升高问题调试

1. 前言 硬件: Orin NX JP: 5.1.2, R35.4.1 用v4l2-ctl --stream-mmap -d0 命令去获取相机数据时, 用top查看cpu使用情况, CPU占用率很低,但load average在1左右, 无任何程序运行时,load average 为0 用ps -aux 查看当前进程情况,发现有两个系统进程vi-output, …

Iceoryx2:高性能进程间通信框架(中间件)

文章目录 0. 引言1. 主要改进2. Iceoryx2 的架构3. C示例代码3.1 发布者示例&#xff08;publisher.cpp&#xff09;3.2 订阅者示例&#xff08;subscriber.cpp&#xff09; 4. 机制比较5. 架构比较6. Iceoryx vs Iceoryx2参考资料 0. 引言 Iceoryx2 是一个基于 Rust 实现的开…

获取Hive表备注

DESCRIBE EXTENDED 表名;先获取Detailed Table Information这行的data_type字段数据&#xff0c;进行正则匹配&#xff0c;拿到表备注&#xff0c;如下&#xff1a; String str ReUtil.get("parameters:\\{(?!.*?\\().*transient_lastDdlTime.*?comment(.*?)\\}&quo…

OTFS的基本原理(通俗易懂)

一、OTFS调制解调原理 Orthogonal Time Frequency Space Modulation | IEEE Conference Publication | IEEE Xplore OTFS原论文提出的方法可以概括为 可以概括为 Xdd (延迟多普勒域数据) ----> ISFFT(辛有限傅里叶变换) ---->海森堡变换 延迟多普勒域数据 …

数据结构与算法——Java实现 53.力扣938题——二叉搜索树的范围和

生命的意义 在于活出自我 而不是成为别人眼中的你 —— 24.11.3 938. 二叉搜索树的范围和 给定二叉搜索树的根结点 root&#xff0c;返回值位于范围 [low, high] 之间的所有结点的值的和。 示例 1&#xff1a; 输入&#xff1a;root [10,5,15,3,7,null,18], low 7, high 15 …

顺德自闭症全托管学校:专业照顾,细心呵护

在顺德及周边地区&#xff0c;寻找一所能够为自闭症儿童提供专业照顾与细心呵护的全托管学校&#xff0c;是许多家庭的迫切需求。自闭症儿童在社交、语言和行为上所面临的挑战&#xff0c;需要更为专业的教育环境和细致入微的关怀。而位于广州的星贝育园自闭症儿童寄宿制学校&a…

【react】基础知识点学习

1. 创建项目 npm install -g create-react-app npx create-react-app my-app cd my-app npm startindex.js为入口文件&#xff0c;App.js为根组件。 如何将react应用挂载在页面上&#xff1f; 将App组件渲染到id为root的DOM元素中 2. JSX JSX是|avaScript和XML(HTML)的缩写…

基于 JAVASSM 框架沙县小吃点餐系统

基于 JAVASSM 框架&#xff08;即 Java Spring Spring MVC MyBatis&#xff09;开发一个沙县小吃点餐系统。 步骤一&#xff1a;需求分析 明确系统需要实现的功能&#xff0c;比如&#xff1a; 用户注册和登录浏览菜单添加菜品到购物车下单并支付订单管理后台管理&#…

apt的编译安装(古老通讯)

Ubuntu系统的防火墙关闭&#xff1a; ufw disable 第一步&#xff1a;Ubuntu 安装依赖环境 apt -y install libpcre3-dev zlib1g-dev libssl-dev build-essential 如果出现无法下载则在末尾处假如 --fix missing如下图所示 出现下图则为安装成功 第二步&#xff1a; useradd…