H5编写Audio音乐播放器——李帅醒博客

版权声明:本文为博主 我吃酸萝卜/李帅醒 原创, 未经博主允许不得转载。新浪微博@我吃酸萝卜 https://blog.csdn.net/wcslb/article/details/54586758

今天教大家使用html5 Audio标签实现音乐播放器,模仿QQ音乐、天天动听等类似效果。这是我当年刚接触H5的一个小demo,适合初学者初考,代码也有很大的优化空间。


  1. audio
属性 属性值 注释
src url 播放音乐的url地址
preload load/auto 预加载
loop loop 循环播放
controls controls 是否显示默认的控制按钮
autoplay autoplay 自动播放



各大浏览器对音乐格式的支持情况

音频格式 Chrome Firefox IE9 Opera Safari
OGG 支持 支持 支持
MP3 支持 不支持 支持
WAV 不支持 支持 不支持

属性

属性 Chrome Firefox
duration 获取媒体文件的总时长,以秒(S)为单位,如果无法获取返回NaN
paused 如果媒体文件被暂停,那么paused属性返回true,反之false
ended 如果媒体文件播放完毕返回true
muted 用来获取是否为静音状态,值为bool
volume 控制音量的属性,值为0-1;0 为最小,1为最大
startTime 返回起始的播放时间
error 返回错误的代码,额uull的时候为正常,否则可以通过Music.error.code来获取具体繁荣错误代码:
currentTime 用来获取或者控制当前的播放时间,单位是秒(S)
currentSrc 以字符串的形式返回正在播放或者已经加载的文件

函数 作用
load() 加载音频,视频
play() 播放
pause() 暂停播放
canPlayType() 测试是否支持给定类型文件

常用的事件

事件名称 事件作用
loadstart 客户端开始请求数据
progress 客户端正在请求数据,缓冲
play  
pause  
ended  
timeupdate 当前播放时间发生改变的时候
canplaythrough 歌曲已经载入完全
canplay 缓冲至目前可播放的状态

注意事项:
1.由于音乐文件加载需要事件,所以不能立即取到audio.duration;
2.需要封装一个函数判断音乐播放完毕。
3.因为是移动端需要用rem进行自适应。
JS代码:
源码地址,可以去下载看看   http://download.csdn.net/download/wcslb/9740065
fn();
function fn(){
	var w = window.innerWidth / 30;
	var html = document.querySelector('html');
	html.style.fontSize = w + 'px';
};
window.onresize = fn;
$("#footer").load("footer.html");
//轮播图
var mySwiper = new Swiper('.swiper-container', {
	// 环路
	loop : true,
	//分页器
	pagination : '.swiper-pagination',
	paginationClickable :true,
})
// 当前播放的歌曲编号
var num=0;

var audio=document.querySelector("audio");
$(".songMenu").on('click',function(){
	 $("#songMenu").slideDown("fast");
})
$(".off").on('click',function(){
	$("#songMenu").slideUp("fast");
});
$("main").add("header").on('click',function(){
	$("#songMenu").slideUp("fast");
})

var musicArr=["mp3/袖手旁观.mp3","mp3/莫文蔚 (Karen Mok) - 当你老了.mp3","mp3/阿肆 - 我在人民广场吃炸鸡.mp3"]
//音播放开关乐
$(".stop").on('click',function(){
	if(audio.paused){
		Index(num);
		$("#dog").attr("class","dog");
		$(".stop").html("");
	}else{
		audio.pause();
		$("#dog").removeAttr("class","dog");
		$(".stop").html("");
	}
})
// 上一曲
$(".MovePrevious").on('click',function(){
	num=(3+--num)%3;
	Index(num);
});
//下一曲
$(".MoveNext").on('click',next);
	function next(){
		num=(++num)%3;
		Index(num);
	}
//点击主页歌单
$(".songMenu li").on('click',function(){
	num=$(this).index();
	Index(num);
})
//点击右侧歌单
$(".page2 li").on('click',function(){
	num=$(this).index();
	Index(num);
})
//重播
$(".playback").on('click',function(){
	audio.currentTime=0;
	audio.play();
})
$(".soundOff").on('click',function(){
	audio.muted ? $(".soundOff").html("") : $(".soundOff").html("");
	audio.muted=!audio.muted;
	
})

function Index(num){
	//开始播放歌曲
	audio.src=musicArr[num];		
	$(".stop").html("");
	audioPlay(musicArr[num],next);
	playingStyle();
}
function playingStyle(){
	// 主页歌单
	$(".Mname").css("color","#fff");
	$(".Msonger").css("color","#bbbab9");
	$(".songMenu li").eq(num).find("span").css("color","#955ebe");
	// 右侧歌单
	$(".Pname").css("color","#fff");
	$(".Psonger").css("color","#bbbab9");
	$("#page2 li").eq(num).find("span").css("color","#955ebe");
	//顶部信息
	$(".name").html($(".Pname").eq(num).html());
	$(".author").html($(".Psonger").eq(num).html());
}

function audioPlay(soundPath,callback){ 
    /*判断声音是否播放完成,播放完成之后执行回调函数*/
    audio.src=soundPath;   
    audio.play();
    if(callback != undefined){
        var  is_playFinish = setInterval(function(){
        if(audio.ended){
                    callback();
                    window.clearInterval(is_playFinish);
       		 }
       		if (!isNaN(audio.duration)) {
            var timeValue = audio.duration; 
            //音乐时间
            var m=parseInt(timeValue/60);
            var s=parseInt(timeValue%60);
            	s<10 ? s="0"+s : s=s;
            $(".startTime").html(m+":"+s);
            //当前播放时间
            var NowtimeValue = audio.currentTime;
            var nowM=parseInt(NowtimeValue/60);
            var nowS=parseInt(NowtimeValue%60);
                nowS<10 ? nowS="0"+nowS : nowS=nowS;
            $(".endTime").html(nowM+":"+nowS);
			// 用时间比来获取进度条的值
            var progressValue =100*(audio.currentTime/audio.duration); //
            $("progress").val(progressValue);
       	 	};
        }, 10);
    }
}
(我吃酸萝卜 新浪微博http://www.weibo.com/wcslb          ---李帅醒著)



猜你喜欢

转载自blog.csdn.net/wcslb/article/details/54586758