1,安装nodejs和Git,配置环境变量
2,安装express,npm install -g express-generator
3,建立项目,express -e music(项目名称)
4,进入项目,npm install
5,安装实时监听工具,npm install -g supervisor
6,测试,supervisor bin/www
,浏览器验证127.0.0.1:3000
javascript
sublime运行js文件css
1,打开build system -> new build system
新建配置文件java
{ "cmd": ["node", "--use-strict", "--harmony", "$file"], "selector": "source.js" }
保存文件Node.sublime-build
,build system
设置为Nodenode
构建应用的先后端git
1,新建媒体数据文件夹,public/media
,把音频数据放入其中
2,搭建页面CSS框架,/public/stylesheets/index.css
3,读取页面内容,views/index.ejs
4,后台路由控制,routes/index.js
,获取音乐列表并返回给前段github
ajax请求服务端音频数据web
在javascripts
下新建文件index.js
,在views/index.ejs
引用建立的文件ajax
<script type="text/javascript" src="/javascripts/index.js"></script>
编辑建立文件,实现点击效果算法
<ul id="list"> <% music.forEach(function(name){ %> <li title="<%= name %>"><%= name %></li> #设置title属性 <% }) %> </ul>
AudioContextexpress
包含各个AudioNode
对象以及它们的联系的对象,即audio上下文对象。一个document
中只有一个AudioContext建立:var ac = new window.AudioContext();
属性:
destination
,AudioDestinationNode对象,全部的音频输出汇集地,至关于音频的硬件,全部的AudioNode都直接或间接链接到这里。
currentTime
,AudioContext从建立开始到当前的时间(秒)。
方法:
decodeAudioData(arrayBuffer,succ(buffer),err)
,异步解码包含在arrayBuffer中音频数据
createBufferSource()
,建立autioBufferSourceNode对象
createAnalyser()
,建立AnalyserNode对象
createGain()/createGainNode()
,建立GainNode对象
AudioBufferSourceNode
表示内存中的一段音频资源,其音频数据存储在AudioBuffer中(其buffer属性)
建立:var buffersource = ac.createBufferSource();
属性:
buffer
,AudioBuffer对象,表示要播放的音频资源数据
——子属性:duration
,该音频资源的时长(秒)
loop
,是否循环播放,默认false
onended
,可绑定音频播放完毕时调用的时间处理程序
方法:
start/noteOn(when=ac.currentTime,offset=0,buration=buffer.duration-offset)
,开始播放音频。when
:什么时候开始播放;offset
:从音频的第几秒开始播放;duration
:播放几秒
stop/noteOff(when=ac.currentTime)
,结束播放音频
GainNode
改变音频音量的对象,改变经过它的音频数据全部的sampleframe
的信号强度
建立:var gainNode = ac.createGain()/ac.createGainNode();
gain
,AudioParam对象,经过改变其value
值能够改变音频信号的强弱,默认的value
属性值为1,经过最小值为0,最大值为1,其value值也能够大于1,小于0
播放bug修复
问题:播放第二首歌时,第一首歌依然在播放,主要缘由是每次点击音乐列表即调用load("/media/"+this.title)
,数据解码并播放:
xhr.onload = function(){ ac.decodeAudioData(xhr.response, function(buffer){ var bufferSource = ac.createBufferSource(); bufferSource.buffer = buffer; bufferSource.connect(gainNode); bufferSource[bufferSource.start?"start":"noteOn"](0); }, function(err){ console.log(err); }); }
解决方法:
对音频数据赋空值var source = null;
,保存上一首歌的解码数据source = bufferSource;
,判断执行中止播放source && source[source.stop ? "stop" : "noteoff"](0);
AnalyserNode
音频分析对象,它能实时的分析音频资源的频域和时域信息,但不会对音频流作任何处理
建立:var analyser = ac.createAnalyser();
fftSize
,设置FFT(FFT是离散傅里叶变换的快速算法,用于将一个信号变换到频域)值得大小,用于分析获得频域,为32 - 2048之间2的整数倍,默认为2048。实时获得的音频频域的数据个数为FFTSize的一半
frequencyBinCount
,FFT值得一半,即实时获得的音频频域的数据个数
getByteFrequencyData(Uint8Array)
,复制音频当前的频域数据(数量是FrequencyBinCount)到Uint8Array(8位无符号整型类型化数组)中
建立Analyser对象:
var analyser = ac.createAnalyser(); analyser.fftSize = 512; analyser.connect(gainNode);
链接到分析对象获取数据:bufferSource.connect(analyser);
实现可视化功能函数:
function visualizer(){ var arr = new Uint8Array(analyser.frequencyBinCount); analyser.getByteFrequencyData(arr); console.log(arr); }
调用visualizer
函数:
利用canvas将音乐数据可视化(柱状图)
在views
下加入id<div class="right" id="box"></div>
控制高度变化:
var box = $("#box")[0]; var height, width; var canvas = document.createElement("canvas"); box.appendChild(canvas); function resize(){ height = box.clientHeight; width = box.clientWidth; canvas.height = height; canvas.width = width; } resize(); #调用触发函数 window.onresize = resize;
利用canvas将音乐数据可视化(圆点图)
webAudio API
webAudio核心功能封装为对象