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 相关文章推荐
FileUpload 控件 禁止手动输入或粘贴的实现代码
Apr 07 Javascript
javascript 全等号运算符使用说明
May 31 Javascript
jQuery中delegate与on的用法与区别示例介绍
Dec 20 Javascript
为jquery的ajaxfileupload增加附加参数的方法
Mar 04 Javascript
JS基础随笔(菜鸟必看篇)
Jul 13 Javascript
jquery.Callbacks的实现详解
Nov 30 Javascript
Vue 滚动行为的具体使用方法
Sep 13 Javascript
基于vue-ssr服务端渲染入门详解
Jan 08 Javascript
微信小程序数字滚动插件使用详解
Feb 02 Javascript
Javascript Promise用法详解
May 10 Javascript
vue如何解决循环引用组件报错的问题
Sep 22 Javascript
关于vue3.0中的this.$router.replace({ path: '/'})刷新无效果问题
Jan 16 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
详解:――如何将图片储存在数据库里
2006/12/05 PHP
PHP中比较两个字符串找出第一个不同字符位置例子
2014/04/08 PHP
PHP使用GD库输出汉字的方法【测试可用】
2016/11/10 PHP
php实现的读取CSV文件函数示例
2017/02/07 PHP
爆炸式的JS圆形浮动菜单特效代码
2010/03/03 Javascript
JS图片预加载 JS实现图片预加载应用
2012/12/03 Javascript
js播放wav文件(源码)
2013/04/22 Javascript
javascript 拷贝节点cloneNode()使用介绍
2014/04/03 Javascript
原生js结合html5制作小飞龙的简易跳球
2015/03/30 Javascript
jQuery事件与动画基础详解
2017/02/23 Javascript
js获取json中key所对应的value值的简单方法
2020/06/17 Javascript
jQuery 控制文本框自动缩小字体填充
2017/06/16 jQuery
vue一个页面实现音乐播放器的示例
2018/02/06 Javascript
angular 组件通信的几种实现方式
2018/07/13 Javascript
对angular4子路由&amp;辅助路由详解
2018/10/09 Javascript
详解vue项目中调用百度地图API使用方法
2019/04/25 Javascript
简单了解前端渐进式框架VUE
2020/07/20 Javascript
简单解决Python文件中文编码问题
2015/11/22 Python
Python实现的堆排序算法原理与用法实例分析
2017/11/22 Python
Python读写zip压缩文件的方法
2018/08/29 Python
如何通过python画loss曲线的方法
2019/06/26 Python
python剪切视频与合并视频的实现
2020/03/03 Python
Jupyter Notebook打开任意文件夹操作
2020/04/14 Python
Python基于argparse与ConfigParser库进行入参解析与ini parser
2021/02/02 Python
Sephora丝芙兰印尼官方网站:购买化妆品和护肤品
2018/07/02 全球购物
大学生求职自荐信
2013/12/12 职场文书
中医学专业自荐信范文
2014/04/01 职场文书
学校查摆问题整改措施
2014/09/28 职场文书
大学生就业协议书范本(适用于公司企业)
2014/10/07 职场文书
幼儿教师辞职信范文
2015/03/02 职场文书
公路施工安全责任书
2015/05/08 职场文书
立案决定书范文
2015/06/24 职场文书
2016年社会管理综治宣传月活动总结
2016/03/16 职场文书
技术入股合作协议书
2016/03/21 职场文书
go 原生http web 服务跨域restful api的写法介绍
2021/04/27 Golang
分享CSS盒子模型隐藏的几种方式
2022/02/28 HTML / CSS