這麼牛逼的輪子,確定要美圖鎮樓html
Speex是一套主要針對語音的開源免費,無專利保護的音頻壓縮格式。java
本輪子,適用超大型項目,由於庫自己很大,固然自己
IM
項目就沒有小項目吧webpack
Speex(音標[spi:ks])
是一套開源免費的、無專利保護的、針對語音設計的音頻壓縮格式。Speex
項目經過以提供昂貴的專用語音編解碼器的免費替代方案爲目標,來下降語音應用程序的進入門檻。此外,Speex
很是適用於互聯網應用程序,並提供了其餘大多數編解碼器中不存在的有用特性。最後,Speex是GNU
項目的一部分,能夠在修訂後的BSD
許可證下使用。Speex
的API
函數對音頻數據進行壓縮編碼要通過以下步驟:SpeexBits
類型變量bits
和一個Speex
編碼器的內存指針變量enc
。speex_bits_init(&bits)
函數初始化bits
。enc = speex_encoder_init(&speex_nb_mode)
函數初始化enc
。其中speex_nb_mode
是SpeexMode
類型的變量,表示的是窄帶模式。還有speex_wb_mode
表示寬帶模式、speex_uwb_mode
表示超寬帶模式。int speex_encoder_ctl(void * state, int request, void * ptr)
來設定編碼器的參數,其中參數state表示編碼器的內存指針;參數request表示要定義的參數類型,如SPEEX_GET_FRAME_SIZE
表示設置幀大小,SPEEX_SET_QUALITY
表示編碼的質量等級;參數ptr表示要設定的值。speex_bits_reset(&bits)
重置bits
,而後調用函數speex_encode(enc_state,input_frame, &bits)
進行編碼,參數bits中保存編碼後的Speex
格式數據幀。 編碼結束後,調用函數speex_bits_destroy(&bits),speex_encoder_destroy(enc_state)
來銷燬SpeexBits
和編碼器。對已經編碼過的Speex
格式音頻數據幀進行解碼要通過如下步驟:web
定義一個SpeexBits
類型變量bits
和一個Speex
解碼器的內存指針變量dec
。瀏覽器
調用speex_bits_init(&bits)
函數初始化bits
。服務器
調用dec = speex_decoder_init(&speex_nb_mode)
函數初始化dec
。微信
調用函數speex_decoder_ctl(void * state, int request, void * ptr)
來設定解碼器的參數。websocket
調用函數 speex_decode(void * state, SpeexBits * bits, float * out)
對參數bits中的Speex
格式音頻數據幀進行解碼,參數out中存放解碼後的音頻數據幀。框架
調用函數speex_bits_destroy(&bits), speex_decoder_destroy(void * state)
來銷燬SpeexBits
和解碼器socket
說重點
speex
協議壓縮後的音頻文件。固然,文件後綴是wav
或者ogg
都可有可無H5
的audio
標籤能夠播放
音頻格式及瀏覽器支持
目前,<audio>
元素支持三種音頻格式文件: MP3, Wav, 和 Ogg:
瀏覽器 MP3 Wav Ogg
Internet Explorer 9+ YES NO NO
Chrome 6+ YES YES YES
Firefox 3.6+ NO YES YES
Safari 5+ YES YES NO
Opera 10+ NO YES YES
音頻格式的MIME
類型
Format MIME-type
MP3 audio/mpeg
Ogg audio/ogg
Wav audio/wav
speex
封裝,抽取了必需要的文件後進一步封裝,修改了在複雜環境下的兼容javaScript
的HTML
環境MVVM
框架Electron React dva webpack
的跨平臺複雜環境特別警告:本源碼不支持
AMD CMD commonJS ES6
以及任何模塊化方案,只能經過script標籤引入後調用函數使用
本項目必須運行在服務器環境下 不能是本地打開index.html文件方式使用(由於用到了websocket通信)
能夠直接讓Speex格式的音頻文件在H5頁面中經過 audio標籤播放
能夠在複雜的環境中,如Electron + webpack +dva + React
的跨平臺中完美使用
對於頻率小於22khz的數據,咱們須要複製一份,模擬成22khz,由於H5只支持大於22khz的數據,可是這種狀況咱們通常不會遇到
使用