HTML5 WebAudioAPI(三)--绘制频谱图
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了HTML5 WebAudioAPI(三)--绘制频谱图,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4755字,纯文字阅读大概需要7分钟。
内容图文
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
更多参考:
原文:http://www.cnblogs.com/tianma3798/p/6033643.html
内容总结
以上是互联网集市为您收集整理的HTML5 WebAudioAPI(三)--绘制频谱图全部内容,希望文章能够帮你解决HTML5 WebAudioAPI(三)--绘制频谱图所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。