首页 文章 精选 留言 我的

精选列表

搜索[MSA技术],共10000篇文章
优秀的个人博客,低调大师

AudioContext技术和音乐可视化(1)

写在最前,测试博客在这里,直接欣赏完成可视化效果。代码不日在github公开,性能目前巨烂,RadialGradient损耗巨大,优化正在提上日程。 转载注明来源。 扒掉网页上js的烦请留下js里的顶端注释谢谢。。虽然我代码是写的挺烂的。如果转发到别的地方了能注明一下作者和来源的话我会很开心的。 https://th-zxj.club 这是你从未体验过的船新版本 Intro 因为自己搭了个博客,一时兴起,就想写个动态的博客背景。毕竟用django后端渲染,前端只有jquery和bootstrap已经够low了,虽说极简风格也很棒,但是多少有点亮眼的东西才好和别人吹牛不是吗。 为了方便讲解,整个思路分为两个部分:音乐播放和背景绘制。 一、音乐播放 1.1 AudioContext 概述部分懒得自己写,参考MDN的描述。 AudioContext接口表示由音频模块连接而成的音频处理图,每个模块对应一个AudioNode。AudioContext可以控制它所包含的节点的创建,以及音频处理、解码操作的执行。做任何事情之前都要先创建AudioContext对象,因为一切都发生在这个环境之中。 1.2 浏览器支持状况 AudioContext标准目前还是草案,不过新chrome已经实现了。我使用的chrome版本如下。 版本 70.0.3538.77(正式版本) (64 位) 如果发现console报错或者其他问题请检查浏览器版本,所有支持的浏览器可以在这个链接查看。 1.3 AudioContext和音频处理图 关于AudioContext我的了解不是很深入,所以只在需要用到的部分进行概述。 首先,关于音频处理图的概念。 这个名词不甚直观,我用过虚幻,所以用虚幻的Blueprint来类比理解。音频处理图,其实是一系列音频处理的模块,连接构成一张数据结构中的“图”,从一般使用的角度来讲,一个播放音频的图,就是AudioSource -> AudioContext.destination,两个节点构成的图。其中有很多特殊的节点可以对音频进行处理,比如音频增益节点GainNode。 对于音频处理的部分介绍就到这里为止,毕竟真的了解不多,不过从MDN的文档看,可用的处理节点还是非常多的,就等标准制订完成了。 1.4 加载音频文件并播放 音频文件加载使用典型的JavaScript接口FileReader实现。 一个非常简单的实例是这样 首先是html里写上input <html> <body> <input type="file" accept="audio/*" onchange="onInputChange"> </body> </html> 然后在javascript里读文件内容。 function onInputChange(files){ const reader = new FileReader(); reader.onload = (event) => { // event.target.result 就是我们的文件内容了 } reader.readAsArrayBuffer(files[0]) } 文件读取就是这么简单,所以回到那个问题:说了那么多,音乐到底怎么放? 答案是用AudioContext的decodeAudioData方法。 所以从上面的js里做少许修改—— // 创建一个新的 AudioContext const ctx = new AudioContext(); function onInputChange(files){ const reader = new FileReader(); reader.onload = (event) => { // event.target.result 就是我们的文件内容了 // 解码它 ctx.decodeAudioData(event.target.result).then(decoded => { // 解码后的音频数据作为音频源 const audioBufferSourceNode = ctx.createBufferSource(); audioBufferSourceNode.buffer = decoded; // 把音源 node 和输出 node 连接,boom—— audioBufferSourceNode.connect(ctx.destination); audioBufferSourceNode.start(0); // 收工。 }); } reader.readAsArrayBuffer(files[0]) } 1.5 分析频谱 频谱的概念我建议搜一下傅里叶变换,关于时域和频域转换的计算过程和数学原理直接略(因为不懂),至今我还只理解到时域和频域的概念以及傅里叶变换的实现接受采样返回采样数一半长的频域数据...... 不班门弄斧了。 以前写python的时候用的numpy来进行傅里叶变换取得频域数据,现在在浏览器上用js着实有些难受。不过幸好,AudioContext直接支持了一个音频分析的node,叫做AudioAnalyserNode。 这个Node处于音源Node和播放输出Node之间,想象一道数据流,音源Node把离散的采样数据交给Analyser,Analyser再交给输出Node。 直接看代码实例。 // 创建一个新的 AudioContext const ctx = new AudioContext(); // 解码后的音频数据作为音频源 // 为了方便管理,将这些Node都放置在回调函数外部 const audioBufferSourceNode = ctx.createBufferSource(); // 创建音频分析Node! const audioAnalyser = ctx.createAnalyser(); // 注意注意!这里配置傅里叶变换使用的采样窗口大小!比如说,我们要256个频域数据,那么采样就应该是512。 // 具体对应频率请自行搜傅里叶变换相关博文。 audioAnalyser.fftSize = 512; function onInputChange(files){ const reader = new FileReader(); reader.onload = (event) => { // event.target.result 就是我们的文件内容了 // 解码它 ctx.decodeAudioData(event.target.result).then(decoded => { // 停止原先的音频源 audioBufferSourceNode.stop(); // 先把音频源Node和Analyser连接。 audioBufferSourceNode.connect(audioAnalyser); // 然后把Analyser和destination连接。 audioAnalyser.connect(ctx.destination); // 修改音频源数据 audioBufferSourceNode.buffer = decoded; audioBufferSourceNode.start(0); // 收工。 }); } reader.readAsArrayBuffer(files[0]) } window.requestAnimationFrame(function() { // 读取频域数据 const freqData = new Uint8Array(audioAnalyser.frequencyBinCount); console.log(freqData); }) 频域数据是二维的,频率(数组下标)和能量(下标对应值)。悄悄补一句,数学上应该说是该频率函数图像的振幅? 其实获得了这个频域数据,继续画出我们常见的条状频域图就很容易了。参考我一朋友的博客。misuzu.moe,可以看看效果。 关于AudioContext的介绍先到此为止,等我找时间继续写。 PS:代码不保证复制粘贴就能运行,领会精神,遇到问题查查文档。MDN比我这博客详细多了。

资源下载

更多资源
Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册