摘要:編碼結束后,調用函數,來銷毀和編碼器。調用函數對參數中的格式音頻數據幀進行解碼,參數中存放解碼后的音頻數據幀。調用函數來銷毀和解碼器說重點當做即時通信產品,像微信這種的手機端,它們接受到很有可能就是協議壓縮后的音頻文件。
這么牛逼的輪子,肯定要美圖鎮樓
Speex是一套主要針對語音的開源免費,無專利保護的音頻壓縮格式。
本輪子,適用超大型項目,因為庫本身很大,當然本身IM項目就沒有小項目吧
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格式音頻數據幀進行解碼要經過以下步驟:
定義一個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)來設定解碼器的參數。
調用函數 speex_decode(void * state, SpeexBits * bits, float * out)對參數bits中的Speex格式音頻數據幀進行解碼,參數out中存放解碼后的音頻數據幀。
調用函數speex_bits_destroy(&bits), speex_decoder_destroy(void * state)來銷毀SpeexBits和解碼器
說重點當做即時通信產品,像微信這種的手機端,它們接受到很有可能就是speex協議壓縮后的音頻文件。當然,文件后綴是wav或者ogg都無關緊要
H5的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標簽引入后調用函數使用主要解決了即時通訊中的speex音頻格式文件直接在H5中播放的問題
本項目必須運行在服務器環境下 不能是本地打開index.html文件方式使用(因為用到了websocket通訊)
可以直接讓Speex格式的音頻文件在H5頁面中通過 audio標簽播放
可以在復雜的環境中,如Electron + webpack +dva + React的跨平臺中完美使用
對于頻率小于22khz的數據,我們需要復制一份,模擬成22khz,因為H5只支持大于22khz的數據,但是這種情況我們一般不會遇到
使用