JS实现可视化音频效果的实例代码


Posted in Javascript onJanuary 16, 2020

效果如图:

背景图片可以换成自己喜欢的或者不用,线条的颜色粗细也可以自己调整。

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("./8.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="canvas"></canvas>
  <script>
   window.onload = function () {
   canvas.width = window.innerWidth;
   canvas.height = window.innerHeight;
   var canvasCtx = canvas.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();
     analyser.fftSize = 256;
   audioBufferSourceNode.connect(analyser);
   analyser.connect(audioContext.destination);
   audioBufferSourceNode.buffer = buffer;
   audioBufferSourceNode.start();
   var bufferLength = analyser.frequencyBinCount;
   var dataArray = new Uint8Array(bufferLength);

   //播放暂停音频
   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 = canvas.width;
   var oH = canvas.height;
   var color1 = canvasCtx.createLinearGradient(oW / 2, oH / 2-10, oW / 2, oH / 2 - 150);
   var color2 = 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');
   
   color2.addColorStop(0, '#1E90FF');
   color2.addColorStop(.25, '#FFD700');
   color2.addColorStop(.5, '#8A2BE2');
   color2.addColorStop(.75, '#4169E1');
   color2.addColorStop(1, '#FF0000');
   function draw() {
    drawVisual = requestAnimationFrame(draw);
    var barHeight;
       // 自定义获取数组里边数据的频步
       canvasCtx.clearRect(0, 0, oW, oH);
       for (var i = 0; i < bufferLength; i++) {
       barHeight = dataArray[i];
       analyser.getByteFrequencyData(dataArray);
       // 绘制向上的线条
    canvasCtx.fillStyle = color1; 
    /* context.fillRect(x,y,width,height)
     * x,y是坐标
     * width,height线条的宽高
     */
    canvasCtx.fillRect(oW / 2 + (i * 8), oH / 2, 2, -barHeight);
        canvasCtx.fillRect(oW / 2 - (i * 8), oH / 2, 2, -barHeight);
        // 绘制向下的线条
        canvasCtx.fillStyle = color2; 
        canvasCtx.fillRect(oW / 2 + (i * 8), oH / 2, 2, barHeight);
        canvasCtx.fillRect(oW / 2 - (i * 8), oH / 2, 2, barHeight);
       }
   };
   draw();
    })
    }
   })
   }
  </script>
 </body>
</html>

总结

以上所述是小编给大家介绍的JS实现可视化音频效果的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
JS小功能(offsetLeft实现图片滚动效果)实例代码
Nov 28 Javascript
js仿苹果iwatch外观的计时器代码分享
Aug 26 Javascript
轻松实现Bootstrap图片轮播
Apr 20 Javascript
Bootstrap DateTime Picker日历控件简单应用
Mar 25 Javascript
Bootstrap Table使用整理(一)
Jun 09 Javascript
解析Json字符串的三种方法日常常用
May 02 Javascript
vue 使用自定义指令实现表单校验的方法
Aug 28 Javascript
详解如何创建并发布一个 vue 组件
Nov 08 Javascript
vue-router传参用法详解
Jan 19 Javascript
使用 js 简单的实现 bind、call 、aplly代码实例
Sep 07 Javascript
微信小程序 wx:for遍历循环使用实例解析
Sep 09 Javascript
解决vue addRoutes不生效问题
Aug 04 Javascript
js实现div色块碰撞
Jan 16 #Javascript
Vue实现 点击显示再点击隐藏效果(点击页面空白区域也隐藏效果)
Jan 16 #Javascript
vue列表数据发生变化指令没有更新问题及解决方法
Jan 16 #Javascript
使用Karma做vue组件单元测试的实现
Jan 16 #Javascript
js实现div色块拖动录制
Jan 16 #Javascript
微信小程序实现二维码签到考勤系统
Jan 16 #Javascript
解决vue+ element ui 表单验证有值但验证失败问题
Jan 16 #Javascript
You might like
PHP 文件扩展名 获取函数
2009/06/03 PHP
微信公众平台接口开发入门示例
2014/12/24 PHP
PHP Smarty模版简单使用方法
2016/03/30 PHP
Yii使用DeleteAll连表删除出现报错问题的解决方法
2016/07/14 PHP
thinkPHP5框架中widget的功能与用法详解
2018/06/11 PHP
Javascript attachEvent传递参数的办法
2009/12/14 Javascript
编写可维护面向对象的JavaScript代码[翻译]
2011/02/12 Javascript
js获取指定日期前后的日期代码
2013/08/20 Javascript
jQuery DOM操作实例
2014/03/05 Javascript
关于jQuery中的each方法(jQuery到底干了什么)
2014/03/05 Javascript
$.each与$().each的区别示例介绍
2014/03/20 Javascript
jQuery防止click双击多次提交及传递动态函数或多参数
2014/04/02 Javascript
使用原生js写的一个简单slider
2014/04/29 Javascript
JavaScript设计模式之外观模式介绍
2014/12/28 Javascript
jQuery is not defined 错误原因与解决方法小结
2017/03/19 Javascript
JS+DIV实现的卷帘效果示例
2017/03/22 Javascript
jQuery实现的简单前端搜索功能示例
2017/10/28 jQuery
关于react中组件通信的几种方式详解
2017/12/10 Javascript
AngularJS动态添加数据并删除的实例
2018/02/27 Javascript
JavaScript面向对象继承原理与实现方法分析
2018/08/09 Javascript
微信jssdk逻辑在vue中的运用详解
2018/11/14 Javascript
Vue插件从封装到发布的完整步骤记录
2019/02/28 Javascript
[00:09]DOTA2新版本PA至宝特效动作展示
2014/11/19 DOTA
Python实现栈的方法详解【基于数组和单链表两种方法】
2020/02/22 Python
PIP和conda 更换国内安装源的方法步骤
2020/09/21 Python
英国高街电视:High Street TV
2018/05/22 全球购物
什么是唯一索引
2015/07/05 面试题
95%的面试官都会问到的50道Java线程题,附答案
2012/08/03 面试题
会计与审计专业大专生求职信
2013/10/03 职场文书
幼儿园庆六一活动方案
2014/03/06 职场文书
幼儿园家长寄语
2014/04/02 职场文书
社区戒毒工作方案
2014/06/04 职场文书
学校教师安全责任书
2014/07/23 职场文书
纪念九一八事变演讲稿:牢记九一八,屈辱怎能忘
2014/09/14 职场文书
保研导师推荐信
2015/03/25 职场文书
nginx实现动静分离的方法示例
2021/11/07 Servers