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 相关文章推荐
在IE 浏览器中使用 jquery的fadeIn() 效果 英文字符字体加粗
Jun 02 Javascript
js call方法详细介绍(js 的继承)
Nov 18 Javascript
javascript移出节点removeChild()使用介绍
Apr 03 Javascript
JS实现具备延时功能的滑动门菜单效果
Sep 17 Javascript
js中常用的Tab切换效果(推荐)
Aug 30 Javascript
js实现倒计时及时间对象
Nov 15 Javascript
bootstrap-datetimepicker实现只显示到日期的方法
Nov 25 Javascript
学习使用jQuery表单验证插件和日历插件
Feb 13 Javascript
用jQuery实现圆点图片轮播效果
Mar 19 Javascript
js学习总结之DOM2兼容处理顺序问题的解决方法
Jul 27 Javascript
详解webpack性能优化——DLL
Oct 20 Javascript
webpack实践之DLLPlugin 和 DLLReferencePlugin的使用教程
Jun 10 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入门速成教程
2007/03/19 PHP
php中flush()、ob_flush()、ob_end_flush()的区别介绍
2013/02/17 PHP
PHP实现获取域名的方法小结
2014/11/05 PHP
thinkphp3.2.2前后台公用类架构问题分析
2014/11/25 PHP
php生成不重复随机数、数组的4种方法分享
2015/03/30 PHP
thinkPHP微信分享接口JSSDK用法实例
2017/07/07 PHP
PHP封装的XML简单操作类完整实例
2017/11/13 PHP
解决PHP使用CURL发送GET请求时传递参数的问题
2019/10/11 PHP
JS 显示当前日期与时间的代码
2010/03/24 Javascript
心扬JS分页函数代码
2010/09/10 Javascript
js复制网页内容并兼容各主流浏览器的代码
2013/12/17 Javascript
在JavaScript中使用JSON数据
2016/02/15 Javascript
js 连续赋值的简单实现
2016/06/13 Javascript
Node.js复制文件的方法示例
2016/12/29 Javascript
JS正则匹配中文的方法示例
2017/01/06 Javascript
js 事件的传播机制(实例讲解)
2017/07/20 Javascript
AngularJS实现的自定义过滤器简单示例
2019/02/02 Javascript
JavaScript函数的4种调用方法实例分析
2019/03/05 Javascript
微信小程序获取用户信息的两种方法wx.getUserInfo与open-data实例分析
2019/05/03 Javascript
vue如何使用外部特殊字体的操作
2020/07/30 Javascript
javascript实现时钟动画
2020/12/03 Javascript
python友情链接检查方法
2015/07/08 Python
老生常谈python之鸭子类和多态
2017/06/13 Python
K-近邻算法的python实现代码分享
2017/12/09 Python
Python爬虫小技巧之伪造随机的User-Agent
2018/09/13 Python
python2与python3中关于对NaN类型数据的判断和转换方法
2018/10/30 Python
Python 3.6 -win64环境安装PIL模块的教程
2019/06/20 Python
Python Web程序搭建简单的Web服务器
2019/07/31 Python
获取Pytorch中间某一层权重或者特征的例子
2019/08/17 Python
Python 仅获取响应头, 不获取实体的实例
2019/08/21 Python
详解vscode实现远程linux服务器上Python开发
2020/11/10 Python
浅谈HTML5 &amp; CSS3的新交互特性
2016/07/19 HTML / CSS
工程部经理岗位职责
2013/12/08 职场文书
教师批评与自我批评
2014/10/15 职场文书
驳回起诉民事裁定书
2015/05/19 职场文书
开学典礼观后感
2015/06/15 职场文书