HTML5 WebAudioAPI(三)--绘制频谱图
HTML
<style>
#canvas {
background: black;
}
</style>
<div class="container">
<button class="btn btn-primary" id="playBtn">
<i class="glyphicon glyphicon-pause"></i>
</button>
</div>
<canvas id="canvas" width="800" height="300"></canvas>
实例1,绘制频谱图:
var url='../content/audio/海阔天空.mp3';
if (!window.AudioContext) {
alert('您的浏览器不支持AudioContext');
} else {
//创建上下文
var ctx = new AudioContext();
var source = null;
//使用Ajax获取音频文件 var request = new XMLHttpRequest();
request.open('GET', url, true);
request.responseType = 'arraybuffer';//配置数据的返回类型
//加载完成
request.onload = function () {
var arraybuffer = request.response;
ctx.decodeAudioData(arraybuffer, function (buffer) {
//创建分析器
var analyser = ctx.createAnalyser();
source = ctx.createBufferSource();
//将source与分析器链接
source.connect(analyser);
//将分析器与destination链接,这样才能形成到达扬声器的通路
analyser.connect(ctx.destination);
//将解码后的buffer数据复制给source
source.buffer = buffer;
//播放
source.start(0); //开始绘制频谱图
function drawSpectrum() {
var canvas = document.getElementById('canvas'),
cwidth = canvas.width,
cheight = canvas.height - 2,
meterWidth = 10,//能量条的宽度
gap = 2,//能量条的间距
meterNum = 800 / (10 + 2),//计算当前画布上能画多少条
ctx = canvas.getContext('2d');
var capHeight = 2;//
var array = new Uint8Array(analyser.frequencyBinCount);
analyser.getByteFrequencyData(array);
console.info(array.length);
var step = Math.round(array.length / meterNum);//计算从analyser中的采样步长 //清理画布
ctx.clearRect(0, 0, cwidth, cheight);
//定义一个渐变样式用于画图
var gradient = ctx.createLinearGradient(0, 0, 0, 300);
gradient.addColorStop(1, '#0f0');
gradient.addColorStop(0.5, '#ff0');
gradient.addColorStop(0, '#f00');
ctx.fillStyle = gradient;
//对信源数组进行抽样遍历,画出每个频谱条
for (var i = 0; i < meterNum; i++) {
var value = array[i * step];
ctx.fillRect(i * 12/*频谱条的宽度+条间距*/, cheight - value + capHeight,
meterWidth, cheight);
}
requestAnimationFrame(drawSpectrum)
}
requestAnimationFrame(drawSpectrum)
}, function (e) {
console.info('处理出错');
});
}
request.send(); //绑定播放按钮
$('#playBtn').click(function () {
var icon = $(this).find('i');;
icon.toggleClass('glyphicon-play').toggleClass('glyphicon-pause');
//停止播放
source.stop();
});
}

实例2,绘制缓慢下落的帽头
var url='../content/audio/海阔天空.mp3';
if (!window.AudioContext) {
alert('您的浏览器不支持AudioContext');
} else {
//创建上下文
var atx = new AudioContext();
var source = null;
//使用Ajax获取音频文件
var request = new XMLHttpRequest();
request.open('GET', url, true);
request.responseType = 'arraybuffer';//配置数据的返回类型
//加载完成
request.onload = function () {
var arraybuffer = request.response;
atx.decodeAudioData(arraybuffer, function (buffer) {
//创建分析器
var analyser = atx.createAnalyser();
source = atx.createBufferSource();
//将source与分析器链接
source.connect(analyser);
//将分析器与destination链接,这样才能形成到达扬声器的通路
analyser.connect(atx.destination);
//将解码后的buffer数据复制给source
source.buffer = buffer;
//播放
source.start(0); //开始绘制频谱图
var canvas = document.getElementById('canvas'),
cwidth = canvas.width,
cheight = canvas.height - 2,
meterWidth = 10,//能量条的宽度
gap = 2,//能量条的间距
meterNum = 800 / (10 + 2);//计算当前画布上能画多少条
var ctx = canvas.getContext('2d');
var capHeight = 2,//冒头的高度
capStyle = '#fff',//冒头的颜色
capYPositionArray = [];//将上一面各个冒头的位置保存到这个数组
//定义一个渐变样式用于画图
var gradient = ctx.createLinearGradient(0, 0, 0, 300);
gradient.addColorStop(1, '#0f0');
gradient.addColorStop(0.5, '#ff0');
gradient.addColorStop(0, '#f00');
//绘制频谱图
function drawSpectrum() {
var array = new Uint8Array(analyser.frequencyBinCount);
analyser.getByteFrequencyData(array);
var step = Math.round(array.length / meterNum);//计算从analyser中的采样步长
//清理画布
ctx.clearRect(0, 0, cwidth, cheight);
//对信源数组进行抽样遍历,画出每个频谱条
for (var i = 0; i < meterNum; i++) {
var value = array[i * step]; //取样作为y轴的值
//绘制缓慢降落的冒头
if (capYPositionArray.length < Math.round(meterNum)) {
capYPositionArray.push(value);//初始化保存冒头位置的数组,将第一个画面位置保存
}
ctx.fillStyle = capStyle;
//1.开始绘制冒头
if (value < capYPositionArray[i]) {
//使用前一次数据
ctx.fillRect(i * 12, cheight - (--capYPositionArray[i]), meterWidth, capHeight);
} else {
//否则,直接使用当前数据并记录
ctx.fillRect(i * 12, cheight - value, meterWidth, capHeight);
capYPositionArray[i] = value;
}
//2.开始绘制频谱条
ctx.fillStyle = gradient;
ctx.fillRect(i * 12/*频谱条的宽度+条间距*/, cheight - value + capHeight,
meterWidth, cheight);
}
requestAnimationFrame(drawSpectrum);
}
requestAnimationFrame(drawSpectrum);
}, function (e) {
console.info('处理出错');
}); }
request.send();
//绑定播放按钮
$('#playBtn').click(function () {
var icon = $(this).find('i');;
icon.toggleClass('glyphicon-play').toggleClass('glyphicon-pause');
//停止播放
source.stop();
});
}

内容来源:http://www.cnblogs.com/Wayou/p/3543577.html
更多参考:
HTML5 WebAudioAPI(三)--绘制频谱图的更多相关文章
- HTML5 WebAudioAPI(四)--绘制频谱图2
绘制分析器数组所有数据.本文内容,承接上文 1.800宽度绘制 var url='../content/audio/海阔天空.mp3'; if (!window.AudioContext) { ale ...
- HTML5 随音乐节奏变化的频谱图动画
这里将要介绍的HTML5 音频处理接口与Audio标签是不一样的.页面上的Audio标签只是HTML5更语义化的一个表现,而HTML5提供给JavaScript编程用的Audio API则让我们有能力 ...
- html5绘制折线图
html5绘制折线图详细代码 <html> <canvas id="a_canvas" width="1000" height="7 ...
- 用Html5制作的一款数学教学程序Function Graphics(绘制函数图的程序)
最近我不仅对游戏开发感兴趣,还对函数图感兴趣,特此我开发了这个程序.以下是一些介绍和下载演示地址,喜欢的朋友可以看看: 一,产品名片 产品名:Function Graphics 版本: 0.1 开发者 ...
- php中用GD绘制折线图
php中用GD绘制折线图,代码如下: Class Chart{ private $image; // 定义图像 private $title; // 定义标题 private $ydata; // 定 ...
- Excel应该这么玩——7、我是预言家:绘制趋势图
让我们先看一个场景:你是公司销售部的员工,你手里有公司最近几年的销售额相关的数据,经理希望你预测下个月的销售额.盯着一堆数据,你或许会想到画一张XY坐标图,然后将每个月份的销售额标定为一个坐标.但是下 ...
- 【python】pandas & matplotlib 数据处理 绘制曲面图
Python matplotlib模块,是扩展的MATLAB的一个绘图工具库,它可以绘制各种图形 建议安装 Anaconda后使用 ,集成了很多第三库,基本满足大家的需求,下载地址,对应选择pytho ...
- UUChart的使用--iOS绘制折线图
UUChart是一个用于绘制图表的第三方,尤其适合去绘制折线图. 二.下载地址: https://github.com/ZhipingYang/UUChartView 三.使用 第一步.首先我们将下载 ...
- 【译】在Asp.Net中操作PDF - iTextSharp - 绘制矢量图
原文 [译]在Asp.Net中操作PDF - iTextSharp - 绘制矢量图 在上一篇iTextSharp文章中讲述了如何将现有的图片插入PDF中并对其进行操作.但有时,你需要在PDF中绘制不依 ...
随机推荐
- [BZOJ 3680] 吊打XXX 【模拟退火】
题目链接:BZOJ - 3680 题目分析 这道题是SLYZ的神犇把JSOI的平衡点那道题改了一下题面变成了吊打GTY神犇..Orz 第一次写模拟退火,只能照着别人的代码写,我看的是PoPoQQQ神犇 ...
- Reason: image not found 错误解决方法
dyld: Library not loaded: /System/Library/Frameworks/Social.framework/Social Referenced from: /var ...
- 调优UWSGI,后台启动,热更改PY,杜绝502
记得加启动参数: --daemonize /var/log/uwsgi.log --post-buffering 32768 --buffer-size 32768 reload.set #!/bin ...
- 树莓派学习路程No.1 GPIO功能初识 wiringPi安装
WiringPi是应用于树莓派平台的GPIO控制库函数,WiringPi遵守GUN Lv3.wiringPi使用C或者C++开发并且可以被其他语言包转,例如python.ruby或者PHP等.Wiri ...
- haskell模块(modules)
装载模块 Haskell 中的模块是含有一组相关的函数,类型和类型类的组合.而 Haskell 进程的本质便是从主模块中引用其它模块并调用其中的函数来执行操作.这样可以把代码分成多块,只要一个模块足够 ...
- Git超级菜鸟学习--> 社区化协作以及分支操作
1 先将主库的url添加到本地上面, git remote add <RepoName> <URL> 2 获取主库的修改记录 git fetch --获取服务器上的修改 git ...
- 数据结构(分块):[HZOI 2015]easy seq
[题目描述] 给定一个序列,下标从0开始,分别为a0,a1,a2...an−1,有m个询问,每次给出l和r,求满足ai=aj且l<=i<=j<=r时j−i的最大值 本题强制在线,l和 ...
- 前端程序员:月薪 5K 到 5 万,我干了啥
高贵的前端程序猿们: 如何在前端开发这种高精尖的技术领域找到心仪的工作?实现在咖啡馆喝喝咖啡敲敲代码就能升职加薪.买房买车.迎娶白富美走上人生巅峰的职业梦想?这篇<进化论:从 0 到 100,前 ...
- 重读JAVA编程思想
当年如猪八戒吃人生果般的读了java编程思想,只是知道这是本好书,但是具体细节,真是不知所云,很多都是工作中用到哪些,然后就翻<think in java >和<core java& ...
- HDOJ/HDU 1133 Buy the Ticket(数论~卡特兰数~大数~)
Problem Description The "Harry Potter and the Goblet of Fire" will be on show in the next ...