使用Web Audio API可以对音频进行分析和操作,最终实现一个音频可视化程序。

最终效果请戳这里;

完整版代码请戳这里,如果还看得过眼,请给一个start⭐️

一、API###

  1. AudioContext: 该接口表示由音频模块链接而成的一个音频上处理下文,类似于canvas里面getContext(2d)返回的对象,对音频的一切 操作都在这个环境里进行;它包含各个AudioNode对象以及他们相关联的对象,创建方法如下:

    var ac = new window.AudioContect();

  2. AudioNode:音频节点,是一个音频处理模块,它包括GainNode(音量控制器)、BiquadFilterNode(滤波器)等;

  3. AudioContext的属性:

    • AudioContext.currentTime: AudioContext从创建开始到当前的时间,单位秒,是一个只读属性,不可对其进行操作;
    • AudioContext.destination:返回AudioDestinationNode对象,所有音频输出的聚集地,所有的AudioNode都直接或间接地链接到这里;
    • AudioContext.state:返回AudioContext的当前状态;
  4. AudioContext的方法:

    • AudioContext.close():关闭音频环境,释放正在使用的音频资源;

    • AudioContext.createBuffer():创建一个空的AudioBuffer对象,并能通过AudioBufferSourceNode来进行数据填充和播放;AudioBuffer可以通过AudioContect.createBuffer方法创建或使用Audio

    • AudioContext.createBufferSource():创建一个空的AudioBufferSourceNode对象,并能通过AudioBuffer来进行数据填充和播放;

    • AudioCount.createAnalyser():创建一个AnalyserNode,他可以用来显示音频时间和频率的数据。

    • AudioContext.decodeAudioData(arrayBuffer,succ(buffer),err):从ArrayBuffer对象中异步解码音频文件,这个ArrayBuffer对象通常是通过使用responseType为arraybuffer类型的XMLHttpRequest方法来获取.接受三个参数,第一个是AudioData数据,第二个是解码成功的回调函数,第三个是失败的回调函数。

    • createGain()/createGainNode():创建GainNode对象,通过改变其value的值可以改变音频音量,创建方法:

      var gainNode = ac.createGain() || ac.createGainNode();

  5. AudioBufferSourceNode:表示内存中的一段音频资源,其音频数据存储于AudioBuffer中(buffer属性中),创建方式:

    var buffersource = ac.createBufferSource();

    此对象有3个常用的属性:

    ​ 1).buffer:AudioBuffer对象,表示要播放的音频资源数据。他有一个子属性:duration,该音资源的时长,单位秒;

    ​ 2).loop:是否循环播放,默认是false;

    ​ 3).onended:绑定音频播放完毕时调用的实践处理程序;

    常用的方法:

    1. start/noteOn(when=ac.currentTime,offset=0,duration=buffer.duration-offset),开始播放音频。其中,when:何时开始播放;offset:从音频的第几秒开始播放;duration:播放几秒;
    2. stop/noteOff(when=ac.currentTime):结束播放;

二、播放一个音频###

通过xhr 获取到arrayBuffer类型的音频资源,用audioContext对象的decodeAudioData方法将arrayBuffer类型解析为buffer类型,用audioContext对象的createBufferSource()方法创建一个bufferSource对象,将刚才解析的buffer 数据复制给bufferSource对象的buffer属性,bufferSource对象用contect()方法链接audioContext对象的 destination 属性,最后调用bufferSource对象的“start/noteOn”方法播放音频。

实例代码:

   //获取到arrayBuffer类型的音频资源

   var xhr = new XMLHttpRequest();
function getMusic(name){
xhr.abort();
xhr.open("get","media/"+name); // 文件位于media文件夹下,要获取的音频文件名为 name
xhr.responseType = "arraybuffer"; //返回类型设置为
xhr.onload = function(){
console.log(xhr.response); //ArrayBuffer 类型的返回数据
};
xhr.send();
}
   //用decodeAudioData方法将arrayBuffer类型解析为buffer类型
var ac = new window.AudioContext(); //接上例
xhr.onload = function(){
ac.decodeAudioData(xhr.response,function(buffer){
var bufferSource = ac.createBufferSource();
bufferSource.buffer = buffer;
bufferSource.connect(ac.destination);
bufferSource[bufferSource.start ? "start" : "noteOn"](0); //播放
},function(err){
console.log(err)
})
};

实现对音量的控制:

改变音量要用到gainNode对象,用gainNode对象链接到destination对象,然后让bufferSource对象链接到gainNode对象,对音量的控制,是对gainNode对象的gain.value 对象的改变达到的效果。

   //音量控制元素
<input type="range" id="volume" mix="0" max="100" value="50">
   var gainNode = ac[ac.createGain ? "createGain" :"createGainNode"]();
gainNode.connect(ac.destination); function getMusic(name){
//...代码同上,只有一处需要修改
bufferSource.connect(gainNode); //因为上面已经将gainNode连接到ac.destination了,所以这里只需链接到gainNode即可;
}
$("#volume").change(function(){
changeVolume($(this).val()/$(this).attr("max"));
})
function changeVolume(num){
gainNode.gain.value = num * num;
}

以上代码就可以实现获取音频进行播放了,当然这只是一个开始,接下来一篇对音频进行分析。

HTML5 ——web audio API 音乐可视化(一)的更多相关文章

  1. HTML5 ——web audio API 音乐可视化(二)

    上一篇 web audio API 音乐可视化(一)介绍了一些基本的API,以及如何简单的播放一个音频,本篇介绍一下怎么对获取到的音频进行分析,并将分析后的数据绘制成图像. 最终效果请戳这里; 完整版 ...

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

    HTML5真是太多炫酷的东西了,其中Web Audio API算一个,琢磨着弄了个音乐可视化的demo,先上效果图: 项目演示:别说话,点我!  源码已经挂到github上了,有兴趣的同学也可以去st ...

  3. Web Audio API之手把手教你用web api处理声音信号:可视化音乐demo

    1.Web Audio API 介绍 Web Audio API 提供了在Web上控制音频的一个非常有效通用的系统 ,这些通用系统通俗的讲就是我们可以利用Web Audio API提供的各种方法操作各 ...

  4. 关于HTML5音频——audio标签和Web Audio API各平台浏览器的支持情况

    对比audio标签 和 Web Audio API 各平台浏览器的支持情况:   audio element Web Audio API desktop browsers Chrome 14 Yes  ...

  5. Web Audio API 实现音频可视化

    声明:本文为原创文章,如需转载,请注明来源WAxes,谢谢! 一转眼就已经有三个月没写博客了,毕业季事情确实多,现在也终于完全毕业了,博客还是不能落下.偶尔还是要写一下. 玩HTML5的Audio A ...

  6. 【Web Audio API】 — 那些年的 web audio

    转 TAT.Jdo:[Web Audio API] - 那些年的 web audio 这主题主要是早期对 web audio api的一些尝试,这里整理一下以便以后翻阅,如有错误,诚请指正. 在这之前 ...

  7. 使用Web Audio API绘制音波图

    摘要:Web Audio API是对<audio> 标签功能上的补充,我们可以用它完成混音.音效.平移等各种复杂的音频处理,本文简单的使用其完成音波图的绘制. PS:本例子使用ES6编程, ...

  8. H5的Web Audio Api

    概述 研究Web Audio Api的主要原因是:工作中需要在ios中实现声音的淡出效果,主要是通过setInterval来改audio标签的volume属性实现的,但是ios上面volume属性是只 ...

  9. [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 osci ...

随机推荐

  1. 《挑战程序设计竞赛》2.6 数学问题-辗转相除法 AOJ0005 POJ2429 1930(1)

    AOJ0005 http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0005 题意 给定两个数,求其最大公约数GCD以及最小公倍数LCM. ...

  2. Grammar Rules

    Grammar Rules Here are 20 simple rules and tips to help you avoid mistakes in English grammar. For m ...

  3. ini_set('date.timezone','Asia/Shanghai');

    w 同样的代码,不一样的php ENV.

  4. 转!!Tomcat网站上的core和deployer的区别

    转自:https://www.cnblogs.com/guxia/p/6678184.html 8.5.13 Please see the README file for packaging info ...

  5. python线程池应用场景-爬虫

    import requests from bs4 import BeautifulSoup from concurrent.futures import ThreadPoolExecutor, Pro ...

  6. Android项目使用Ant多渠道打包(最新sdk)

    参考文章: http://blog.csdn.net/liuhe688/article/details/6679879 http://www.eoeandroid.com/thread-323111- ...

  7. JPA 对象关系映射之关联关系映射策略

    关联关系映射 关联关系映射,是映射关系中比较复杂的一种映射关系,总的说来有一对一.一对多和多对多几种关系.细分起来他们又有单向和双向之分.下面我们逐一介绍一下. 回页首 单向 OneToOne 单向一 ...

  8. sql server如何把查询结果发邮件出去

    原本:https://zhidao.baidu.com/question/1819725575342685788.html --1.启用Database Mail扩展存储过程 sp_configure ...

  9. CAS单点登录实践(spring cas client配置)

    前言: 最近的项目需要将多个站点统一登录,查阅了资料Jasig cas(Central Authentication Service)(官方站点:http://www.jasig.org/cas)使用 ...

  10. java 获取request参数集

    request里有两个方法 request.getParameterMap(); request.getParameterNames(); 我想用这两种方法获取. 1.用request.getPara ...