Web Audio初步介绍和实践
Web Audio还是一个比较新的JavaScript API,它和HTML5中的<audio>是不同的,简单来说,<audio>标签是为了能在网页中嵌入音频文件,和播放器一样,具有操作界面,而Web Audio则是给了开发者对音频数据进行处理、分析的能力,例如混音、过滤等,类似于对音频数据进行PS。
一般的网站应用应该是用不倒这些API中的,但是一些游戏引擎或者在线音乐编辑等类型的网站应该用得到。Web Audio要全部加载之后才能播放,<audio>标签是边加载边播放,所以我基本是音效用Web Audio背景音乐之类<audio>,因为音效需要经常播放 而且短 如果用<audio>我发现会比较的卡,而且移动设备上只支持一个<audio>播放。所以大家加音乐时候可以考虑一下 两者优缺点来选择。
Web Audio API紧紧围绕着一个概念设计:audio context,它就像是一个有向图,途中的每个节点都是一个audio node,音频数据从源节点按照程序中指定的边一步一步的走的目的节点。
如果你接触过directshow开发,audio context就像filter manager,而audio node则是各种filter,当然,如果你是个linux开发者,这有看起来像是pipe。一个audio context中的audio node可以有很多,上面的是最简单的形式了。而audio node又包括四种,
1. 源节点(source node)
2. 处理节点(gain node、panner node、wave shaper node、oscillator node、delay node、convolver node等)
4. 目的节点(destination node)
初始化audio context
现在只有firefox和webkit系的浏览器(chrome、safari、opera)都支持web audio api,不过和其他新标准一样,每家浏览器还是使用了特定的前缀,所以在调用API时,要考虑一下这个问题。
|
1
2
3
4
5
6
|
window.AudioContext = (window.AudioContext || window.webkitAudioContext);if(window.AudioContext) { var context = new window.AudioContext();} else { console.log('not support web audio api');} |
一个audio context对象可以支持多个节点,包括source和destination节点,每个新创建的audio context都有一个默认的目的节点,通常代表当前机器上的默认音频输出设备,可以通过context.destination来获取。
创建audio node
|
1
2
|
// create source nodevar source = context.createBufferSource(); |
播放声音
所谓巧妇难为无米之炊,没有声音再好的API也出不来。那么如何得到音频数据呢?既然成为Web Audio,数据肯定是从web上来。下面就是从服务器端下载音频文件,然后解码播放的代码片段。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
var xhr = new XMLHttpRequest();xhr.open('GET', audioURL, true);xhr.responseType = 'arraybuffer'; // XMLHttpRequest 2的新东西xhr.onload = function() { // 音频数据在request.response中,而不是request.requestText context.decodeAudioData(request.response, function (buffer) { source = context.createBufferSource(); source.buffer = buffer; source.connect(context.destination); source.start(0); // 0是当前audio context中的同步时间 }}xhr.send(); |
时间控制
web audio提供了非常精准的时间控制,所有的时间都是以秒来计数的。是的,你没看错,是秒,不过这里的秒在底层都是使用高精度的浮点数存储的,其实际精确度是很高的。在创建的audio context中都有一个同步系统,用来对外提供绝对时间,这个时间可以通过context.currentTime获取。这个绝对时间从0开始,而且一旦新建context,就开始走了。
使用代码source.start(time)中,则要求在绝对时间为time时开始播放,当然,如果这个时间time小于context.currentTime则会立即播放,所以上面代码片段中的source.start(0),其实就是立即播放的意思,如果要指定在N秒后播放,则要使用source.start(context.currentTime + N)。
source.start还可以指定另外两个参数,一个是音频的开始时间,一个音频的持续时间,例如一个一分钟的视频,你可以使用source.start(10, 20, 30)来指定10秒后播放音频文件20秒到20 + 30秒之间的内容。至于暂停、继续功能,则需要自己手工的记录时间点,web audio自身是不提供这些功能的,另外一点就是,web audio的定时功能是不可取消的,嫁出去的姑娘,泼出去的水啊。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
var startOffset = 0; // audio file offsetvar startTime = 0; // web audio absolute timefunction start() { startTime = context.currentTime; var source = context.createBufferSource(); source.buffer = buffer; source.loop = true; source.connect(context.destination); source.start(0, startOffset % buffer.duration);}function pause() { source.stop(); // 已经播放了多长时间 startOffset += context.currentTime - startTime;}function resume() { // 和<audio>标签嵌入的音频文件不同,source node是不能重复播放的,所以继续功能其实就是play play();} |
到此为止,就是web audio最基本的应用。当然,web audio不止这么简单,使用其他类型的audio node,基本可以完成一个小型的混音室。
Web Audio初步介绍和实践的更多相关文章
- Web Audio API之手把手教你用web api处理声音信号:可视化音乐demo
1.Web Audio API 介绍 Web Audio API 提供了在Web上控制音频的一个非常有效通用的系统 ,这些通用系统通俗的讲就是我们可以利用Web Audio API提供的各种方法操作各 ...
- Web Audio介绍
Web Audio还是一个比较新的JavaScript API,它和HTML5中的<audio>是不同的,简单来说,<audio>标签是为了能在网页中嵌入音频文件,和播放器一样 ...
- 【HTML5】Web Audio API打造超炫的音乐可视化效果
HTML5真是太多炫酷的东西了,其中Web Audio API算一个,琢磨着弄了个音乐可视化的demo,先上效果图: 项目演示:别说话,点我! 源码已经挂到github上了,有兴趣的同学也可以去st ...
- 《赢在用户:Web人物角色创建和应用实践指南》阅读总结
本书针对创建人物角色的每一个步骤,包括进行定性.定量的用户研究,生成人物角色分类,使人物角色真实可信等进行了十分详细的介绍.而且,在人物角色如何指导总体商业策略.确定信息架构.内容和设计 ...
- Delphi 6 Web Services初步评估之三(转)
Delphi 6 Web Services初步评估之三(转) Delphi 6 Web Services初步评估之三(转)★ 测试总体印象:在整个测试中,对Delphi 6创建的Web Servi ...
- 关于Axure RP软件的介绍——软件工程实践第二次个人作业
关于Axure RP软件的介绍——软件工程实践第二次个人作业 Axure RP是一个非常专业的快速原型设计的一个工具,客户提出需求,然后根据需求定义和规格.设计功能和界面的专家能够快速创建应用软件或W ...
- HTML5 ——web audio API 音乐可视化(二)
上一篇 web audio API 音乐可视化(一)介绍了一些基本的API,以及如何简单的播放一个音频,本篇介绍一下怎么对获取到的音频进行分析,并将分析后的数据绘制成图像. 最终效果请戳这里; 完整版 ...
- HTML5 ——web audio API 音乐可视化(一)
使用Web Audio API可以对音频进行分析和操作,最终实现一个音频可视化程序. 最终效果请戳这里; 完整版代码请戳这里,如果还看得过眼,请给一个start⭐ 一.API AudioContext ...
- web audio living
总结网页音频直播的方案和遇到的问题. 代码:(github,待整理) 结果: 使用opus音频编码,web audio api 播放,可以达到100ms以内延时,高质量,低流量的音频直播. 背景: V ...
随机推荐
- Sethi model
小结: 1. 销量 广告 微分方程 动态系统 市场份额 https://en.wikipedia.org/wiki/Sethi_model The Sethi model was developed ...
- “段错误(segment fault)”、“非法操作,该内存地址不能read/write” 非法指针解引用造成的错误。
小结: 1. “段错误(segment fault)”.“非法操作,该内存地址不能read/write”非法指针解引用造成的错误. <程序员的自我修养 : 链接.装载与库> Q 我写的程序 ...
- LITTLE-ENDIAN(小字节序、低字节序) BOM——Byte Order Mark 字节序标记 数据在内存中的存放顺序
总结: 1. endian 字节存放次序 字节序,顾名思义字节的顺序,再多说两句就是大于一个字节类型的数据在内存中的存放顺序(一个字节的数据当然就无需谈顺序的问题了). 2. LITTLE-ENDIA ...
- 关于服务器时区BEIST-8、GMT-8、Asia/Shanghai、CST、GMT+8:00等缩写的含义
http://www.talkwithtrend.com/Article/147961 AIX系统时区总结 字数 2078阅读 5844评论 0赞 0 前几天NTP的问题牵涉出时区问题,大家可能被眼花 ...
- LeetCode 811 Subdomain Visit Count 解题报告
题目要求 A website domain like "discuss.leetcode.com" consists of various subdomains. At the t ...
- spring boot动态数据源方案
动态数据源 1.背景 动态数据源在实际的业务场景下需求很多,而且想要沟通多数据库确实需要封装这种工具,针对于bi工具可能涉及到从不同的业务库或者数据仓库中获取数据,动态数据源就更加有意义. 2.依赖 ...
- 20165225 《Java程序设计》第二周学习总结
20165225<Java程序设计>第二周学习总结 1.视频与课本中的学习: ##### 1.标识符: 字母.下划线.美元符号.数字(不能是true,false,null还有关键字). # ...
- vuex是什么?怎么使用?哪种功能场景使用它?
vuex是vue框架中状态管理.在main.js引入store,注入.新建了一个目录store,...export.应用场景有:单页应用中,组件之间的状态.应用实例:音乐播放.登录状态.加入购物车等等
- IntelliJ配置SpringMVC提示“found:java.lang.String required:java.lang.String”
File->Invalid Cache&Restart 据说Android Studio也会出现这个问题,但是没遇到过 重启环境后,找不到Controller的问题也解决了
- [MySQL优化2]不用SELECT * FROM table;
假设有一张employees表,它有8列:员工人数,姓氏,名字,分机,电子邮件,办公室代码,报告,职位等.如果要仅查看员工的名字,姓氏和职位,请使用以下查询:SELECT lastname, firs ...