用webAudio和canvas实现音频可视化
前两天遇到了要显示音频波形图的需求,因为时间紧,就直接用了wavesufer.js,这两天有空,就研究了一下怎么用webAudio实现音频的可视化。
大致流程是对音源进行解析,解析得到的数据是个频谱数组,然后使用canvas将数组形象化显示出来。
随音乐的播放不断重复上述过程,就能得到一个随着音乐不断跳动的频谱动画,非常酷炫!
废话不多说,下面上代码。
1.准备工作
首先获取各个对象:
var AudioContext = AudioContext || webkitAudioContext;
var audio = document.getElementById("snd");
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
加载音频源有很多种方式,可以用file加载本地音乐,可以用ajax,这里就简单点用audio标签。
2.创建音源和解析器
var atx = new AudioContext();
var source = atx.createMediaElementSource(audio);
var analyser = atx.createAnalyser();
3.连接
连接的顺序为:音源 ==> 解析器 ==> 最终输出
source.connect(analyser);
analyser.connect(atx.destination);
直接连接音源和最终输出(比如扬声器)就可以播放声音,中间连接各种效果节点可以实现音频的各种增益,这里要实现音频可视化,就需要一个解析器。
4.可视化
这里就不得不提到解析器的fftSize属性,它的值必须是从32到32768范围内的2的非零幂; 其默认值为2048。
这个值越大,图形就越详细。
analyser.fftSize = 2048;
function draw(){
var cWidth = canvas.width,
cHeight = canvas.height,
// frequencyBinCount的值固定为fftSize的一半
audioArray = new Uint8Array(analyser.frequencyBinCount);
// 解析频率数据,放入audioArray数组中
analyser.getByteFrequencyData(audioArray);
// 填充为柱状图
ctx.clearRect(0,0,cWidth,cHeight);
for(var i = 0;i < audioArray.length;i ++){
ctx.fillRect(i*3,cHeight-audioArray[i],2,cHeight);
}
// 刷新
requestAnimationFrame(draw);
}
draw();
audio.play();
到这里音频的可视化就完成了,其实挺简单的。
ps:上面2到4步的内容最好放到一个按钮的点击事件里,这是由于谷歌浏览器最新的安全策略。
ps2:音频可视化需要放在http或https服务器上,不用说也是出于浏览器安全性考虑...
最后附上MDN关于音频可视化的一个讲解(比我这个好多啦):
https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API/Visualizations_with_Web_Audio_API
题外话:
写完了感觉有点儿不对劲,我本来是要实现类似wavesufer默认的那种静态效果,结果变成随音乐播放刷新的动态效果,酷炫是酷炫了,可是偏离了本意,有空再补上静态的。
用webAudio和canvas实现音频可视化的更多相关文章
- HTML5音频可视化频谱跳动代码
今天学习到用canvas来写 HTML5音频可视化频谱跳动代码 将代码在此做一总结: <!DOCTYPE html> <html lang="en"> ...
- H5录音音频可视化-实时波形频谱绘制、频率直方图
这段时间给GitHub Recorder开源库添加了两个新的音频可视化功能,比以前单一的动态波形显示丰富了好多(下图后两行是不是比第一行看起来丰满些):趁热打铁写了一个音频可视化相关扩展测试代码,下面 ...
- [C#] NAudio 库的各种常用使用方式: 播放 录制 转码 音频可视化
概述 在 NAudio 中, 常用类型有 WaveIn, WaveOut, WaveStream, WaveFileWriter, WaveFileReader 以及接口: IWaveProvider ...
- [C#] 使用 NAudio 实现音频可视化
预览: 捕捉声卡输出: 实现音频可视化, 第一步就是获得音频采样, 这里我们选择使用计算机正在播放的音频作为采样源进行处理: NAudio 中, 可以借助 WasapiLoopbackCapture ...
- vue解决音频可视化播放,使用wavesurfer.js
vue解决音频可视化播放,使用wavesurfer.js 上效果: 1.安装wavesurfer npm install wavesurfer.js 2.在页面导入 import WaveSur ...
- Web Audio API 实现音频可视化
声明:本文为原创文章,如需转载,请注明来源WAxes,谢谢! 一转眼就已经有三个月没写博客了,毕业季事情确实多,现在也终于完全毕业了,博客还是不能落下.偶尔还是要写一下. 玩HTML5的Audio A ...
- python 音频可视化
代码整理好放在 github 上了: https://github.com/darkchii/visualize bilibili 演示视频:https://www.bilibili.com/vide ...
- FLASH CC 2015 CANVAS 导出音频问题
1,导入音频无法成功发布(软件假死) 解决办法:先用个格式工厂重新压缩 在导入软件 发布 2, 音频 长度小于1秒(左右)的时候,导出后音频会变成 “哧”的一声, 估计和FLASH软件内部的音频编 ...
- Web应用实例:音频可视化
准备 语言:TypeScript 工具:Visual Studio Code 演示:Audio Visualiazer 小明告诉我,他希望打开一个网页,立即听到他喜欢的音乐,如果有视觉特效就更棒了. ...
随机推荐
- VUE中的style 样式处理的Scope (<style scope>)
在VUE组件中,为了让样式私有化,不对全局造成污染,可以在style标签上添加scoped属性以表示它的只属于当下的模块. 但是这样的话,就会导致无法修改其他第三方组件样式,或者是内嵌的样式,解决方案 ...
- 转:国内从事CV相关的企业
http://blog.csdn.net/carson2005/article/details/7356225 经常碰到朋友问我国内从事计算机视觉(CV)领域的公司的发展情况,产品情况,甚至找工作等问 ...
- 软件测试 → 第二章 基础-> 软件缺陷与缺陷管理
一.缺陷定义与分类 1.1.软件缺陷 定义:在软件工程整个生命周期中任何背离需求.无法正确完成用户所要求的功能的问题,包括存在于组件.设备.或系统软件中因异常条件不支持而导致系统失败等都属于缺陷. 从 ...
- C++:static类
static自我理解 static使得数据成员或者函数生命周期为整个文件所在程序的生命周期, 在C中还可以用它避免被其它文件使用为外部成员 static类 明确:类的静态数据成员它被所有类对象共享,但 ...
- python 临时修改模块搜索路径
- 洛谷P3324 [SDOI2015]星际战争
题目:洛谷P3324 [SDOI2015]星际战争 思路: 类似<导弹防御塔>,因为题目保证有解,花费时间小于最终答案时一定无法消灭所有敌人,只要花费时间大于等于最终答案都可以消灭所有敌人 ...
- mysql的执行计划概念说明
explain中的列的说明 1. id列 id列的编号是 select 的序列号,有几个 select 就有几个id,并且id的顺序是按 select 出现的 顺序增长的. id列越大执行优先级越高, ...
- [linux]jenkins迁移 标签: linux服务器 2016-08-28 21:29 988人阅读 评论(20)
我们的测试的jenkins和开发的jenkins 是分开的两个jenkins,然后测试的jenkins很久没有用,我们打算把主节点搬到另外一条服务器上面,然后出了一系列的问题,如下: 一.安装jenk ...
- Libevent:7Bufferevents基本概念
很多时候,应用程序除了能响应事件之外,还希望能够处理一定量的数据缓存.比如,当写数据的时候,一般会经历下列步骤: l 决定向一个链接中写入一些数据:将数据放入缓冲区中: l 等待该链接变得可写: ...
- phpexcel使用说明3
下面是总结的几个使用方法 include 'PHPExcel.php'; include 'PHPExcel/Writer/Excel2007.php'; //或者include 'PHPExcel/ ...