Rythm.js源文文档
1. https://github.com/Okazari/Rythm.js
思路
- 是什么,解决什么问题
- 什么样子,预览
- 如何使用
- 如果工作的(源码分析,基本流程)
- 总结,收获
What
一个可以使也页面跳动的js库。
demo:https://okazari.github.io/Rythm.js/
How to Use
按照README.md 说明(提供了一版中文版README.zh-CN.md),可以分为两种方式。一种是直接在页面通过<script>
标签引入Rythm.js 文件,另外一种就是ES6 模块的方式进行使用。上述demo 中就是使用的第一种方式。
第一步:在你的页面引入 rythm。
1 | <script type="text/javascript" src="/path/to/rythm.js"></script> |
其中的/path/to/rythm.js
既可以是本地也可以是线上地址https://unpkg.com/rythm.js/
第二步:引入rythm css 类的元素将会跳舞。
1 | <div class="rythm-bass"></div> |
其中的rythm-bass
可以进行自定义,也可以使用Rythm.js 默认的值,稍后将在How to Work 中进行介绍。
=第三步:创建一个Rythm 对象,并且传入你的音频url 地址,然后调用start 方法。这样就可以查看效果了。
1 | var rythm = new Rythm(); |
How to Work
原理:
使用Web Audio API 实现的音频可视化。通过获取各个时间点上的音频数据(通常为振幅或频率),之后运用图像技术将其处理为视觉输出(例如一个图像)来实现。Web Audio API 提供了一个不会改变输入信号的音频节点–分析器节点(AnalyserNode),通过它获取声音数据并传递到像<canvas>
等等一样的可视化工具。
一般流程如下:
1、创建音频环境
2、在音频环境中,创建声源
3、创建特效节点
4、选择音频的终点
5、将声源、特效节点以及音频的终点链接起来
Web Audio API 的最简代码:
1 | // 创建音频环境 |
然后将上述js 代码引入一个HTML 页面就可以了,**注意:需要调整一下电脑的音量**
上述代码只是一个简单使用Web Audio API 的例子,因此同介绍的一般流程不同,缺失了流程中的部分。下面根据一般流程来解释Rythm.js 中的代码。
Review Code
1、 创建音频环境
1 | that._browserAudioCtx = AudioContext || webkitAudioContext |
1 | that._createSourceFromAudioElement = function connectExternalAudioSource(audioElement) { |
1 | that.plugMicrophone = function plugMicrophone(){ |
3、创建特效节点
1 | that._init = function(){ |
注意,这里实现了两个音效节点(AudioNode)一个是分析器节点( AnalyserNode),一个是音量节点(GainNode),Rythm.js 主要用到的是分析器节点(AnalyserNode)。
4、选择音频的终点,这里根据音源的不同,选择不同的音频重点,只有当音源不是来自麦克风才使用系统自带的扬声器。
1 | if(that._rythmInputType !== that._rythmInputTypeList['STREAM']){ |
1 | that._connectSource = function _connectSource(source){ |
上述就是Rythm.js 源码中对应一般流程中的相关代码,接下来主要是通过对分析器节点(AnalyserNode)获取的数据进行分析,来实现Web Audio API 的可视化。
Visualizations with Web Audio API
通过调用AnalyserNode.getByteFrequencyData() 获取频率数据,并将其存储到Unit8Array(无符号字节数组)中。
1 | that._analyser.fftSize = 2048; |
上述代码相当于:
1 | that._analyser.getByteFrequencyData( new Uint8Array(1024)); |
通过上述操作,我们就获取到了音频数据。
我们定义 renderRythm() 函数来进行可视化。
1 | function renderRythm() { |
getAverageRatio() 获取平均比率。
1 | function getAverageRatio(startingValue, nbValue){ |
getRatio() 获取当前比率。
1 | function getRatio(index){ |
pulseSize() 设置元素的scale 值。
1 | function pulseSize(name, value){ |
总结
1、对Web Audio API 有了初步了解
2、阅读源代码确实对自己有助于提升
3、参考文档比较多,主要是自己对音乐相关的概念不是很清楚
参考文档
Web Audio API
Web Audio API - Web API 接口|MDN
AudioContext - Web API 接口|MDN
AnalyserNode - Web API 接口|MDN
AnalyserNode.fftSize - Web API 接口|MDN
GainNode - Web API 接口|MDN
AudioContext.createGain() - Web API 接口|MDN
AudioContext.createMediaElementSource() - Web API 接口|MDN
MediaElementAudioSourceNode - Web API 接口|MDN
AudioNode - Web API 接口|MDN
AudioNode.connect() - Web API 接口|MDN
AudioContext.createMediaStreamSource() - Web API 接口|MDN
navigator.getUserMedia() - Web API 接口|MDN
GainNode.gain - Web API 接口|MDN
媒体流(MediaStream)- Web API 接口|MDN
MediaStreamTrack - Web API 接口|MDN
AnalyserNode.getByeFrequencyData - Web API 接口|MDN
网页音频接口基本概念 - Web API 接口|MDN
[HTML5] Web Audio API 打造超炫的音乐可视化效果
开大你的音响,感受HTML5 Audio API 带来的视听盛宴
如果看了此文你还不懂傅立叶变换,那就过来掐死我吧【完整版】- 文章 - 伯乐在线