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 判断Flash是否加载完成的代码
Apr 12 Javascript
jquery slibings选取同级其他元素的实现代码
Nov 15 Javascript
对new functionName()定义一个函数的理解
May 22 Javascript
基于javascript实现表格的简单操作
May 21 Javascript
AngularJS开发教程之控制器之间的通信方法分析
Dec 25 Javascript
基于JS实现二维码图片固定在右下角某处并跟随滚动条滚动
Feb 08 Javascript
关于Node.js中Buffer的一些你可能不知道的用法
Mar 28 Javascript
ReactJS实现表单的单选多选和反选的示例
Oct 13 Javascript
基于Vue 2.0 监听文本框内容变化及ref的使用说明介绍
Aug 24 Javascript
使用Angular Cli如何创建Angular私有库详解
Jan 30 Javascript
vue中的面包屑导航组件实例代码
Jul 01 Javascript
原生JS无缝滑动轮播图
Oct 22 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
声音就能俘获人心,蕾姆,是哪个漂亮小姐姐配音呢?
2020/03/03 日漫
不用数据库的多用户文件自由上传投票系统(2)
2006/10/09 PHP
smarty内置函数capture用法分析
2015/01/22 PHP
如何用js控制css中的float的代码
2007/08/16 Javascript
js 火狐下取本地路径实现思路
2013/04/02 Javascript
javascript处理表单示例(javascript提交表单)
2014/04/28 Javascript
AngularJS自定义服务与fliter的混合使用
2016/11/24 Javascript
JS前端笔试题分析
2016/12/19 Javascript
angularjs+bootstrap菜单的使用示例代码
2017/03/07 Javascript
javascript过滤数组重复元素的实现方法
2017/05/03 Javascript
js求数组中全部数字可拼接出的最大整数示例代码
2017/08/25 Javascript
JS排序算法之冒泡排序,选择排序与插入排序实例分析
2017/12/13 Javascript
vue 微信授权登录解决方案
2018/04/10 Javascript
Vue-component全局注册实例
2018/09/06 Javascript
Angular6 Filter实现页面搜索的示例代码
2018/12/02 Javascript
JavaScript中构造函数与原型链之间的关系详解
2019/02/25 Javascript
移动端底部导航固定配合vue-router实现组件切换功能
2019/06/13 Javascript
[52:00]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 LGD vs Optic
2018/04/02 DOTA
python的构建工具setup.py的方法使用示例
2017/10/23 Python
Python+tkinter使用80行代码实现一个计算器实例
2018/01/16 Python
python指定写入文件时的编码格式方法
2018/06/07 Python
Python数据可视化实现正态分布(高斯分布)
2019/08/21 Python
python可视化实现KNN算法
2019/10/16 Python
使用Bazel编译TensorBoard教程
2020/02/15 Python
python根据完整路径获得盘名/路径名/文件名/文件扩展名的方法
2020/04/22 Python
html5实现多图片预览上传及点击可拖拽控件
2018/03/15 HTML / CSS
Amaze UI 文件选择域的示例代码
2020/08/26 HTML / CSS
药剂学专业应届生自荐信
2013/09/29 职场文书
护士毕业生自荐信
2014/02/07 职场文书
商务经理岗位职责
2014/07/30 职场文书
印刷技术专业自荐信
2014/09/18 职场文书
卡特教练观后感
2015/06/08 职场文书
郭明义电影观后感
2015/06/08 职场文书
运动会闭幕式通讯稿
2015/07/18 职场文书
2015年机关作风和效能建设工作总结
2015/07/23 职场文书
详解Python生成器和基于生成器的协程
2021/06/03 Python