js实现环形可视化音频

效果如图:背景图片可以换成自己喜欢的或者不用,环形的颜色线条粗细也可以自己调整。
在这里插入图片描述
代码(可直接复制):

<html lang="en">
 <head>
  <meta charset="UTF-8">
  <title>可视化音频</title>
  <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
  <style>
	body {
		display: block;
		background: url("./9.jpg");
		background-position: center;
		background-repeat: no-repeat;
		background-attachment: fixed;
		background-size:100%;
	}
  </style>
 </head>
 <body>
<input type="file" style="color:red;" name="" value="" id="musicFile"><input type="button" name="startStop" value="暂停" id="startStop">
<p id="tip" style="color:red;"></p>
<canvas id="wrap"></canvas>
<script> 
window.onload = function () {
	wrap.width = window.innerWidth;
	wrap.height = window.innerHeight-120;
	var canvasCtx = wrap.getContext("2d");
	var AudioContext = window.AudioContext || window.webkitAudioContext || window.mozAudioContext;
	var audioContext = new AudioContext();//实例化

	$('#musicFile').change(function(){
		//当选择歌曲时,判断当前audioContext的状态,如果在进行中则关闭音频环境,
		//释放audioContext的所有资源,并重新实例化audioContext
		if(audioContext.state == 'running'){
			audioContext.close();
			audioContext = new AudioContext();
		}

		if (this.files.length == 0) return;
		var file = $('#musicFile')[0].files[0];
		var fileReader = new FileReader();
		fileReader.readAsArrayBuffer(file);
		fileReader.onload = function(e) {
			var count = 0;
			$('#tip').text('开始解码')
			var timer = setInterval(function(){
				count++;
				$('#tip').text('解码中,已用时'+count+'秒')
			},1000)
			audioContext.decodeAudioData(e.target.result, function(buffer) {
				clearInterval(timer)
				$('#tip').text('解码成功,用时共计:'+count+'秒');
				var audioBufferSourceNode = audioContext.createBufferSource();
				var analyser = audioContext.createAnalyser();
				audioBufferSourceNode.connect(analyser);
				analyser.connect(audioContext.destination);
				audioBufferSourceNode.buffer = buffer;
				audioBufferSourceNode.start();
				
				//播放暂停音频
				startStop.onclick = function() {
					if(audioContext.state === 'running') {
							audioContext.suspend().then(function() {
						    $("#startStop").val('播放');
						});
					} else if(audioContext.state === 'suspended') {
							audioContext.resume().then(function() {
							$("#startStop").val('暂停');
						});  
					}
				}
				var oW = wrap.width;
				var oH = wrap.height;
				
				//设置线条的颜色
				var color1 = canvasCtx.createLinearGradient(oW / 2, oH / 2-10, oW / 2, oH / 2 - 150);
				color1.addColorStop(0, '#1E90FF');
				color1.addColorStop(.25, '#FF7F50');
				color1.addColorStop(.5, '#8A2BE2');
				color1.addColorStop(.75, '#4169E1');
				color1.addColorStop(1, '#00FFFF');
				
				var color2=canvasCtx.createLinearGradient(0,0,oW,oH);
				color2.addColorStop(0, '#1E90FF');
				color2.addColorStop(.25, '#FFD700');
				color2.addColorStop(.5, '#8A2BE2');
				color2.addColorStop(.75, '#4169E1');
				color2.addColorStop(1, '#FF0000');
				
				var output = new Uint8Array(180); 
			    var du = 2;	//角度
			    var R = 200;	//半径
			    var W = 2;	//宽(线条的粗细)
			    (function drawSpectrum() {
			        analyser.getByteFrequencyData(output);
			        canvasCtx.clearRect(0, 0, wrap.width, wrap.height);
			        for (var i = 0; i < 360; i++) {
			        	var value = output[i] / 10;
			        	canvasCtx.beginPath();
			        	canvasCtx.lineWidth = W; 
			            Rv1 = (R -value);
			            Rv2 = (R +value);
			            canvasCtx.moveTo(( Math.sin((i * du) / 180 * Math.PI) * Rv1 + oW/2),-Math.cos((i * du) / 180 * Math.PI) * Rv1 + oH/2);
			            canvasCtx.lineTo( ( Math.sin((i * du) / 180 * Math.PI) * Rv2 + oW/2),-Math.cos((i * du) / 180 * Math.PI) * Rv2 + oH/2);
			            canvasCtx.strokeStyle = color1;//线条的颜色
			            canvasCtx.stroke();
			        }
			        
			        //设置字体样式颜色
			        canvasCtx.font = "20px 华文楷体";
					canvasCtx.fillStyle = color2;		// 设置颜色
					canvasCtx.textAlign = "center";		// 设置水平对齐方式
					canvasCtx.textBaseline = "middle";	// 设置垂直对齐方式
					// 绘制文字(参数:要写的字,x坐标,y坐标)
					canvasCtx.fillText(file.name, oW/2, oH/2);
			        requestAnimationFrame(drawSpectrum);
			    })();
			})
		}
	})
}
</script>
 </body>
</html>

以上代码可以直接复制使用,唯一要改的就是把背景图片换成自己的。另外如果觉得这个环形颜色不好看可以自己调整

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

符华-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值