Web Audio介绍

Web Audio还是一个比较新的JavaScript API,它和HTML5中的<audio>是不同的,简单来说,<audio>标签是为了能在网页中嵌入音频文件,和播放器一样,具有操作界面,而Web Audio则是给了开发者对音频数据进行处理、分析的能力,例如混音、过滤等,类似于对音频数据进行PS。

一般的网站应用应该是用不倒这些API中的,但是一些游戏引擎或者在线音乐编辑等类型的网站应该用得到。

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

3

4

5

6

7

8

9

10

11

12

13

14

15

// create source node

var source = context.createBufferSource();

// create gain node

var gain = context.createGain();

#### audio node之间的链接、断开操作 ####

// connect source to gain

source.connect(gain);

// connect gain to node

gain.connect(context.destination);

// disconnect source from gain

source.disconect(0);

// disconnect gain from destination

gain.disconnect(0);

  

播放声音

所谓巧妇难为无米之炊,没有声音再好的API也出不来。那么如何得到音频数据呢?既然成为Web Audio,数据肯定是从web上来。下面就是从服务器端下载音频文件,然后解码播放的代码片段。

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

var context = createAudioContext();

var audioURl = http://...; // 这里替换为音频文件URL

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 offset

var startTime = 0; // web audio absolute time

function 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,基本可以完成一个小型的混音室。

时间: 2024-11-25 03:58:21

Web Audio介绍的相关文章

【HTML5】Web Audio API打造超炫的音乐可视化效果

HTML5真是太多炫酷的东西了,其中Web Audio API算一个,琢磨着弄了个音乐可视化的demo,先上效果图: 项目演示:别说话,点我!  源码已经挂到github上了,有兴趣的同学也可以去star或者fork我,源码注释超清楚的哦~~之前看刘大神的文章和源码,感觉其他方面的内容太多了,对初学者来说可能一下子难以抓到Web Audio API的重点,所以我就从一个初学者的角度来给大家说说Web Audio API这些事吧. Web Audio API与HTML5提供的Audio标签并不是同

web audio living

总结网页音频直播的方案和遇到的问题. 代码:(github,待整理) 结果: 使用opus音频编码,web audio api 播放,可以达到100ms以内延时,高质量,低流量的音频直播. 背景: VDI(虚拟桌面) h264网页版预研,继h264视频直播方案解决之后的又一个对延时有高要求的音频直播方案(交互性,音视频同步). 前提: flexVDI开源项目对音频的支持只实现了对未编码压缩的PCM音频数据.并且效果不好,要么卡顿,要么延时,流量在2~3Mbps(根据缓冲的大小). 解决方案: 在

audio与Web Audio

做H5游戏难免会遇到需要播放背景音乐或者音效的时候.一开始看到这个需求第一反应就是用H5中的audio标签去实现,但是在实现的过程中发现它存在很多的问题. 1.只能播放单一音频(在包括IOS在内的某些设备上).什么意思呢?就是说如果你同时在播放背景音乐的时候播放音效的话,背景音乐会被停掉.这是一个非常严肃的问题. 2.在IOS中不能预加载.这会导致H5游戏在IOS中播放音效时,只能实时的去拉去音频数据,会对性能造成一定影响.而且在加载的过程中去设置audio的某些属性会报错. 3.在包括IOS在

nginx web日志介绍和分析

nginx web日志介绍和分析 Nginx访问日志打印的格式可以自定义,例如Nginx日志打印格式配置如下,Log_format 用来设置日志格式,Name(模块名) Type(日志类型),可以配置多个日志模块,分别供不同的虚拟主机日志记录所调用: log_format log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '                   '$status $body_b

Web服务介绍 & httpd安装

Web简介 什么是Web WWW:World Wide Web,万维网 英国人TimBerners-Lee在1989年欧洲共同体的一个大型科研机构工作时发明的 Web是一种超文本信息系统,其主要实现方式是超文本连接 Web特点 1.Web页面的图形化和易于链接 2.Web与操作系统.浏览器平台无关 3.分布式 4.动态习惯 5.交互性 Web工作原理 HTTP(Hyper Text Transfer Protocol,超文本传输协议):提供了访问超文本信息的功能,是Web浏览器和Web服务器之间

Java中常见的5种WEB服务器介绍

这篇文章主要介绍了Java中常见的5种WEB服务器介绍,它们分别是Tomcat.Resin.JBoss.WebSphere.WebLogic,需要的朋友可以参考下 Web服务器是运行及发布Web应用的容器,只有将开发的Web项目放置到该容器中,才能使网络中的所有用户通过浏览器进行访问.开发Java Web应用所采用的服务器主要是与JSP/Servlet兼容的Web服务器,比较常用的有Tomcat.Resin.JBoss.WebSphere 和 WebLogic 等,下面将分别进行介绍. Tomc

[Javascript] Intro to the Web Audio API

An introduction to the Web Audio API. In this lesson, we cover creating an audio context and an oscillator node that actually plays a sound in the browser, and different ways to alter that sound. var context = new window.AudioContext() || new window.

Web Audio API DEMO

一转眼就已经有三个月没写博客了,毕业季事情确实多,现在也终于完全毕业了,博客还是不能落下.偶尔还是要写一下. 玩HTML5的Audio API是因为之前看到博客园里有关于这个的博客,觉得挺好玩的,所以就学习了一下.本文仅作为自己的学习记录.如有错误之处请指出.   最终的效果也就如右图,楼主只是简单的做了个demo,如果要有更复杂的效果,园友们可以自己去玩一下 DEMO链接:请戳我!!!   选择音频文件后即可播放 同时,这个API目前浏览器支持度不高,若要用于生产环境,请自行斟酌. 首先,要做

移动开发 Native APP、Hybrid APP和Web APP介绍

快速区分定义: Native App 以基于智能手机本地操作系统如IOS.Android.WP并使用原生程式(SDK)编写运行的需要用户安装使用的第三方应用程序; Web APP 以HTML+JS+CSS等WEB技术编程,代码运行在移动端浏览器中,通过该移动端浏览器来调用Device API(取决于HTML5未来的支持能力)的不需要用户安装的应用程序: Hybrid App 同时使用网页语言(Web技术)与程序语言(Java.Objective-C等)开发,通过应用商店区分移动操作系统分发,需要