HTML5音频播放标签介绍及实现简单的音频播放器代码
发表于:2025-05-23 14:39:50浏览:91次
新的项目要在网页端为课程加一个音频播放的功能,H5的audio标签可以满足此功能,并且有丰富的api可供选择。HTML5音频播放器是一种利用现代Web技术,特别是HTML5、CSS和JavaScript,为网页构建的媒体播放工具。这种播放器可以支持多种音频格式,如MP3,让网站用户可以直接在浏览器中播放音频内容,无需依赖Flash或其他外部插件。
下面将深入探讨如何使用HTML5、JavaScript以及可能涉及到的相关技术来实现一个音频播放器。
audio标签是用来播放音频文件的。支持的格式:
音频格式 | MINE-type |
---|---|
MP3 | audio/mpeg |
Ogg | audio/ogg |
Wav | audio/wav |
可以在 和 之间放置文本内容,这些文本信息将会被显示在那些不支持 标签的浏览器中。
1.audio对象属性:
属性 | 描述 |
---|---|
audioTracks | 返回表示可用音频轨道的 AudioTrackList 对象 |
autoplay | 设置或返回是否在加载完成后随即播放音频 |
buffered | 返回表示音频已缓冲部分的 TimeRanges 对象 |
controller | 返回表示音频当前媒体控制器的 MediaController 对象 |
controls | 设置或返回音频是否显示控件(比如播放/暂停等) |
crossOrigin | 设置或返回音频的 CORS 设置 |
currentSrc | 回当前音频的 URL |
currentTime | 设置或返回音频中的当前播放位置(以秒计) |
defaultMuted | 设置或返回音频默认是否静音 |
defaultPlaybackRate | 设置或返回音频的默认播放速度 |
duration | 返回当前音频的长度(以秒计) |
ended | 返回音频的播放是否已结束 |
error | 返回表示音频错误状态的 MediaError 对象 |
loop | 设置或返回音频是否应在结束时重新播放 |
mediaGroup | 设置或返回音频所属的组合(用于连接多个音频元素) |
muted | 设置或返回音频是否静音 |
networkState | 返回音频的当前网络状态 |
paused | 设置或返回音频是否暂停 |
playbackRate | 设置或返回音频播放的速度 |
played | 返回表示音频已播放部分的 TimeRanges 对象 |
preload | 设置或返回音频是否应该在页面加载后进行加载 |
readyState | 返回音频当前的就绪状态 |
seekable | 返回表示音频可寻址部分的 TimeRanges 对象 |
seeking | 返回用户是否正在音频中进行查找 |
src | 设置或返回音频元素的当前来源 |
textTracks | 返回表示可用文本轨道的 TextTrackList 对象 |
volume | 设置或返回音频的音量 |
2.Audio 对象方法
方法 | 描述 |
---|---|
addTextTrack() | 在音频中添加一个新的文本轨道 |
canPlayType() | 检查浏览器是否可以播放指定的音频类型 |
fastSeek() | 在音频播放器中指定播放时间。 |
getStartDate() | 返回一个新的Date对象,表示当前时间轴偏移量 |
load() | 重新加载音频元素 |
play() | 开始播放音频 |
pause() | 暂停当前播放的音频 |
3.Audio对象事件
事件 | 描述 |
---|---|
abort | 当音频/视频的加载已放弃时触发。 |
canplay | 当浏览器可以开始播放音频/视频时触发。 |
canplaythrough | 当浏览器可在不因缓冲而停顿的情况下进行播放时触发。 |
durationchange | 当音频/视频的时长已更改时触发。 |
emptied | 当目前的播放列表为空时触发。 |
ended | 当目前的播放列表已结束时触发。 |
error | 当在音频/视频加载期间发生错误时触发。 |
loadeddata | 当浏览器已加载音频/视频的当前帧时触发。 |
loadedmetadata | 当浏览器已加载音频/视频的元数据时触发。 |
loadstart | 当浏览器开始查找音频/视频时触发。 |
pause | 当音频/视频已暂停时触发。 |
play | 当音频/视频已开始或不再暂停时触发。 |
playing | 当音频/视频在因缓冲而暂停或停止后已就绪时触发。 |
progress | 当浏览器正在下载音频/视频时触发。 |
ratechange | 当音频/视频的播放速度已更改时触发。 |
seeked | 当用户已移动/跳跃到音频/视频中的新位置时触发。 |
seeking | 当用户开始移动/跳跃到音频/视频中的新位置时触发。 |
stalled | 当浏览器尝试获取媒体数据,但数据不可用时触发。 |
suspend | 当浏览器刻意不获取媒体数据时触发。 |
timeupdate | 当目前的播放位置已更改时触发。 |
volumechange | 当音量已更改时触发。 |
waiting | 当视频由于需要缓冲下一帧而停止时触发。 |
4.简易音频播放器代码
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>音视频</title>
<script src='../js/jquery.js'></script>
<style>
*{margin:0;padding: 0;}
/* 主容器样式 */
#box1{
display: flex;
width: 600px;
height: 500px;
flex-direction: column;
}
/* 音频列表容器样式 */
#audioList{
display: flex;
flex-direction: column;
width: 600px;
height: 400px;
}
/* 音频信息容器样式 */
#audioInfo{
display: flex;
flex-direction: row;
justify-content: space-around;
align-items: center;
width: 600px;
height: 50px;
}
/* 音频控制容器样式 */
#audioContro{
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
width: 600px;
height: 50px;
}
/* 歌曲列表复选框样式 */
#audioList select{
height: 400px;
border: 1px solid gray;
border-radius: 2%;
}
/* 进度条样式 */
#audioSlider{
width: 400px;
}
/* 图标样式 */
img{
width: 40px;
height: 40px;
}
#audioStata{
display: flex;
flex-direction: column;
font-size: 10px;
}
#voiceSlider{
position: absolute;
display: none;
height: 80px;
left: 300px;
top: 380px;
background-color: red;
/* writing-mode: bt-lr; */
-webkit-appearance:slider-vertical;
}
</style>
</head>
<body>
<div id='box1'>
<!-- 歌曲列表容器 -->
<div id='audioList'>
<select id='audioSelect' multiple ></select>
</div>
<!-- 音频播放标签 -->
<audio id='audio1'></audio>
<!-- 音频信息容器 -->
<div id='audioInfo'>
<p id='audioCurTime'>00:00:00</p>
<input id="audioSlider" type="range" min="0" max="550" step="1" value="0" />
<p id='audioTolTime'>00:00:00</p>
<div id='audioStata'>
<p id='voice'></p>
<p id='isLoop'></p>
</div>
</div>
<!-- 音频控容器 -->
<div id='audioContro'>
<img src='img/play.png' title='播放' onclick="play()"/>
<img src='img/pause.png' title='暂停' onclick="pause()"/>
<img src='img/last.png' title='上一曲' onclick='last()'/>
<img src='img/next.png' title='下一曲' onclick='next()'/>
<img src='img/stop.png' title='停止' onclick="stop()"/>
<img src='img/voice.png' title='音量' onclick="voiceDisplay()"/>
<img src='img/metu.png' title='静音' onclick="mute()"/>
<img src='img/loop.png' title='循环' onclick='loop()'/>
<input id="voiceSlider" type="range" min="0" max="100" step="1" value="100" />
</div>
</div>
<script>
var $audio=$('#audio1'); //获取音频播放对象
var audioList=['music/01.mp3','music/02.mp3','music/03.mp3'] //将歌曲放在一个列表中
for (i in audioList){ //遍历歌曲列表,并填加到歌曲列表容器
var $option='<option '+'value='+i+'>'+audioList[i]+'</option>'
$('#audioSelect').append($option)
}
$('#audioSelect').prop('selectedIndex',0); //歌曲列表选中第一首
$audio.attr('src',audioList[$('#audioSelect').val()]); //音频标签默认选中第一首
$('#voice').html('音量:'+ $('#voiceSlider').val()+'%')
$('#isLoop').html('顺序播放')
$('#audioSelect').on('dblclick',function(){ //双击歌曲列表,播放相应的歌曲
$audio.attr('src',audioList[$('#audioSelect').val()]);
play();
})
function play(){ //定义播放函数
$audio.attr('src',audioList[$('#audioSelect').val()]); //将当前选中的歌曲路径添加到播放标签
$audio[0].load() //载入歌曲
$audio[0].oncanplay=function(){
$('#audioSlider').attr('max',$audio[0].duration); //获取歌曲时长
$('#audioTolTime').html(getTime($audio[0].duration)); //在信息显示容器显示歌曲时长
}
$audio[0].play(); //播放放歌曲
}
function pause(){ //定义暂停函数
$audio[0].pause()
}
function stop(){ //定义停止函数 ,将暂停,再将当前播放时间设为0
$audio[0].pause()
$audio[0].currentTime=0
}
function mute(){ //定义静音函数,如果当前不是静音,则调为静音,反之调为非静音
console.log('metu')
if ($audio[0].muted){
$audio[0].muted=false;
}
else{
$audio[0].muted=true;
$('#voiceSlider').val(0)
$('#voice').html('音量:'+$('#voiceSlider').val()+'%')
}
}
function loop(){ //定义循环函数,如果当前不是循环,则调为循环,反之调为连续播放
if ($audio[0].loop){
$audio[0].loop=false;
$('#stata').attr('src','img/continuous.png');
$('#isLoop').html('顺序播放');
}
else{
$audio[0].loop=true;
$('#stata').attr('src','img/loop.png');
$('#isLoop').html('单曲循环');
}
}
function last(){ //定义播放上一曲函数,将播放列表index-1后播放
if($('#audioSelect')[0].selectedIndex!=0){
$('#audioSelect')[0].selectedIndex--;
play()
}
}
function next(){ //定义播放下一曲函数,将播放列表index+1后播放
if($('#audioSelect')[0].selectedIndex+1<$('#audioSelect')[0].length){
$('#audioSelect')[0].selectedIndex++;
play()
}
}
function voiceDisplay(){ //显示音量调节滑块
$('#voiceSlider').css('display','block')
}
$('#audioSlider').on('input',function(){ //给进度条添加事件,当拉动进度条时,相应调整歌曲的播放位置
$audio[0].currentTime=$('#audioSlider').val()
})
$audio.on('ended',function(){ //给音频标签添加事件,当歌曲播放完后,自动播放下一曲
if($('#audioSelect')[0].selectedIndex+1<$('#audioSelect')[0].length){
$('#audioSelect')[0].selectedIndex++;
play()
}
else{
console.log('end')
}
})
$('#voiceSlider').on('mouseout',function(){ //当鼠标移出时,隐藏音量调节滑块
$('#voiceSlider').css('display','none')
})
$('#voiceSlider').on('input',function(){ //拖动音量调节滑块时调节音频音量
if ($('#voiceSlider').val()){
$audio[0].muted=false;
}
else{
$audio[0].muted=true;
}
$('#voice').html('音量:'+ $('#voiceSlider').val()+'%')
$audio[0].volume=$('#voiceSlider').val()/100;
})
var audioTimer=setInterval(function(){ //定时器,用于动态显示播放时间和拉动进度条
sec=parseInt($audio[0].currentTime);
$('#audioCurTime').html(getTime(sec));
$('#audioSlider')[0].value=sec;
},1000)
function getTime(sec){ //将秒数转换为00:00:00这样的时间格式
var h=parseInt(sec/3600).toString().padStart(2,'0')
var m=parseInt((sec-h*3600)/60).toString().padStart(2,'0')
var s=parseInt(sec-h*3600-m*60).toString().padStart(2,'0')
var time=h+':'+m+':'+s
return time
}
</script>
</body>
</html>
推荐文章
- Vite 2.5 发布,全新的前端构建工具
- 微软Edge浏览器在100版本里程碑之前的最后一个稳定版Edge99发布
- jquery表单input、select、radio、check监听事件集合
- 用Prismjs给勾股博客的文章模块增加代码高亮功能
- thinkphp6将汉字转为拼音的功能实现
- Thinkphp6使用Dompdf将HTML转换为PDF,并且支持中文
- DevOps已向业务进阶,如何实现项目研发效率的提升?
- nginx跨域访问,需要如何配置?宝塔面板如何配置跨域?
- 前端报错:was loaded over HTTPS, but requested an insecure错误解决方案
- 不知道是什么时候起,直播行业也开始内卷了