聲音轉base64https://zhuanlan.zhihu.com/p/139023181


使用Base-64實現純文本網頁音頻傳輸|網頁前端|音頻開發|

 

並不是什么高新技術,僅作學習整理。

前言——windows與macos系統GM Synth的不同點

起因源於本人太閑,開發了一個網頁端練耳app,還能借此重新復習下以前學過的JavaScript。

在HTML5,w3c就提供了非常厲害的Web Audio API,可以獨立實現32浮點音頻計算、Summing、內置iir濾波器、混響器、音頻動態處理算法、OSC等,與此同時它還有個兄弟——Web MIDI API, 用來實現web中與電腦本地midi設備的互通。(bandlab開發的網頁DAW就是用HTML5的Web Audio API和Web MIDI API寫的,此外也有很多用其開發的網頁DAW)

在實現上面app時,就有了這種需求——通過Web MIDI API連接系統自帶的GM Synth,點擊音高便可以發出相應MIDI信息,來發出音高。

這個在Windows系統上可以實現,因為windows自帶的GM Synth是作為一個MIDI port,使用Web MIDI API連接到這個port,發送相應音符信息就可以發出音高,還可以發出音色庫信息來改變音色,使用gm中128個音色。

但是MacOS系統不同,MacOS系統自帶的GM Synth是作為一個AU插件存在,插件名字是DLSMusicDevice,任何軟件想要使用自帶的GM Synth時都可以調用它,好處是可以在DAW中直接加載。但這也意味着,與Web無緣了,因為Web Audio API並不能加載AU/VST插件。

如果要實現我的需求,是不是就只能生成好每個音色的音頻文件,上傳到服務器呢?

這樣做無非是效率極低的,首先,音頻文件要占用大量帶寬,對於服務器來說,一丁點帶寬都是寶貴的,除非進行良好的壓縮;也要占用文件系統的空間,除非進行良好的壓縮;對於終端,每點擊一次,瀏覽器就要向服務器申請一次音頻下載,效率極低。於是我就在尋找mac下能實現類似windows gm synth的方法,最后沒找到,還是得從服務器端上傳音頻文件解決問題。

HTML5中,Audio標簽有個非常牛逼的功能,Audio標簽的src屬性在指定播放音頻的來源時,不僅可以指向服務器任何一個音頻文件,也可以直接放入一串Base64代碼,Audio標簽會實時解析Base64代碼,生成一個文件,並且按照設置的格式播放。

我們可以只使用js+HTML,在一個文件中實現純文本儲存、傳輸多個音頻文件。

我只要給每個音色建立一個js文件,里面放入每個音色中部分音高音頻的Base64文本,放入的音高不用把全音域放進去,只需要每隔2~4度放入一個音高,每兩個音高之間的音使用Web Audio API來實現升降調,產生之間的其它音,節省空間。

<audio controls="controls" autobuffer="autobuffer" autoplay="autoplay"> <source src="data:audio/mpeg;base64,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" /> </audio>

上面這串代碼,src屬性中就是一個鈴聲.mp3轉成base64后的結果,上面這串代碼直接打開就可以播放,不需要聯網,因為已經相當於把mp3“嵌入”到代碼里了。

這種開發方式,實際上肯定沒有直接放音頻來的方便快捷,但可以實現“純代碼”音頻。

從音頻制作到生成Base64

  1. 生成一個wav音頻

我從logic中導出了一個斯坦威大鋼琴C4音的16bit wav

2. 進行壓縮

由於是web端,帶寬及其珍貴,我們得盡量減少帶寬使用

我使用Adobe Audition進行處理:

導入音頻,變換采樣率,16kHz以上都是不必要的,所以直接把采樣率改成32kHz,位深度不需要改變,16bit就可以,8bit的量化噪音太大。

並且導出為壓縮率比較高的mp3

這時的文件就非常小了,只有20多KB。

3. 轉換成base64

我使用的是js,所以我用js代碼來實現轉換

<input type="file" id="fileInput"> <script> var fileInput = document.querySelector('#fileInput'); fileInpt.onchange = function () { var file = this.files[0]; var reader = new FileReader(); reader.readAsDataURL(file); reader.onload = function () { console.log(reader.result); }; }; </script> //此代碼可以實現input按鈕加載本地文件,並在console直接輸出base64編碼 //來源於http://www.imooc.com/wenda/detail/458679

記住,千萬不要在vs code這類軟件里打開mp3,用其中的base64擴展轉換成base64。 因為mp3文件本身並不是文本信息,vs code這類字編輯軟件會用unicode等字體編碼來打開mp3文件,最后進行的轉換是unicode亂碼轉成base64的結果,並不是mp3轉成base64的結果。所以請一定要注意。

輸出結果是這樣的:

紅框告知數據類型,這樣audio解碼base64后就知道音頻格式,就可以正確播放;綠框告知這是base64編碼,audio讀到這里也會知道使用的是base64而不是其他;綠框后面逗號之后的部分就是完整的base64編碼了。如果你的編碼沒有紅框綠框的部分,請自己加上。mp3使用 audio/mpeg,wav使用audio/wav,還可以支持非常非常多格式,其他格式可以上網查找(這里有  )。紅框綠框之間用英文分號分割,綠框與base64數據之間用逗號分隔。

這樣就可以直接復制到audio標簽的src屬性中了。

我們可以根據不同樂器構建多個js文件,其中存放該樂器一部分音高的base64等信息。設計一個播放器.js,根據當前加載的樂器.js實現音高播放,播放器.js中使用web audio api來實現音高變調,這樣填充相鄰音高之間的音符,節省樂器.js的空間(實際的樂器.js只需要幾百KB);然后在網頁中設計、插入可以更換樂器的.js,更換樂器.js實現實時將所更換的樂器.js名稱傳入播放器.js中,來達到切換音色。這是最終的目的,如果需求沒有這樣復雜,直接在服務器用多個mp3分好文件夾和名字就可以了,mp3本身夠小了,base64會大個10kb左右。

已經有大佬這么做了,這是一個github上叫WebAudioFont的項目,作者就是使用這種方法邏輯,來實現網頁樂器。網頁所占的空間出乎意料的小(大多不超過1m,取決於樂器音域大不大),可以演奏不同樂器的音。

這個項目把所有gm音色128個樂器都弄出來了,純js+HTML,沒有任何音頻文件,都是base64加樂器.js的模式,有需要的可以直接套用。

這樣的邏輯讓js顯得更像一個“樂器”,而不是簡單的音頻調用。

網頁示例,點擊不同琴鍵可以發出不同的音高

上圖是播放器.js部分內容,作者還實現了ADSR調整功能、混響和濾波器等功能,並且在html界面中可以實現根據用戶的調整實時傳入樂器.js參數,更改樂器:

 

上圖是樂器.js,file 屬性儲存的是各個音頻的base64,還有相應的音高信息、采樣率信息等等。儲存了鋼片琴8個音高,實現播放25個音(2個八度),只有小小的147KB。

(作者使用開源的sf2音色庫提取出的音頻,和web audio api寫的合成器來制作所有樂器,見項目readme)

不錯的開發方式

對於網頁音樂應用開發來說,這種方式貌似很實用,可以自己搭建一個樂器.js庫,供自己隨時調用。一部分可以節約一些帶寬(貌似偽命題,追求音質的話大壓縮肯定不能進行,那樣文件照樣大,base64也會更大些;唯一可以節省的是瀏覽器的文件詢問次數),一部分也可以讓用戶無法直接獲取到音頻,相當於上了一層加密,用戶就不能直接攔截xxx.wav yyy.mp3的地址進行下載了。但是對於前端經驗豐富的程序員什么的來說還是沒用的(((

這種方式恰好的解決了我的需求,在此做學習整理,不是什么高深也不是罕見的東西,希望能學習到更多網頁音頻開發方式。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM