随笔 - 434,  文章 - 0,  评论 - 463,  阅读 - 46万

我就不瞎比比了,直接上代码吧:

//获取随机颜色
function randomColor(){
    var r = Math.floor(Math.random()*256);
    var g = Math.floor(Math.random()*256);
    var b = Math.floor(Math.random()*256);
    return "rgb("+r+","+g+","+b+")";//IE7不支出rgb
};

window.onload = function(){

	//给音乐播放器(audio)添加一个timeupdate时间
	document.getElementById("music").ontimeupdate = function(){

	    var currentTime = Math.floor(this.currentTime); //获取当前时间

	   
	    var m = parseInt(currentTime / 60);//分钟
	    var s = parseInt(currentTime % 60);//秒钟
	    var time = (m<10?("0"+m):m)+":"+(s<10?("0"+s):s); //格式化

	    //console.log(time); //打印出来看看

	    // 百分比 = 当前时长 ÷ 总时长 × 100%
		var total = this.duration;//总时长
		//console.log(currentTime + '=======' + total);
		//console.log( Math.floor(currentTime / total * 100) + "%" );


		document.getElementsByClassName("progress")[0].style.width = Math.floor(currentTime / total * 100) + "%" ;

	}

	//音轨制作

	var box = document.getElementsByClassName('mbox')[0];  //获取承载音轨的父盒子

	var allWidth = box.clientWidth;//获取承载音轨盒子的宽度

	var itemWidth = 5;


	var len = (allWidth / itemWidth );     //计算一共出现多少条音轨 

	var html = '';                  //动态拼接音轨

	for(var i = 0;i < len ; i ++){
	    html+="<span class='item' style='left:"+(i * itemWidth)+"px;background:"+randomColor()+";'></span>";
	}

	box.innerHTML += html;           //添加音轨

	var audio = document.getElementById("music");

	//1:音频上下文
	window.AudioContext = window.AudioContext || window.webkitAudioContext || window.mozAudioContext || window.msAudioContext;
	/*动画执行的兼容写法*/
	window.requestAnimationFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.msRequestAnimationFrame;


	//2:初始化音轨对象
	var audioContext = new window.AudioContext();

	var flag = null; //控制是否解析的开关变量

	//拿到播放器去解析音乐文件
	var audioBufferSouceNode = audioContext.createMediaElementSource(audio);

	audio.onplay = function(){
	    flag = true;
	    //创建解析对象
	    var analyser = audioContext.createAnalyser();
	    parse(analyser,function(array){
	        console.log(array); //打印解析出来的音轨节点
	        for(var i = 0;i < len ; i ++){
	            document.getElementsByClassName('item')[i].style.height = array[i] + 'px';
	        }
	    });
	}

	audio.onpause = function(){
	    for(var i = 0;i < len ; i ++){
	        document.getElementsByClassName('item')[i].style.height = 1 + 'px';
	    }
	    flag = false;
	}


	function parse(analyser,callback){
	    if(!flag){
	        return;
	    }
	    audioBufferSouceNode.connect(analyser); 
	    analyser.connect(audioContext.destination);
	    var array = new Uint8Array(analyser.frequencyBinCount);
	    analyser.getByteFrequencyData(array);
	    if(callback) callback(array);
	    requestAnimationFrame(function(){
	        parse(analyser,callback);
	    });
	}

}

css:

.item {
    position:absolute;
    width:5px;
    height:1px;
    left:0px;
    bottom:0px;
    opacity: 0.5;
}

效果:

##总结思路

#####1.获取mbox的宽度,然后动态计算一共有多少条音轨。
#####2.用H5的音频解析器去解析当前音乐播放的各频率的音高
#####3.用这些音高去给每一条音轨动态地设置高度height

posted on   剽悍一小兔  阅读(13)  评论(0编辑  收藏  举报  
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示