每天总结一个html标签——Audio音频标签
Audio标签
文章目录
- Audio标签
- 一、audio标签的定义与介绍
- 1. 定义介绍
- 2. 语法
- 3. 支持的格式
- 4.文本提示
- 二、audio标签的HTML属性
- 1. autoplay
- 2. loop
- 3. muted
- 4. preload
- 三、audio标签的常用DOM属性
- 四、audio标签的常用事件
- 四、默认样式
- 五、自定义样式
- 1. 示例
- 2. 代码
- 六、播放 m3u8音频
- 七、其他用于播放音频的外部库
一、audio标签的定义与介绍
1. 定义介绍
<audio>
标签是 HTML5 中的一个新元素,它允许开发者直接在 HTML 文档中嵌入音频文件,用户无需安装额外的插件即可播放音频。这一特性大大提升了用户体验,同时也简化了开发者的工作流程。通过<audio>
标签,我们可以轻松地控制音频的播放、暂停、音量等功能,并且可以支持多种音频格式。
2. 语法
<audio>
标签的基本语法非常简单,以下是一个最基本的示例:
<audio src="sample-15s.mp3" controls></audio>
在这个示例中,src
属性指定了音频文件的路径,这里的 sample-15s.mp3
是音频文件的名称。controls
属性是一个布尔属性,当添加该属性时,浏览器会显示一个默认的音频控制界面,用户可以通过这个界面来控制音频的播放、暂停、音量等操作。
除了基本的 src
和 controls
属性外,<audio>
标签还支持多个其他属性,例如 autoplay
、loop
、muted
等。下面是一个包含多个属性的示例:
<audio src="sample-15s.mp3" controls autoplay loop muted></audio>
在这个示例中,autoplay
属性表示音频会在页面加载完成后自动播放;loop
属性表示音频会循环播放;muted
属性表示音频会静音播放。
3. 支持的格式
不同的浏览器对音频格式的支持情况有所不同。为了确保音频能够在大多数浏览器中正常播放,我们通常需要提供多种格式的音频文件。<audio>
标签支持的常见音频格式有 MP3、WAV 和 Ogg。
- MP3:这是一种广泛使用的音频压缩格式,具有较高的压缩比和较好的音质,几乎所有的浏览器都支持 MP3 格式。
- WAV:这是一种无损音频格式,音质非常好,但文件体积较大,主要用于专业音频处理和一些对音质要求较高的场景。
- Ogg:这是一种开放的音频压缩格式,具有较好的压缩比和音质,并且在一些开源浏览器中得到了广泛的支持。
为了兼容不同的浏览器,我们可以在 <audio>
标签中使用多个 <source>
标签来指定不同格式的音频文件,示例如下:
<audio controls><source src="sample-15s.mp3" type="audio/mpeg"><source src="sample-15s.ogg" type="audio/ogg"><source src="sample-15s.wav" type="audio/wav">您的浏览器不支持音频播放。
</audio>
在这个示例中,浏览器会按照 <source>
标签的顺序依次尝试加载音频文件,如果第一个文件无法加载,则会尝试加载第二个文件,以此类推。如果所有的文件都无法加载,则会显示 <audio>
标签内的文本信息。
4.文本提示
在 <audio>
标签中,我们可以添加一些文本提示信息,当浏览器不支持音频播放时,这些信息会显示给用户。例如:
<audio controls><source src="sample-15s.mp3" type="audio/mpeg">您的浏览器不支持音频播放,请升级您的浏览器或安装相关插件。
</audio>
这样,当用户使用的浏览器不支持音频播放时,就会看到相应的提示信息。
二、audio标签的HTML属性
1. autoplay
autoplay
是一个布尔属性,当添加该属性时,音频会在页面加载完成后自动播放。需要注意的是,由于用户体验和流量消耗的问题,一些浏览器会对自动播放功能进行限制,例如 Chrome 浏览器会在用户与页面进行交互之前禁止自动播放音频和视频。示例如下:
<audio src="sample-15s.mp3" autoplay></audio>
2. loop
loop
也是一个布尔属性,当添加该属性时,音频会在播放结束后自动重新开始播放,实现循环播放的效果。示例如下:
<audio src="sample-15s.mp3" loop></audio>
3. muted
muted
属性用于将音频静音。当添加该属性时,音频会在播放时静音,但用户仍然可以通过控制界面调整音量。示例如下:
<audio src="sample-15s.mp3" muted></audio>
4. preload
preload
属性用于控制浏览器如何预加载音频文件。它有三个可选值:
none
:表示浏览器不会预加载音频文件。metadata
:表示浏览器会预加载音频的元数据,如音频的时长、比特率等。auto
:表示浏览器会尽可能地预加载整个音频文件。
示例如下:
<audio src="sample-15s.mp3" preload="metadata"></audio>
三、audio标签的常用DOM属性
DOM 属性 | 解释 |
---|---|
currentTime | 获取或设置音频的当前播放位置(以秒为单位)。 |
duration | 获取音频的总时长(以秒为单位),如果音频不可用则返回 NaN 。 |
paused | 返回一个布尔值,表示音频是否处于暂停状态。 |
ended | 返回一个布尔值,表示音频是否已经播放结束。 |
muted | 获取或设置音频是否静音。 |
volume | 获取或设置音频的音量,取值范围从 0.0(静音)到 1.0(最大音量)。 |
playbackRate | 获取或设置音频的播放速度,1.0 为正常速度。 |
buffered | 返回一个 TimeRanges 对象,包含音频已缓冲的时间范围。 |
seeking | 返回一个布尔值,表示浏览器是否正在尝试跳转到新的播放位置。 |
四、audio标签的常用事件
完整事件请参考:
- MDN-https://developer.mozilla.org/zh-CN/docs/Web/API/HTMLMediaElement
- 菜鸟教程-https://www.runoob.com/tags/ref-av-dom.html
事件名称 | 触发条件 | 用途示例 |
---|---|---|
canplay | 音频文件可以播放时 | 可在此时执行一些初始化操作,如显示播放按钮等 |
play | 音频开始播放时 | 可用于记录播放开始时间、更新播放状态等 |
pause | 音频暂停时 | 可用于暂停相关的业务逻辑,如暂停动画等 |
ended | 音频播放结束时 | 可用于实现自动播放下一首音频等功能 |
timeupdate | 音频的播放位置发生变化时 | 可用于显示当前播放时间、更新进度条等 |
四、默认样式
浏览器会为 <audio>
标签提供一个默认的控制界面,这个界面的样式会因浏览器的不同而有所差异。默认的控制界面通常包含播放/暂停按钮、进度条、音量控制等元素。
- 默认控制界面的display是
inline
- 可以设置宽高,边框等。
- 不能设置音频播放器中的单个组件(如改变按钮大小、改变图标或字体等)
五、自定义样式
要自定义 <audio>
标签的样式,我们可以通过 JavaScript 来创建自定义的控制界面,并使用 CSS 来对其进行样式设计。以下是一个简单的示例:
1. 示例
2. 代码
<style>body {display: flex;justify-content: center;align-items: center;height: 100vh;margin: 0;background-color: #f4f4f9;}.audio-container {width: 600px;background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);padding: 25px;border-radius: 15px;display: flex;align-items: center;box-shadow: 0 10px 25px rgba(0, 0, 0, 0.2);}.control {width: 350px;height: 120px;display: flex;flex-direction: column;justify-content: space-around;align-items: center;}.btn-container {display: flex;align-items: center;}.play-pause-btn, .nav-btn {width: 45px;height: 45px;background-color: rgba(255, 255, 255, 0.1);border: 2px solid rgba(255, 255, 255, 0.5);border-radius: 50%;color: white;cursor: pointer;margin: 0 8px;transition: all 0.3s ease;backdrop-filter: blur(10px);}.play-pause-btn:hover, .nav-btn:hover {background-color: rgba(255, 255, 255, 0.2);transform: scale(1.05);}.progress-bar {width: 300px;height: 6px;background-color: rgba(255, 255, 255, 0.3);margin: 0 10px;border-radius: 3px;}.progress {height: 100%;background-color: white;width: 0%;border-radius: 3px;transition: width 0.1s linear;}.time-display, .cover {color: white;font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;}.time-display {margin: 0 10px;font-size: 14px;}.cover {width: 150px;height: 150px;background-color: rgba(255, 255, 255, 0.1);margin-left: auto;display: flex;align-items: center;justify-content: center;border-radius: 10px;border: 2px solid rgba(255, 255, 255, 0.5);backdrop-filter: blur(10px);font-size: 18px;}</style>
</head><body><div class="audio-container"><div class="control"><div class="btn-container"><button class="nav-btn" id="prevBtn">◀◀</button><button class="play-pause-btn" id="playPauseBtn">▶</button><button class="nav-btn" id="nextBtn">▶▶</button></div><div class="progress-bar"><div class="progress" id="progress"></div><div class="time-display" id="timeDisplay">00:00 / 00:00</div></div></div><div class="cover">歌曲封面</div></div><audio id="myAudio" src="sample-15s.mp3"></audio><script>const audio = document.getElementById('myAudio');const playPauseBtn = document.getElementById('playPauseBtn');const progress = document.getElementById('progress');const timeDisplay = document.getElementById('timeDisplay');const formatTime = (seconds) => {const minutes = Math.floor(seconds / 60);seconds = Math.floor(seconds % 60);return `${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`;};audio.addEventListener('loadedmetadata', function () {timeDisplay.textContent = `00:00 / ${formatTime(audio.duration)}`;});playPauseBtn.addEventListener('click', function () {if (audio.paused) {audio.play();playPauseBtn.textContent = '⏸';} else {audio.pause();playPauseBtn.textContent = '▶';}});audio.addEventListener('timeupdate', function () {const progressPercent = (audio.currentTime / audio.duration) * 100;progress.style.width = `${progressPercent}%`;timeDisplay.textContent = `${formatTime(audio.currentTime)} / ${formatTime(audio.duration)}`;});</script>
</body>
在这个示例中,我们创建了一个自定义的音频控制界面,包括播放/暂停按钮和进度条。通过 JavaScript 监听音频的事件,我们可以实现对音频的控制,并更新进度条的状态。
六、播放 m3u8音频
M3U8 是一种基于 HTTP Live Streaming (HLS) 协议的音频和视频播放列表文件格式,常用于在线流媒体播放。要在网页中播放 M3U8 文件,我们可以使用一些第三方库,如 hls.js
。以下是一个简单的示例:
<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>播放 M3U8 文件</title>
</head>
<body><audio id="myAudio" controls></audio><script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script><script>const audio = document.getElementById('myAudio');if (Hls.isSupported()) {const hls = new Hls();hls.loadSource('your-m3u8-file.m3u8');hls.attachMedia(audio);hls.on(Hls.Events.MANIFEST_PARSED, function() {audio.play();});} </script>
</body>
</html>
在这个示例中,我们引入了 hls.js
库,并使用它来加载和播放 M3U8 文件。如果浏览器支持 HLS 协议,我们会使用 hls.js
来处理;
七、其他用于播放音频的外部库
例如:plyr.js、howler.js、wavesurfer.js 等。这些库提供了更多的功能和自定义选项,使音频播放更加灵活和方便。
相关文章:

每天总结一个html标签——Audio音频标签
Audio标签 文章目录 Audio标签一、audio标签的定义与介绍1. 定义介绍2. 语法3. 支持的格式4.文本提示 二、audio标签的HTML属性1. autoplay2. loop3. muted4. preload 三、audio标签的常用DOM属性四、audio标签的常用事件四、默认样式五、自定义样式1. 示例2. 代码 六、播放 m3…...
使用 React Native 开发鸿蒙(HarmonyOS)运动健康类应用的系统化准备工作
⚙️ 一、环境与工具准备 双环境搭建 React Native 环境:安装 Node.js(≥18.x)、JDK(≥11)、Yarn。鸿蒙开发环境: 下载 DevEco Studio 4.0 及 HarmonyOS SDK;配…...

web3-Remix部署智能合约到“荷兰式”拍卖及以太坊gas费机制细讲
web3-Remix部署智能合约到“荷兰式”拍卖及以太坊gas费机制细讲 一、使用Remix演示智能合约部署 智能合约的代码编写一般都是在Remix上,Remix的好处的话就是可以在浏览器中快速开发和部署合约,无需在本地安装任何程序,十分适合新手。 对应…...

网络编程及原理(一)
目录 一 . 独立模式与网络互联 二 . 局域网 —— LAN (1)基于网线直连 (2)基于集线器组建 (3)基于交换机组建 (4)基于交换机和路由器组建 三 . 广域网 —— WAN 四 …...
superior哥AI系列第9期:高效训练与部署:从实验室到生产环境
🚀 superior哥AI系列第9期:高效训练与部署:从实验室到生产环境 嘿!小伙伴们!👋 欢迎来到superior哥AI系列第9期!经过前面8期的学习,你已经掌握了深度学习的核心技术。但是࿰…...

【Linux】进程 信号保存 信号处理 OS用户态/内核态
🌻个人主页:路飞雪吖~ 🌠专栏:Linux 目录 一、信号保存 ✨进程如何完成对信号的保存? ✨在内核中的表示 ✨sigset_t ✨信号操作函数 🪄sigprocmask --- 获取或设置当前进程的 block表 🪄s…...

[ Qt ] | 与系统相关的操作(一):鼠标相关事件
目录 信号和事件的关系 (leaveEvent和enterEvent) 实现通过事件获取鼠标进入和鼠标离开 (mousePressEvent) 实现通过事件获得鼠标点击的位置 (mouseReleaseEvent) 前一个的基础上添加鼠标释放事件 (mouseDoubleClickEvent) 鼠标双击事件 鼠标移动事件 鼠标滚轮事件 …...

stm32使用hal库模拟spi模式3
因为网上模拟spi模拟的都是模式0,很少有模式3的。 模式3的时序图,在clk的下降沿切换电平状态,在上升沿采样, SCK空闲为高电平 初始化cs,clk,miso,mosi四个io。miso配置为输入,cs、c…...
安装 Nginx
个人博客地址:安装 Nginx | 一张假钞的真实世界 对于 Linux 平台,Nginx 安装包 可以从 nginx.org 下载。 Ubuntu: 版本Codename支持平台12.04precisex86_64, i38614.04trustyx86_64, i386, aarch64/arm6415.10wilyx86_64, i386 在 Debian/Ubuntu 系统…...
Vue-1-前端框架Vue基础入门之一
文章目录 1 Vue简介1.1 Vue的特性1.2 Vue的版本2 Vue的基础应用2.1 Vue3的下载2.2 Vue3的新语法2.3 vue-devtools调试工具3 Vue的指令3.1 内容渲染指令{{}}3.2 属性绑定指令v-bind3.3 事件绑定指令v-on3.4 双向绑定指令v-model3.5 条件渲染指令v-if3.6 列表渲染指令v-for4 参考…...

OurBMC技术委员会2025年二季度例会顺利召开
5月28日,OurBMC社区技术委员会二季度例会顺利召开。本次会议采用线上线下结合的方式,各委员在会上听取了OurBMC社区二季度工作总结汇报,规划了2025年三季度的重点工作。 会上,技术委员会主席李煜汇报了社区2025年二季度主要工作及…...

postman自动化测试
目录 一、相关知识 1.网络协议 2.接口测试 3.编写测试用例 4.系统架构 二、如何请求 1.get请求 编辑2.post请求 3.用环境变量请求 4.Postman测试沙箱 一、相关知识 1.网络协议 规定数据信息发送与解析的方式。 网络传输协议 https相比http,信息在网…...

力扣热题100之二叉树的直径
题目 给你一棵二叉树的根节点,返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 代码 方法:递归 计算二叉树的直径可以理解…...

数字人技术的核心:AI与动作捕捉的双引擎驱动(210)
**摘要:**数字人技术从静态建模迈向动态交互,AI与动作捕捉技术的深度融合推动其智能化发展。尽管面临表情僵硬、动作脱节、交互机械等技术瓶颈,但通过多模态融合技术、轻量化动捕方案等创新,数字人正逐步实现自然交互与情感表达。…...
c++ 命名规则
目录 总结1. 类名(Class Names)2. 变量名(Variable Names)3. 函数名(Function Names)4. 宏定义(Macros)5. 命名空间(Namespaces)6. 枚举(Enums&am…...
GRU 参数梯度推导与梯度消失分析
GRU 参数梯度推导与梯度消失分析 1. GRU 前向计算回顾 GRU 单元的核心计算步骤(忽略偏置项): 更新门: z_t σ(W_z [h_{t-1}, x_t]) 重置门: r_t σ(W_r [h_{t-1}, x_t]) 候选状态: ̃h_t tanh(W_h [r_t ⊙ h_{t-1}, x_t]) 新…...

针对KG的神经符号集成综述 两篇
帖子最后有五篇综述的总结。 综述1 24年TKDD 系统性地概述了神经符号知识图谱推理领域的进展、技术和挑战。首先介绍了知识图谱(KGs)和符号逻辑的基本概念,知识图谱被视为表示、存储和有效管理知识的关键工具,它将现实世界的知识…...

RabbitMQ和MQTT区别与应用
RabbitMQ与MQTT深度解析:协议、代理、差异与应用场景 I. 引言 消息队列与物联网通信的重要性 在现代分布式系统和物联网(IoT)生态中,高效、可靠的通信机制是构建稳健、可扩展应用的核心。消息队列(Message Queues&am…...
Vue跨层级通信
下面,我们来系统的梳理关于 Vue跨层级通信 的基本知识点: 一、跨层级通信核心概念 1.1 什么是跨层级通信 跨层级通信是指在组件树中,祖先组件与后代组件(非直接父子关系)之间的数据传递和交互方式。这种通信模式避免了通过中间组件层层传递 props 的繁琐过程。 1.2 适用…...
docker常见命令行用法
🧨 一、关闭和清理 Docker 服务相关命令 🔻 docker-compose down 作用:关闭并删除所有使用当前 docker-compose.yml 启动的容器、网络、挂载卷(匿名的)、和依赖关系。 通俗解释:就像你关掉了一个 App&am…...

Axure设计案例:滑动拼图解锁
设计以直观易懂的操作方式为核心,只需通过简单的滑动动作,将拼图块精准移动至指定位置,即可完成解锁。这种操作模式既符合用户的日常操作习惯,在视觉呈现上,我们精心设计拼图图案,融入生动有趣的元素&#…...

MySQL权限详解
在MySQL中,权限管理是保障数据安全和合理使用的重要手段。MySQL提供了丰富的权限控制机制,允许管理员对不同用户授予不同级别的操作权限。本文将会对MySQL中的权限管理,以及内核如何实现权限控制进行介绍。 一、权限级别 MySQL 的权限是分层…...
基于BP神经网络的语音特征信号分类
基于BP神经网络的语音特征信号分类的MATLAB实现步骤: 1. 数据预处理 信号采样:读取语音信号并进行采样,确保信号具有统一的采样率。例如: [y, Fs] audioread(audio_file.wav); % 读取音频文件预加重:增强高频信号&am…...

解决fastadmin、uniapp打包上线H5项目路由冲突问题
FastAdmin 基于 ThinkPHP,默认采用 URL 路由模式(如 /index.php/module/controller/action),且前端资源通常部署在公共目录(如 public/)下。Uniapp 的历史模式需要将所有前端路由请求重定向到 index.html&a…...

web3-区块链的交互性以及编程的角度看待智能合约
web3-区块链的交互性以及编程的角度看待智能合约 跨链交互性 交互性 用户在某一区块链生态上拥有的资产和储备 目标:使用户能够把资产和储备移动到另一个区块链生态上 可组合性 使在某一区块链的DAPP能调用另一个区块链上的DAPP 如果全世界都在用以太坊就…...

数据结构(7)—— 二叉树(1)
目录 前言 一、 树概念及结构 1.1树的概念 1.2树的相关概念 1.3数的表示 1.二叉树表示 2.孩子兄弟表示法 3.动态数组存储 1.4树的实际应用 二、二叉树概念及结构 2.1概念 2.2特殊的二叉树 1.满二叉树 2. 完全二叉树 2.3二叉树的性质 2.4二叉树的存储结构 1.顺序存储 2.链式存储…...
ROS1和ROS2的区别autoware.ai和autoware.universe的区别
文章目录 前言一、ROS1和ROS2的区别一、ROS2通讯实时性比ROS1强二、ROS1官方不再维护了三、ROS2的可靠性比ros1强四、ROS2的安全性比ros1强五、ROS2资源占用低六、等等等等 二、autoware.ai和autoware.universe的区别一、autoware.ai不维护了二、autoware.universe功能多&#…...

如何使用 Docker 部署grafana和loki收集vllm日志?
环境: Ubuntu20.04 grafana loki 3.4.1 问题描述: 如何使用 Docker 部署grafana和loki收集vllm日志? 解决方案: 1.创建一个名为 loki 的目录。将 loki 设为当前工作目录: mkdir loki cd loki2.将以下命令复制并粘贴到您的命令行中,以将 loki-local-config.yaml …...

Kafka入门- 基础命令操作指南
基础命令 主题 参数含义–bootstrap-server连接的Broker主机名称以及端口号–topic操作的topic–create创建主题–delete删除主题–alter修改主题–list查看所有主题–describe查看主题的详细描述–partitions设置分区数–replication-factor设置分区副本–config更新系统默认…...

目标检测我来惹1 R-CNN
目标检测算法: 识别图像中有哪些物体和位置 目标检测算法原理: 记住算法的识别流程、解决问题用到的关键技术 目标检测算法分类: 两阶段:先区域推荐ROI,再目标分类 region proposalCNN提取分类的目标检测框架 RC…...