转 TAT.Jdo:【Web Audio API】 — 那些年的 web audio
这主题主要是早期对 web audio api的一些尝试,这里整理一下以便以后翻阅,如有错误,诚请指正。
在这之前,先回顾一下那些年我们一起走过的web audio:
在我印象当中,bgsound是个很古老的东西,接触互联网之后,那时兴起的个人blog都有一个增加小组件或者背景音乐的功能,就是允许你贴入一段代码来实现,那是我最早接触bgsound的时候;当然那时也只是会ctrl+c/v ~~
网上翻来些资料,大概是这样的:
早在1996年,IE3.0定义了
IE推出bgsound之后没多久,作为当年浏览器厂商的大哥 – NetScape同年即推出了功能类似的标签
个人觉得
1.有界面交互,可以让用户控制播放/暂停(该属性可选);
2.不止能播放音频格式文件,还能播放当时比较高端的VRML Live3D图形动画。
以浏览器厂商老大的身份,很快IE3V2+, 以及后续的 safari, opare, firefox均支持了
随着web的快速发展,标准变得越来越重要,这时就有了W3C存在的理由,1997年伴随着HTML4的到来,W3C引入了
08年初,第一份正式的HTML5草案发布,引入更新的富媒体元素
标签语义化,结构更简单;
脱离插件;
简单的javascript内置方法以及事件交互。
看似对音频控制都比较完善,但开发者缺少了对音频数据的访问权限,在很多更动感的交互,更复杂的音效需求面前就显得力不从心了。
[Audio Data API]
为了解决现状,Mozilla社区提出了Audio Data API,对
// 定义音频对象
var audio = new Audio();
var bufferLenth;
audio.src = "song.ogg";
audio.addEventListener('MozAudioAvailable', handleWithSample, false);
audio.addEventListener('loadedmetadata', handleWithMeta, false);
audio.play();
function handleWithMeta () {
bufferLenth = audio.mozFrameBufferLength;
}
function handleWithSample (e) {
var samples = e.frameBuffer;
for (var i = 0; i < bufferLenth; i++) {
// do something with audio data
dosomething(samples[i])
}
}
基于MozAudioAvailable
事件驱动读取音频原始数据
注:该方法已无法正确执行,Firefox已转向Web Audio API的支持,后续的Firefox版本逐渐废弃了Audio Data API的旧接口。
但对于一个开发者来说,并非人人都是音频资深用户或者发烧级音乐玩家,而且在很多音频的专业效果处理上需涉及大量波形相关处理算法,这就直接把很多开发者拒之门外了,这也是为什么最后W3C推荐了 Web Audio API。
[Web Audio API]
Web Audio API最早是Chrome社区提出并支持的,Web Audio API 是一套全新的相对独立的接口系统,对音频文件拥有更高的处理权限以及内置相关的音频专业效果处理,可以完全独立于
大概整了一下Web Audio API的新特点:
更精准的时间控制;
可完全独立
模块化路由连接方式,让音频操作更加灵活形象;
4.实时的频域、时域数据访问/操作;
- 更多专业的音频处理方法
(1) 音道分离/合并;
(2) 音频延时效果;
(3) 内置频率滤波器;
(4) 音频空间感效果以及多普勒效应模拟;
(5) 音频卷积运算(用于声场环境模拟);
(6) 自定义波形生成器;
(7) 波形非线性失真处理。