使用Web Audio API能夠對音頻進行分析和操做,最終實現一個音頻可視化程序。javascript
最終效果請戳這裏;html
完整版代碼請戳這裏,若是還看得過眼,請給一個start⭐java
AudioContext
: 該接口表示由音頻模塊連接而成的一個音頻上處理下文,相似於canvas
裏面getContext(2d)
返回的對象,對音頻的一切 操做都在這個環境裏進行;它包含各個AudioNode
對象以及他們相關聯的對象,建立方法以下:git
var ac = new window.AudioContect()
;github
AudioNode
:音頻節點,是一個音頻處理模塊,它包括GainNode
(音量控制器)、BiquadFilterNode
(濾波器)等;canvas
AudioContext
的屬性:api
AudioContext.currentTime
: AudioContext
從建立開始到當前的時間,單位秒,是一個只讀屬性,不可對其進行操做;AudioContext.destination
:返回AudioDestinationNode
對象,全部音頻輸出的彙集地,全部的AudioNode
都直接或間接地連接到這裏;AudioContext.state
:返回AudioContext
的當前狀態;AudioContext
的方法:異步
AudioContext.close()
:關閉音頻環境,釋放正在使用的音頻資源;AudioContext.createBuffer()
:建立一個空的AudioBuffer對象,並能經過AudioBufferSourceNode來進行數據填充和播放;AudioBuffer能夠經過AudioContect.createBuffer方法建立或使用AudioAudioContext.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()
;oop
AudioBufferSourceNode
:表示內存中的一段音頻資源,其音頻數據存儲於AudioBuffer中(buffer屬性中),建立方式:
var buffersource = ac.createBufferSource()
;
此對象有3個經常使用的屬性:
1).buffer:AudioBuffer對象,表示要播放的音頻資源數據。他有一個子屬性:duration,該音資源的時長,單位秒;
2).loop:是否循環播放,默認是false;
3).onended:綁定音頻播放完畢時調用的實踐處理程序;
經常使用的方法:
- start/noteOn(when=ac.currentTime,offset=0,duration=buffer.duration-offset),開始播放音頻。其中,when:什麼時候開始播放;offset:從音頻的第幾秒開始播放;duration:播放幾秒;
- 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; }
以上代碼就能夠實現獲取音頻進行播放了,固然這只是一個開始,接下來一篇對音頻進行分析。