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 相关文章推荐
javascript 动态参数判空操作
Dec 22 Javascript
网页实时显示服务器时间和javscript自运行时钟
Jun 09 Javascript
JS+CSS实现实用的单击输入框弹出选择框的方法
Feb 28 Javascript
JavaScript中的数据类型转换方法小结
Oct 26 Javascript
jQuery动画显示和隐藏效果实例演示(附demo源码下载)
Dec 31 Javascript
微信小程序-小说阅读小程序实例(demo)
Jan 12 Javascript
Vue下滚动到页面底部无限加载数据的示例代码
Apr 22 Javascript
用Node写一条配置环境的指令
Nov 14 Javascript
纯js+css实现仿移动端淘宝网站的弹出详情框功能
Dec 29 Javascript
js实现橱窗展示效果
Jan 11 Javascript
如何使用JS console.log()技巧提高工作效率
Oct 14 Javascript
Vue实现一种简单的无限循环滚动动画的示例
Jan 10 Vue.js
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实现下载功能的代码
2012/09/29 PHP
php随机抽奖实例分析
2015/03/04 PHP
PHP使用gearman进行异步的邮件或短信发送操作详解
2020/02/27 PHP
限制textbox或textarea输入字符长度的JS代码
2013/10/16 Javascript
javascript限制用户只能输汉字中文的方法
2014/11/20 Javascript
node.js操作mongoDB数据库示例分享
2014/11/26 Javascript
jQuery中:hidden选择器用法实例
2014/12/30 Javascript
JavaScript实现将数组中所有元素连接成一个字符串的方法
2015/04/06 Javascript
jQuery查看选中对象HTML代码的方法
2016/06/17 Javascript
javascript中call,apply,bind函数用法示例
2016/12/19 Javascript
移动端点击态处理的三种实现方式
2017/01/12 Javascript
Bootstrap 过渡效果Transition 模态框(Modal)
2017/03/17 Javascript
vue做网页开场视频的实例代码
2017/10/20 Javascript
JavaScript函数绑定用法实例分析
2017/11/14 Javascript
vue+egg+jwt实现登录验证的示例代码
2019/05/18 Javascript
微信小程序图表插件wx-charts用法实例详解
2019/05/20 Javascript
layer ui 导入文件之前传入数据的实例
2019/09/23 Javascript
express异步函数异常捕获示例详解
2020/11/30 Javascript
NodeJS配置CORS实现过程详解
2020/12/02 NodeJs
[02:22:36]《加油!DOTA》总决赛
2014/09/19 DOTA
[34:47]完美世界DOTA2联赛PWL S2 Magma vs LBZS 第一场 11.18
2020/11/18 DOTA
Python实现求两个csv文件交集的方法
2017/09/06 Python
pandas数据框,统计某列数据对应的个数方法
2018/04/11 Python
Python2和Python3之间的str处理方式导致乱码的讲解
2019/01/03 Python
python调用matlab的m自定义函数方法
2019/02/18 Python
html5响应式开发自动计算fontSize的方法
2020/01/13 HTML / CSS
美国全球旅游运营商:Pacific Holidays
2018/06/18 全球购物
7 For All Mankind官网:美国加州洛杉矶的高级牛仔服装品牌
2018/12/20 全球购物
承认错误的检讨书
2014/01/30 职场文书
优秀党员获奖感言
2014/02/18 职场文书
大学军训感言800字
2014/02/27 职场文书
拓展训练激励口号
2014/06/17 职场文书
关于开学的感想
2015/08/10 职场文书
幼儿园大班开学寄语(2016秋季)
2015/12/03 职场文书
SQL Server数据库查询出现阻塞之性能调优
2022/04/10 SQL Server
Spring Boot优化后启动速度快到飞起技巧示例
2022/07/23 Java/Android