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中绘制不依 ...
随机推荐
- 对话机器学习大神Yoshua Bengio(下)
对话机器学习大神Yoshua Bengio(下) Yoshua Bengio教授(个人主页)是机器学习大神之一,尤其是在深度学习这个领域.他连同Geoff Hinton老先生以及 Yann LeCun ...
- Swift入门系列--Swift官方文档(2.2)--中文翻译--About Swift 关于Swift
About Swift 关于Swift 官方文档的翻译,仅供参考,本人英语本就不好,边学边翻译,不喜勿喷. Swift is a new programming language for iOS, O ...
- eclipse下切换svn用户
在eclipse中经常用到用svn进行代码版本控制,为了提交或更新代码的时候不反复地提示我们输入用户名和密码,于是我们就习惯把访问SVN的用户名密码自动保存起来.以便下次自动使用,不要再次手工输入,但 ...
- Git 、CVS、SVN比较
Git .CVS.SVN比较 项目源代码的版本管理工具中,比较常用的主要有:CVS.SVN.Git 和 Mercurial (其中,关于SVN,请参见我先前的博客:SVN常用命令 和 SVN服务器配 ...
- 14.6.4 Configuring the Memory Allocator for InnoDB 配置InnoDB 内存分配器
14.6.4 Configuring the Memory Allocator for InnoDB 配置InnoDB 内存分配器 当InnoDB 被开发时,内存分配提供了操作系统和 run-time ...
- PL/SQL拼接和使用绑定变量
begin ..loop executeimmediate'insert into p1 values(' || i || ',' || i ||')'; commit; endloop; end; ...
- 协定类型不具有 ServiceContractAttribute 特性
协定类型 ZBMService.QueryHistoryData 不具有 ServiceContractAttribute 特性.若要定义有效协定,指定的类型(协定接口或服务类)必须具有 Servic ...
- 中国版 Azure 现提供 Azure Traffic Manager
Stephen MaloneAzure网络 - DNS和 Traffic Manager高级项目经理 我们非常高兴地宣布,中国版 Azure中现已提供 Azure Traffic Manager.Az ...
- vijosP1471 教主的游乐场
vijosP1471 教主的游乐场 链接:https://vijos.org/p/1471 [思路] 递推. 首先找到最左边的可以一步跳到后方的L, 那么L之后的点有两种情况:要么a足以跳到后方步数为 ...
- [转]使用Linux命令行测试网速
装speedtest-cli speedtest-cli是一个用Python编写的轻量级Linux命令行工具,在Python2.4至3.4版本下均可运行.它基于Speedtest.net的基础架构来测 ...