HTML5 音頻 API Web Audio

2021-12-25 SegmentFault思否

此文介紹HTML5音頻API的主要框架和工作流程,因為音頻處理模塊很多,因此只簡單介紹幾種音頻處理模塊,並通過例子來展示效果。後續會介紹利用HTML5音頻API實現的項目,歡迎大家關注,敬請期待。

HTML5音頻API的主要框架和工作流程如下圖,在 AudioContext 音頻上下文中,把音頻文件轉成 buffer格式,從音頻源 source 開始,經過 AuidoNode 處理音頻,最後到達 destination 輸出音樂。這裡形成了一個音頻通道,每個模塊通過 connect 方法連結並傳送音頻。

AudioContext

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

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

AudioContext 音頻上下文提供了很多屬性和方法,用於創建各種音頻源和音頻處理模塊等,這裡只介紹一部分,更多屬性和方法可到MDN(https://developer.mozilla.org/zh-CN/docs/Web/API/AudioContext)查閱文檔。

屬性

AudioContext.destination

返回 AudioDestinationNode 對象,表示當前 AudioContext 中所有節點的最終節點,一般表示音頻渲染設備。

方法

AudioContext.createBufferSource()

創建一個 AudioBufferSourceNode 對象, 他可以通過 AudioBuffer 對象來播放和處理包含在內的音頻數據。

AudioContext.createGain()

創建一個 GainNode,它可以控制音頻的總音量。

AudioContext.createBiquadFilter()

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

createOscillator()

創建一個 OscillatorNode, 它表示一個周期性波形,基本上來說創造了一個音調。

音頻轉換成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

音頻節點接口是一個音頻處理模塊。包括音頻源,音頻輸出,中間處理模塊。

方法

AudioNode.connect()

連結兩個 AudioNode 節點,把音頻從一個 AudioNode 節點輸出到另一個 AudioNode 節點,形成一個音頻通道。

AudioNode.disconnect()

把 AudioNode 節點與其他節點斷開連結。

AudioBufferSourceNode

音頻源有多種,這裡只介紹 buffer 的音頻源, buffer 的音頻源通過 AudioContext 接口的 createBufferSource 方法來創建。音頻源節點繼承 AudioNode 音頻節點。

let bufferSource = audioContext.createBufferSource();

創建了 AudioBufferSourceNode 對象後,把 buffer 格式的音頻數據賦值給 AudioBufferSourceNode 對象的 buffer 屬性,此時音頻已經傳遞到音頻源,可以對音頻進行處理或輸出。

bufferSource.buffer = buffer;

方法

AudioBufferSourceNode.start([when][, offset][, duration])

開始播放。

AudioBufferSourceNode.stop([when])

停止播放,注意調用該方法後,無法再次調用 AudioBufferSourceNode.start 播放。

AudioDestinationNode

音頻終點是通過 AudioContext 接口的 destination 屬性訪問的。音頻終點繼承 AudioNode 音頻節點,

AudioDestinationNode 節點無法再把音頻信息傳遞給下一個音頻節點,即無法再連結其他音頻節點,因為他已經是終點,沒有輸出,也可以理解為他自己就是輸出。

let audioDestinationNode = audioContext.destination;

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

bufferSource.connect(audioDestinationNode);

戳我看慄子

GainNode

用於音量變化。它是一個 AudioNode 類型的音頻處理模塊。

let gainNode = audioContext.createGain();

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

bufferSource.connect(gainNode);

gainNode.connect(audioDestinationNode);

let controlVolume = value => {

   gainNode.gain.value = value);

}

// 兩倍音量播放

controlVolume(2);

戳我看慄子

BiquadFilterNode

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

let filterNode = audioContext.createBiquadFilter();

輸出一個變調的音頻:

bufferSource.connect(filterNode);

filterNode.connect(audioDestinationNode);

let controlFrequency = function(value) {

   filterNode.frequency.value = value;

}

// 音頻為1000變調

controlFrequency(1000);

多個音頻源

在一個音頻上下文中,可以有多個音頻處理通道,即多個音頻源同時輸出。各個音頻處理通道內的操作是獨立的,不影響其他音頻通道。

戳我看慄子

多個音頻處理模塊

一個音頻源可以經過多個音頻處理模塊處理,音頻處理模塊疊加效果後輸出。

戳我看慄子:

https://codepen.io/leechikit/pen/Nvpwrq

歡迎關注:

Leechikit (https://segmentfault.com/u/leechikit/articles)

原文連結:

https://segmentfault.com/a/1190000010561222

到此本文結束,歡迎提問和指正。寫原創文章不易,若本文對你有幫助,請點讚、推薦和關注作者支持。

相關文章推薦

HTML5拖放API Drag and Drop

mui初級入門教程(一)— 小白入手mui的學習路線 html5+ App開發工程化實踐之路

相關講堂推薦

html5+ App開發工程化實踐之路

html5+ App開發之 Android 平臺離線集成 5+ SDK

相關焦點

  • Web Audio API介紹和web音頻應用案例分析
  • 拿例子說話:HTML 5 Audio標籤使用技巧
    【IT168技術】人類的世界充滿著聲音,現在隨著HTML5的越來越流行,web開發者開始發現,在HTML5的世界中,聲音的使用變得更加簡單和豐富,只需要使用標籤,就可以在頁面中嵌入音頻了。
  • 如何使用 MediaStream API 錄製音頻!
    我們傳遞給它一個只有鍵值為audio和值為true的對象,因為我們只是在錄製音頻。這就是瀏覽器提示用戶允許網站訪問麥克風的地方。如果用戶允許,程序中的代碼將被執行。在public/index.html中的</body>標籤結束前添加以下內容。
  • HTML5 向網頁嵌入視頻和音頻
    來源 | http://www.fly63.com/article/detial/9503現在很多網站上都會使用到視頻和音頻,html5 中提供了展示視頻和音頻的標籤
  • 4、HTML5 新 增 元 素
    關於HTML5你知道多少?
  • 理解 iOS Core Audio 音頻概念
    本文講述了 iOS Core Audio 中常用的音頻概念定義,然後介紹一些容易造成概念混淆的場景以及一個實踐 demo 案例,最後解答一些常見的問題。(一) iOS Core Audio 音頻概念定義討論 iOS Core Audio,就要按照蘋果的定義對音頻相關概念進行理解。
  • 一個Chrome插件開發項目(Web Audio API)的心得
    但是這樣實際上只是又增加了一路音頻,在Windows平臺上對方能夠聽到兩路(原始音頻和降噪後音頻)疊加的聲音,但是在ChromeBook和Mac OS等平臺上就只能聽到原始音頻。準備放棄之際,客戶提供了一個日本公司的插件,說是能實現期望的效果,雖然是uglify的,但也勉強能看懂部分代碼,一堆折騰之後是體驗到了思維的「變態」之處。
  • HTML5 地理定位+地圖 API:計算用戶到商家的距離
    最近在做一個類似支付寶口碑商家的功能模塊,其中有個功能就是計算出用戶與商家的距離,如下圖:3、將商家經緯度從資料庫取出與當前用戶經緯度進行計算;注意:移動webDOCTYPE html><html><head>    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />    <meta name="viewport" content="initial-scale=1.0, user-scalable
  • HTML5 Web 存儲使用詳解
    insert":{"name":"core/quote"}},"core/pullquote":{"time":1605667222203,"count":1,"insert":{"name":"core/pullquote"}},"core/group":{"time":1611649818501,"count":15,"insert":{"name":"core/group"}},"core/html
  • HTML5 入門教程
    html5 引入了很多先進的功能,可以使設計人員/開發人員和用戶輕鬆交互。html5 允許用戶直接播放視頻和音頻文件。html5 允許用戶在畫布上繪畫。html5 可以幫助用戶設計更好的表單並構建可脫機工作的Web應用程式。html5 為用戶提供了通常需要編寫JavaScript才能完成的高級功能。
  • Android 音頻系統:從 AudioTrack 到 AudioFlinger
    /reference/android/media/AudioTrack.html2.2.首先要了解音頻領域中,幀(frame)的概念:幀表示一個完整的聲音單元,所謂的聲音單元是指一個採樣樣本;如果是雙聲道,那麼一個完整的聲音單元就是 2 個樣本,如果是 5.1 聲道,那麼一個完整的聲音單元就是 6 個樣本了。幀的大小(一個完整的聲音單元的數據量)等於聲道數乘以採樣深度,即 frameSize = channelCount * bytesPerSample。
  • Web前端教程-HTML及標籤的使用
    DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>網頁標題</title> </head> <body> 網頁顯示內容 </body> </html>2.
  • 關於 HTML5 你需要了解的基礎知識
    圖6:Canvas 的輸出音頻對於音頻,情況類似於視頻。在 HTML5 發布之前,在網頁上播放音頻沒有統一的標準。大多數音頻也通過 Flash 等不同的插件播放。但 HTML5 規定了通過使用音頻元素在網頁上播放音頻的標準方式。音頻元素用於播放聲音文件和音頻流。目前,HTML5 audio 元素支持三種音頻格式,如表 3 所示。audio 元素的使用如下所示:<!
  • 萌新的HTML5 入門指南
    只要html頁面第一行是 <!DOCTYPE html> 瀏覽器就會按照HTML5標準去解析網頁,無論頁面中是否使用了HTML5新增內容HTML5新增了哪些內容?• 更好的語義化標籤結構元素:article、aside、header、hgroup、footer、figure、section、nav。
  • 10個鮮為人知但很實用的Web API
    在 Web API 中,有非常有用的對象、屬性和函數可用於執行小到訪問 DOM 這樣的小任務,大到處理音頻、視頻、圖形這樣的複雜任務。如果你有 Web 開發背景,那麼你已經在使用其中的許多工具了。下面是一些非常著名的 Web API。
  • 學習HTML基礎
    HTML版本及標籤語法W3C: world wide web consortium,全球資訊網聯盟。專門發布和維護網際網路的規範和標準。<img src="http://img3.imgtn.bdimg.com/it/u=1084243323,278941980&fm=26&gp=0.jpg" />音頻視頻標籤音頻使用<audio>標籤進行定義。 <audio>是雙標籤。
  • 84.AudioManager 音頻播放功能
    播放音頻功能AudioManager,字如其意就是音效管理。在 Unity 中我們需要用到的音效 API 有,AudioClip 、AudioSource、AudioListener。相信大家對它們已經很熟悉了。我們還是以實際的問題去出發去完成這個 AudioManager。既然是音效管理,那麼它肯定要有音頻播放的功能。
  • 用 Python 將音頻內容轉換為文本格式
    上傳、啟動和轉錄音頻我們已完成開始構建應用程式所需的一切,該應用程式會將音頻轉換為文本。我們將在三個文件中構建此應用程式:1、upload_audio_file.py:將您的音頻文件上傳到AssemblyAI服務上的安全位置,以便可以進行處理。