成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

HTML5音頻API Web Audio

Juven / 1859人閱讀

摘要:屬性返回對(duì)象,表示當(dāng)前中所有節(jié)點(diǎn)的最終節(jié)點(diǎn),一般表示音頻渲染設(shè)備。包括音頻源,音頻輸出,中間處理模塊。延遲停止時(shí)間,單位為秒。音頻終點(diǎn)是通過接口的屬性訪問的。各個(gè)音頻處理通道內(nèi)的操作是獨(dú)立的,不影響其他音頻通道。

此文介紹HTML5音頻API的主要框架和工作流程,因?yàn)橐纛l處理模塊很多,因此只簡單介紹幾種音頻處理模塊,并通過例子來展示效果。后續(xù)會(huì)介紹利用HTML5音頻API實(shí)現(xiàn)的項(xiàng)目,歡迎大家關(guān)注,敬請(qǐng)期待。

HTML5音頻API的主要框架和工作流程如下圖,在 AudioContext 音頻上下文中,把音頻文件轉(zhuǎn)成 buffer 格式,從音頻源 source 開始,經(jīng)過 AuidoNode 處理音頻,最后到達(dá) destination 輸出音樂。這里形成了一個(gè)音頻通道,每個(gè)模塊通過 connect 方法鏈接并傳送音頻。

AudioContext

AudioContext 是一個(gè)音頻上下文,像一個(gè)大工廠,所有的音頻在這個(gè)音頻上下文中處理。

let audioContext = new(window.AudioContext || window.webkitAudioContext)();

AudioContext 音頻上下文提供了很多屬性和方法,用于創(chuàng)建各種音頻源和音頻處理模塊等,這里只介紹一部分,更多屬性和方法可到MDN查閱文檔。

屬性

AudioContext.destination

返回 AudioDestinationNode 對(duì)象,表示當(dāng)前 AudioContext 中所有節(jié)點(diǎn)的最終節(jié)點(diǎn),一般表示音頻渲染設(shè)備。

方法

AudioContext.createBufferSource()

創(chuàng)建一個(gè) AudioBufferSourceNode 對(duì)象, 他可以通過 AudioBuffer 對(duì)象來播放和處理包含在內(nèi)的音頻數(shù)據(jù)。

AudioContext.createGain()

創(chuàng)建一個(gè) GainNode,它可以控制音頻的總音量。

AudioContext.createBiquadFilter()

創(chuàng)建一個(gè) BiquadFilterNode,它代表代表一個(gè)雙二階濾波器,可以設(shè)置幾種不同且常見濾波器類型:高通、低通、帶通等。

createOscillator()

創(chuàng)建一個(gè) OscillatorNode, 它表示一個(gè)周期性波形,基本上來說創(chuàng)造了一個(gè)音調(diào)。

音頻轉(zhuǎn)換成Buffer格式

使用decodeAudioData()方法把音頻文件編譯成buffer格式。

function decodeAudioData(audioContext, url) {
    return new Promise((resolve) => {
        let request = new XMLHttpRequest();
        request.open("GET", url, true);
        request.responseType = "arraybuffer";
        request.onload = () => {
            audioContext.decodeAudioData(request.response, (buffer) => {
                if (!buffer) {
                    alert("error decoding file data: " + url);
                    return;
                } else {
                    resolve(buffer);
                }
            })
        }
        request.onerror = function() {
            alert("BufferLoader: XHR error");
        }
        request.send();
    })
}

let buffer = decodeAudioData(audioContext, "./sounds/music.mp3");
AudioNode

音頻節(jié)點(diǎn)接口是一個(gè)音頻處理模塊。包括音頻源,音頻輸出,中間處理模塊。

方法

AudioNode.connect()

鏈接兩個(gè) AudioNode 節(jié)點(diǎn),把音頻從一個(gè) AudioNode 節(jié)點(diǎn)輸出到另一個(gè) AudioNode 節(jié)點(diǎn),形成一個(gè)音頻通道。

AudioNode.disconnect()

AudioNode 節(jié)點(diǎn)與其他節(jié)點(diǎn)斷開鏈接。

AudioBufferSourceNode

音頻源有多種,這里只介紹 buffer 的音頻源,buffer 的音頻源通過 AudioContext 接口的 createBufferSource 方法來創(chuàng)建。音頻源節(jié)點(diǎn)繼承 AudioNode 音頻節(jié)點(diǎn)。

let bufferSource = audioContext.createBufferSource();

創(chuàng)建了 AudioBufferSourceNode 對(duì)象后,把 buffer 格式的音頻數(shù)據(jù)賦值給 AudioBufferSourceNode 對(duì)象的 buffer 屬性,此時(shí)音頻已經(jīng)傳遞到音頻源,可以對(duì)音頻進(jìn)行處理或輸出。

bufferSource.buffer = buffer;
方法

AudioBufferSourceNode.start(when[, duration])

開始播放。

when:延遲播放時(shí)間,單位為秒。

offset:定位音頻到第幾秒開始播放。

duration:從開始播放結(jié)束時(shí)長,當(dāng)經(jīng)過設(shè)置秒數(shù)后自動(dòng)結(jié)束音頻播放。

AudioBufferSourceNode.stop([when])

when:延遲停止時(shí)間,單位為秒。

停止播放,注意調(diào)用該方法后,無法再次調(diào)用 AudioBufferSourceNode.start 播放。

AudioDestinationNode

音頻終點(diǎn)是通過 AudioContext 接口的 destination 屬性訪問的。音頻終點(diǎn)繼承 AudioNode 音頻節(jié)點(diǎn),

AudioDestinationNode 節(jié)點(diǎn)無法再把音頻信息傳遞給下一個(gè)音頻節(jié)點(diǎn),即無法再鏈接其他音頻節(jié)點(diǎn),因?yàn)樗呀?jīng)是終點(diǎn),沒有輸出,也可以理解為他自己就是輸出。

let audioDestinationNode = audioContext.destination;

此時(shí)我們有音頻起點(diǎn) AudioBufferSourceNode 和音頻終點(diǎn) AudioDestinationNode ,使用 AudioNode.connect() 方法把起點(diǎn)和終點(diǎn)鏈接起來,就形成了一條有輸入輸出的音頻通道,可以把音頻直接播放出來。

bufferSource.connect(audioDestinationNode);

戳我看栗子

GainNode

用于音量變化。它是一個(gè) AudioNode 類型的音頻處理模塊。

let gainNode = audioContext.createGain();

把音頻源、音頻輸出和音頻處理模塊鏈接一起,形成可控制音量大小的音頻。

bufferSource.connect(gainNode);
gainNode.connect(audioDestinationNode);

let controlVolume = value => {
    gainNode.gain.value = value);
}

// 兩倍音量播放
controlVolume(2);

戳我看栗子

BiquadFilterNode

表示一個(gè)簡單的低頻濾波器,可控制聲調(diào)。它是一個(gè) AudioNode 類型的音頻處理模塊。

let filterNode = audioContext.createBiquadFilter();

輸出一個(gè)變調(diào)的音頻:

bufferSource.connect(filterNode);
filterNode.connect(audioDestinationNode);

let controlFrequency = function(value) {
    filterNode.frequency.value = value;
}

// 音頻為1000變調(diào)
controlFrequency(1000);
多個(gè)音頻源

在一個(gè)音頻上下文中,可以有多個(gè)音頻處理通道,即多個(gè)音頻源同時(shí)輸出。各個(gè)音頻處理通道內(nèi)的操作是獨(dú)立的,不影響其他音頻通道。

戳我看栗子

多個(gè)音頻處理模塊

一個(gè)音頻源可以經(jīng)過多個(gè)音頻處理模塊處理,音頻處理模塊疊加效果后輸出。

戳我看栗子

歡迎關(guān)注:Leechikit
原文鏈接:segmentfault.com

到此本文結(jié)束,歡迎提問和指正。
寫原創(chuàng)文章不易,若本文對(duì)你有幫助,請(qǐng)點(diǎn)贊、推薦和關(guān)注作者支持。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/84772.html

相關(guān)文章

  • 那些 audio api的事 (一) AudioContext

    摘要:高動(dòng)態(tài)范圍,采用進(jìn)行內(nèi)部處理。這最大限度地減少體積驟降音頻區(qū)域之間,從而導(dǎo)致更均勻的交叉衰減,可能是在電平略有不同區(qū)域之間。低通濾波器保持較低的頻率范圍,但丟棄高頻。 引用 Getting Started with Web Audio APIhttp://www.html5rocks.com/en/tutorials/webaudio/intro/ Introduction Audio...

    沈儉 評(píng)論0 收藏0
  • 利用 web audio api 實(shí)現(xiàn)音頻可視化

    摘要:其實(shí)這個(gè)能做的事不光是音頻可視化。其實(shí)這次寫博客之前還完善了一下,給加上了通過設(shè)備的麥克風(fēng)獲取音頻并可視化的方法。世界晚安參考基于實(shí)現(xiàn)音頻可視化效果本文作者本文鏈接利用實(shí)現(xiàn)音頻可視化 音頻可視化實(shí)現(xiàn)之后真的很酷,雖然這次只是跟著MDN上的教程學(xué)習(xí)了一下,照著Demo敲了一遍而已。但收獲頗多,記錄于此。 web audio api 先來感受一下 web audio api 的基礎(chǔ)概念,下...

    PingCAP 評(píng)論0 收藏0
  • 那是我在夕陽下的奔跑:邊跑邊學(xué)習(xí)html5audio與video

    摘要:尤其是喬布斯在年發(fā)布的一篇的文章。喬布斯在里面寫下了關(guān)于的一點(diǎn)看法,說明自己為什么不使用,談到關(guān)于的一些問題,比如開放性,安全性,對(duì)于設(shè)備續(xù)航的影響,不利于觸摸屏,等等。終于,于年月日,爸爸也放棄治療了,宣布將于年正式退休。 今天為大家分享一下html5中的視頻(video)與音頻(audio)。在進(jìn)入主題之前我們先了解一下Flash與html5這兩種技術(shù)的時(shí)代背景與發(fā)展歷史。 1.前...

    gself 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<