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 相关文章推荐
各浏览器对click方法的支持差异小结
Jul 31 Javascript
JavaScript初学者应注意的七个细节小结
Jan 30 Javascript
jquery 实现窗口的最大化不论什么情况
Sep 03 Javascript
JS实现局部选择打印和局部不选择打印
Apr 03 Javascript
node.js中的fs.symlink方法使用说明
Dec 15 Javascript
深入浅析knockout源码分析之订阅
Jul 12 Javascript
JS实现上传图片的三种方法并实现预览图片功能
Jul 14 Javascript
Jquery中.bind()、.live()、.delegate()和.on()之间的区别详解
Aug 01 jQuery
百度地图去掉marker覆盖物或者去掉maker的label文字方法
Jan 26 Javascript
webpack-dev-server自动更新页面方法
Feb 22 Javascript
VUE简单的定时器实时刷新的实现方法
Jan 20 Javascript
vue + typescript + video.js实现 流媒体播放 视频监控功能
Jul 07 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
tp框架(thinkPHP)实现三次登陆密码错误之后锁定账号功能示例
2018/05/24 PHP
ThinkPHP框架整合微信支付之刷卡模式图文详解
2019/04/10 PHP
固定背景实现的背景滚动特效示例分享
2013/05/19 Javascript
js仿百度贴吧验证码特效实例代码
2014/01/16 Javascript
深入理解JavaScript系列(18):面向对象编程之ECMAScript实现
2015/03/05 Javascript
jQuery实现仿百度帖吧头部固定导航效果
2015/08/07 Javascript
深入理解jquery自定义动画animate()
2016/05/24 Javascript
Bootstrap布局方式详解
2016/05/27 Javascript
使用jQuery判断浏览器滚动条位置的方法
2016/05/30 Javascript
JavaScript中setter和getter方法介绍
2016/07/11 Javascript
JS简单去除数组中重复项的方法
2016/09/13 Javascript
QRCode.js:基于JQuery的生成二维码JS库的使用
2017/06/23 jQuery
常用的9个JavaScript图表库详解
2017/12/19 Javascript
浅析node应用的timing-attack安全漏洞
2018/02/28 Javascript
基于vue1和vue2获取dom元素的方法
2018/03/17 Javascript
ES6 中可以提升幸福度的小功能
2018/08/06 Javascript
深入浅析vue-cli@3.0 使用及配置说明
2019/05/08 Javascript
解决layui的input独占一行的问题
2019/09/10 Javascript
微信小程序用户拒绝授权的处理方法详解
2019/09/20 Javascript
js、jquery实现列表模糊搜索功能过程解析
2020/03/27 jQuery
Python命名空间详解
2014/08/18 Python
Python3.6简单操作Mysql数据库
2017/09/12 Python
python监控键盘输入实例代码
2018/02/09 Python
Python Requests模拟登录实现图书馆座位自动预约
2018/04/27 Python
python清除函数占用的内存方法
2018/06/25 Python
Python实现模拟浏览器请求及会话保持操作示例
2018/07/30 Python
Python遍历字典方式就实例详解
2019/12/28 Python
Tensorflow获取张量Tensor的具体维数实例
2020/01/19 Python
Python实现AI换脸功能
2020/04/10 Python
jupyter notebook 的工作空间设置操作
2020/04/20 Python
Unineed旗下时尚轻奢网站:FABHunt
2019/05/13 全球购物
Why do we need Unit test
2013/01/03 面试题
运动会加油稿100字
2014/09/19 职场文书
导游词之无锡梅园
2019/11/28 职场文书
golang 生成对应的数据表struct定义操作
2021/04/28 Golang
解决go在函数退出后子协程的退出问题
2021/04/30 Golang