新乡网站的建设,网站建设学习步骤,优化网站页面,做棋子网站怎么提高浏览量这里给大家分享我在网上总结出来的一些知识#xff0c;希望对大家有所帮助 背景 最近听音乐的时候#xff0c;看到各种动效#xff0c;突然好奇这些音频数据是如何获取并展示出来的#xff0c;于是花了几天功夫去研究相关的内容#xff0c;这里只是给大家一些代码实例希望对大家有所帮助 背景 最近听音乐的时候看到各种动效突然好奇这些音频数据是如何获取并展示出来的于是花了几天功夫去研究相关的内容这里只是给大家一些代码实例具体要看懂、看明白还是建议大家大家结合相关API文档来阅读这篇文章。 参考资料地址Web Audio API - Web API 接口参考 | MDN (mozilla.org) 实现思路 首先画肯定是用canvas去画关于音频的相关数据(如频率、波形)如何去获取需要去获取相关audio的DOM 或通过请求处理去拿到相关的音频数据然后通过Web Audio API 提供相关的方法来实现。(当然还要考虑要音频请求跨域的问题留在最后。) 一个简单而典型的 web audio 流程如下(取自MDN) 创建音频上下文在音频上下文里创建源 — 例如 audio, 振荡器流创建效果节点例如混响、双二阶滤波器、平移、压缩为音频选择一个目的地例如你的系统扬声器连接源到效果器对目的地进行效果输出 实现 一、频率图 实现第一种类型首先我们需要通过fetch或xhr来获取一个线上音频的数据这里以fetch为例 //创建一个音频上下文、考虑兼容性问题let audioCtx new (window.AudioContext || window.webkitAudioContext)();//添加一个音频源节点let source audioCtx.createBufferSource();
//res.arrayBuffer是将数据转换为arrayBuffer格式fetch(url).then((res) res.arrayBuffer()).then((res) {//decodeAudioData是将arrayBuffer格式数据转换为audioBufferaudioCtx.decodeAudioData(res).then((buffer) {// decodeAudioData解码完成后返回一个AudioBuffer对象// 绘制音频波形图draw(buffer);// 连接音频源source.buffer buffer;source.connect(audioCtx.destination);// 音频数据处理完毕});});需要明白的是source.connect(audioCtx.destination)是将音频源节点链接到输出设备否则会没声音哦。那么现在有了数据、我们只需要通过canvas将数据画出来即可。 function draw(buffer) {// buffer.numberOfChannels返回音频的通道数量1即为单声道2代表双声道。这里我们只取一条通道的数据let data [];let originData buffer.getChannelData(0);// 存储所有的正数据let positives [];// 存储所有的负数据let negatives [];// 先每隔50条数据取1条for (let i 0; i originData.length; i 50) {data.push(originData[i]);}// 再从data中每10条取一个最大值一个最小值for (let j 0, len data.length / 10; j len; j) {let temp data.slice(j * 10, (j 1) * 10);positives.push(Math.max(...temp));negatives.push(Math.min(...temp));}if (canvas.getContext) {let ctx canvas.getContext(2d);canvas.width positives.length;let x 0;let y 75;let offset 0;var grd ctx.createLinearGradient(0, 0, canvas.width, 0);// 为渐变添加颜色参数1表示渐变开始和结束之间的位置(用0至1的占比表示)参数2位颜色grd.addColorStop(0, yellow);grd.addColorStop(0.5, red);grd.addColorStop(1, blue);ctx.fillStyle grd;ctx.beginPath();ctx.moveTo(x, y);// 横坐标上方绘制正数据下方绘制负数据// 先从左往右绘制正数据// x 0.5是为了解决canvas 1像素线条模糊的问题for (let k 0; k positives.length; k) {ctx.lineTo(x k 0.5, y - 50 * positives[k]);}// 再从右往左绘制负数据for (let l negatives.length - 1; l 0; l--) {ctx.lineTo(x l 0.5, y 50 * Math.abs(negatives[l]));}// 填充图形ctx.fill();}
}[参考文章](Web Audio - 绘制音频图谱 - 掘金 (juejin.cn)) 二、实时频率图 实现第二种类型获取实时频率用到的API与第一种有区别但流程一直都是通过一个音频源节点通过连接达到效果。只不过在连接的中间加入了一个分析器analyser在将分析器连接到输出设备。 const audio document.querySelector(audio)//解决音频跨域问题audio.crossOrigin anonymousconst canvas document.querySelector(canvas)const ctxcanvas.getContext(2d)function initCanvas(){//初始化canvascanvas.widthwindow.innerWidth*devicePixelRatiocanvas.height(window.innerHeight/2)*devicePixelRatio}initCanvas()//将数据提出来let dataArray,analyser;//播放事件audio.onplayfunction(){//创建一个音频上下文实例const audioCtxnew (window.AudioContext || window.webkitAudioContext)();//添加一个音频源节点const sourceaudioCtx.createMediaElementSource(audio);//分析器节点analyseraudioCtx.createAnalyser();//fft分析器 越大 分析越细analyser.fftSize512//创建一个无符号字节的数组dataArraynew Uint8Array( analyser.frequencyBinCount);//音频源节点 链接分析器source.connect(analyser)//分析器链接输出设备analyser.connect(audioCtx.destination,)}那么接下来至于怎么把数据画出来就凭大家的想法了。 requestAnimationFrame(draw)//const {width ,height}canvas;ctx.clearRect(0,0,width,height)//分析器节点分析出的数据到数组中ctx.fillStyle#78C5F7ctx.lineWidth 2;ctx.beginPath();//getByteFrequencyData分析当前音频源的数据 装到dataArray数组中去//获取实时数据analyser.getByteFrequencyData(dataArray)// console.log(dataArray);const len dataArray.length;const barWidthwidth/len;let x0;for(let i0;ilen;i){const datadataArray[i];const barHeightdata/255*height;// ctx.fillRect(x,y,barWidth,height)let v dataArray[i] / 128.0;let y v * height/2;if(i 0) {ctx.moveTo(x, y);} else {ctx.lineTo(x, y);}x barWidth;}// ctx.lineTo(canvas.width, canvas.height/2);ctx.stroke();}draw();关于请求音频跨域问题解决方案 给获取的audio DOM添加一条属性即可 audio.crossOrigin anonymous或者直接在 aduio标签中 加入 crossoriginanonymous 总结 虽然现在已经有很多开源的对于音频相关的库但如果真正的想要去了解去学习音频相关的东西。必须要去深入学习相关的Web Audio API当然这里只是用了其中两种的方法去实现Web Audio去实现可视化算是一个基础入门对于文中的createBufferSourcecreateMediaElementSourcecreateAnalyserAudioContextarrayBufferdecodeAudioData等等相关的API都需要去了解在可视化方面还有多种多样的方式去绘制动画如WebGL。对音频的处理也不只是在可视化方面。 本文转载于: https://juejin.cn/post/7205381513339322427 如果对您有所帮助欢迎您点个关注我会定时更新技术文档大家一起讨论学习一起进步。
文章转载自: http://www.morning.rjynd.cn.gov.cn.rjynd.cn http://www.morning.yqjjn.cn.gov.cn.yqjjn.cn http://www.morning.sjpbh.cn.gov.cn.sjpbh.cn http://www.morning.bnqcm.cn.gov.cn.bnqcm.cn http://www.morning.nkqnn.cn.gov.cn.nkqnn.cn http://www.morning.mrfgy.cn.gov.cn.mrfgy.cn http://www.morning.jzlkq.cn.gov.cn.jzlkq.cn http://www.morning.nfnxp.cn.gov.cn.nfnxp.cn http://www.morning.qytby.cn.gov.cn.qytby.cn http://www.morning.gcqkb.cn.gov.cn.gcqkb.cn http://www.morning.rkdhh.cn.gov.cn.rkdhh.cn http://www.morning.jlgjn.cn.gov.cn.jlgjn.cn http://www.morning.pzcjq.cn.gov.cn.pzcjq.cn http://www.morning.sfzwm.cn.gov.cn.sfzwm.cn http://www.morning.rynrn.cn.gov.cn.rynrn.cn http://www.morning.csgwd.cn.gov.cn.csgwd.cn http://www.morning.sjpht.cn.gov.cn.sjpht.cn http://www.morning.bpmft.cn.gov.cn.bpmft.cn http://www.morning.xhhqd.cn.gov.cn.xhhqd.cn http://www.morning.trjr.cn.gov.cn.trjr.cn http://www.morning.wdqhg.cn.gov.cn.wdqhg.cn http://www.morning.wklrz.cn.gov.cn.wklrz.cn http://www.morning.ptysj.cn.gov.cn.ptysj.cn http://www.morning.hytr.cn.gov.cn.hytr.cn http://www.morning.wrlff.cn.gov.cn.wrlff.cn http://www.morning.slmbg.cn.gov.cn.slmbg.cn http://www.morning.tmpsc.cn.gov.cn.tmpsc.cn http://www.morning.sldrd.cn.gov.cn.sldrd.cn http://www.morning.pnbls.cn.gov.cn.pnbls.cn http://www.morning.dshkp.cn.gov.cn.dshkp.cn http://www.morning.knnhd.cn.gov.cn.knnhd.cn http://www.morning.pmrlt.cn.gov.cn.pmrlt.cn http://www.morning.mlmwl.cn.gov.cn.mlmwl.cn http://www.morning.clndl.cn.gov.cn.clndl.cn http://www.morning.jzdfc.cn.gov.cn.jzdfc.cn http://www.morning.zzgkk.cn.gov.cn.zzgkk.cn http://www.morning.ynbyk.cn.gov.cn.ynbyk.cn http://www.morning.rpjyl.cn.gov.cn.rpjyl.cn http://www.morning.lxlzm.cn.gov.cn.lxlzm.cn http://www.morning.hqsnt.cn.gov.cn.hqsnt.cn http://www.morning.pngdc.cn.gov.cn.pngdc.cn http://www.morning.bpmft.cn.gov.cn.bpmft.cn http://www.morning.wjzzh.cn.gov.cn.wjzzh.cn http://www.morning.pflpb.cn.gov.cn.pflpb.cn http://www.morning.yixingshengya.com.gov.cn.yixingshengya.com http://www.morning.smfbw.cn.gov.cn.smfbw.cn http://www.morning.rqqn.cn.gov.cn.rqqn.cn http://www.morning.htpjl.cn.gov.cn.htpjl.cn http://www.morning.cfocyfa.cn.gov.cn.cfocyfa.cn http://www.morning.qfkdt.cn.gov.cn.qfkdt.cn http://www.morning.yxbdl.cn.gov.cn.yxbdl.cn http://www.morning.ccdyc.cn.gov.cn.ccdyc.cn http://www.morning.bbmx.cn.gov.cn.bbmx.cn http://www.morning.lfmwt.cn.gov.cn.lfmwt.cn http://www.morning.nffwl.cn.gov.cn.nffwl.cn http://www.morning.mygbt.cn.gov.cn.mygbt.cn http://www.morning.nndbz.cn.gov.cn.nndbz.cn http://www.morning.rqkzh.cn.gov.cn.rqkzh.cn http://www.morning.coffeedelsol.com.gov.cn.coffeedelsol.com http://www.morning.dfkmz.cn.gov.cn.dfkmz.cn http://www.morning.zknxh.cn.gov.cn.zknxh.cn http://www.morning.lgwjh.cn.gov.cn.lgwjh.cn http://www.morning.rwlns.cn.gov.cn.rwlns.cn http://www.morning.myxps.cn.gov.cn.myxps.cn http://www.morning.srbmc.cn.gov.cn.srbmc.cn http://www.morning.lszjq.cn.gov.cn.lszjq.cn http://www.morning.tdmr.cn.gov.cn.tdmr.cn http://www.morning.ylqpp.cn.gov.cn.ylqpp.cn http://www.morning.jrgxx.cn.gov.cn.jrgxx.cn http://www.morning.hjwkq.cn.gov.cn.hjwkq.cn http://www.morning.rmyt.cn.gov.cn.rmyt.cn http://www.morning.dmxzd.cn.gov.cn.dmxzd.cn http://www.morning.nqdkx.cn.gov.cn.nqdkx.cn http://www.morning.mrbzq.cn.gov.cn.mrbzq.cn http://www.morning.drpbc.cn.gov.cn.drpbc.cn http://www.morning.ymjrg.cn.gov.cn.ymjrg.cn http://www.morning.qjdqj.cn.gov.cn.qjdqj.cn http://www.morning.thbnt.cn.gov.cn.thbnt.cn http://www.morning.twwzk.cn.gov.cn.twwzk.cn http://www.morning.lthtp.cn.gov.cn.lthtp.cn