摘要:編碼結(jié)束后,調(diào)用函數(shù),來銷毀和編碼器。調(diào)用函數(shù)對參數(shù)中的格式音頻數(shù)據(jù)幀進行解碼,參數(shù)中存放解碼后的音頻數(shù)據(jù)幀。調(diào)用函數(shù)來銷毀和解碼器說重點當(dāng)做即時通信產(chǎn)品,像微信這種的手機端,它們接受到很有可能就是協(xié)議壓縮后的音頻文件。
這么牛逼的輪子,肯定要美圖鎮(zhèn)樓
Speex是一套主要針對語音的開源免費,無專利保護的音頻壓縮格式。
本輪子,適用超大型項目,因為庫本身很大,當(dāng)然本身IM項目就沒有小項目吧
Speex(音標[spi:ks])是一套開源免費的、無專利保護的、針對語音設(shè)計的音頻壓縮格式。Speex項目通過以提供昂貴的專用語音編解碼器的免費替代方案為目標,來降低語音應(yīng)用程序的進入門檻。此外,Speex非常適用于互聯(lián)網(wǎng)應(yīng)用程序,并提供了其他大多數(shù)編解碼器中不存在的有用特性。最后,Speex是GNU項目的一部分,可以在修訂后的BSD許可證下使用。
編碼流程使用Speex的API函數(shù)對音頻數(shù)據(jù)進行壓縮編碼要經(jīng)過如下步驟:
定義一個SpeexBits類型變量bits和一個Speex編碼器的內(nèi)存指針變量enc。
調(diào)用speex_bits_init(&bits)函數(shù)初始化bits。
調(diào)用enc = speex_encoder_init(&speex_nb_mode)函數(shù)初始化enc。其中speex_nb_mode是SpeexMode類型的變量,表示的是窄帶模式。還有speex_wb_mode表示寬帶模式、speex_uwb_mode表示超寬帶模式。
調(diào)用函數(shù) int speex_encoder_ctl(void * state, int request, void * ptr)來設(shè)定編碼器的參數(shù),其中參數(shù)state表示編碼器的內(nèi)存指針;參數(shù)request表示要定義的參數(shù)類型,如SPEEX_GET_FRAME_SIZE表示設(shè)置幀大小,SPEEX_SET_QUALITY表示編碼的質(zhì)量等級;參數(shù)ptr表示要設(shè)定的值。
初始化完畢后,對每一幀聲音作如下處理:調(diào)用函數(shù)speex_bits_reset(&bits)重置bits,然后調(diào)用函數(shù)speex_encode(enc_state,input_frame, &bits)進行編碼,參數(shù)bits中保存編碼后的Speex格式數(shù)據(jù)幀。
編碼結(jié)束后,調(diào)用函數(shù)speex_bits_destroy(&bits),speex_encoder_destroy(enc_state)來銷毀SpeexBits和編碼器。
解碼流程對已經(jīng)編碼過的Speex格式音頻數(shù)據(jù)幀進行解碼要經(jīng)過以下步驟:
定義一個SpeexBits類型變量bits和一個Speex解碼器的內(nèi)存指針變量dec。
調(diào)用speex_bits_init(&bits) 函數(shù)初始化bits。
調(diào)用dec = speex_decoder_init(&speex_nb_mode) 函數(shù)初始化dec。
調(diào)用函數(shù)speex_decoder_ctl(void * state, int request, void * ptr)來設(shè)定解碼器的參數(shù)。
調(diào)用函數(shù) speex_decode(void * state, SpeexBits * bits, float * out)對參數(shù)bits中的Speex格式音頻數(shù)據(jù)幀進行解碼,參數(shù)out中存放解碼后的音頻數(shù)據(jù)幀。
調(diào)用函數(shù)speex_bits_destroy(&bits), speex_decoder_destroy(void * state)來銷毀SpeexBits和解碼器
說重點當(dāng)做即時通信產(chǎn)品,像微信這種的手機端,它們接受到很有可能就是speex協(xié)議壓縮后的音頻文件。當(dāng)然,文件后綴是wav或者ogg都無關(guān)緊要
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封裝,抽取了必須要的文件后進一步封裝,修改了在復(fù)雜環(huán)境下的兼容
本源碼支持環(huán)境
原生javaScript的HTML環(huán)境
MVVM框架
Electron React dva webpack的跨平臺復(fù)雜環(huán)境
特別警告:本源碼不支持AMD CMD commonJS ES6以及任何模塊化方案,只能通過script標簽引入后調(diào)用函數(shù)使用主要解決了即時通訊中的speex音頻格式文件直接在H5中播放的問題
本項目必須運行在服務(wù)器環(huán)境下 不能是本地打開index.html文件方式使用(因為用到了websocket通訊)
可以直接讓Speex格式的音頻文件在H5頁面中通過 audio標簽播放
可以在復(fù)雜的環(huán)境中,如Electron + webpack +dva + React的跨平臺中完美使用
對于頻率小于22khz的數(shù)據(jù),我們需要復(fù)制一份,模擬成22khz,因為H5只支持大于22khz的數(shù)據(jù),但是這種情況我們一般不會遇到
使用