使用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. curl post CURLOPT_POSTFIELDS

    PHP: curl_setopt - Manual http://php.net/manual/en/function.curl-setopt.php CURLOPT_POST TRUE to do ...

  2. python scrapy,beautifulsoup,regex,sgmparser,request,connection

    In [2]: import requests   In [3]: s = requests.Session()   In [4]: s.headers 如果你是爬虫相关的业务?抓取的网站还各种各样, ...

  3. AHOI2019退役记

    $DAY\quad -1$: 连作业都不写了来刷题... 希望能长点$RP$吧... 反正也是抱着退役的心情来考试... 我要是到了周日还不出长门我就退游!!! $DAY\quad 0$: 早上一起来 ...

  4. django--博客系统--后台管理

    1.后台管理功能主要实现了,文章的添加与修改,以及富文本的使用 前端页面 母版 <!DOCTYPE html> <html lang="en"> <h ...

  5. java jacob调用打印,word,excel横向打印

    public static boolean printOfficeFile(File f) { if (f != null && f.exists()) { String fileNa ...

  6. redis实现cache系统原理(五)

    1. 介绍 cache就是人们所说的缓存.我们这里所说的cache是web上的.对用户来说,衡量一个网站是否具有良好的体验,其中一个标准就是响应速度的快慢.可能网站刚上线,功能还较少,数据库的记录也不 ...

  7. Redis六(管道)

    管道 为什么使用管道? Redis是一个TCP服务器,支持请求/响应协议. 在Redis中,请求通过以下步骤完成: 客户端向服务器发送查询,并从套接字读取,通常以阻塞的方式,用于服务器响应. 服务器处 ...

  8. shell脚本调用传参【转载】

    转自:https://www.cnblogs.com/cisum/p/8010658.html 1.直接使用$0,$1,$2,$3 $0是脚本的名字,就是按顺序来 #!/bin/bash # auth ...

  9. [设计模式]访问者 Visitor 模式

    访问者模式是对象的行为模式. 访问者模式的目的是封装一些施加于某种数据结构元素之上的操作.一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变.

  10. Behind The Cloud--浅析分布式系统背后的基础设施

     http://blog.csdn.net/it_yuan/article/details/8617127 Behind The Cloud--浅析分布式系统背后的基础设施 分类: 系统架构2013- ...