重磅重構開源 讓H5標籤代替C++實時解碼播放speex壓縮協議的音頻文件 【IM的福音】

這麼牛逼的輪子,確定要美圖鎮樓html

Speex是一套主要針對語音的開源免費,無專利保護的音頻壓縮格式。java

本輪子,適用超大型項目,由於庫自己很大,固然自己IM項目就沒有小項目吧webpack

  • Speex(音標[spi:ks])是一套開源免費的、無專利保護的、針對語音設計的音頻壓縮格式。Speex項目經過以提供昂貴的專用語音編解碼器的免費替代方案爲目標,來下降語音應用程序的進入門檻。此外,Speex很是適用於互聯網應用程序,並提供了其餘大多數編解碼器中不存在的有用特性。最後,Speex是GNU項目的一部分,能夠在修訂後的BSD許可證下使用。

編碼流程

  • 使用SpeexAPI函數對音頻數據進行壓縮編碼要通過以下步驟:
  • 定義一個SpeexBits類型變量bits和一個Speex編碼器的內存指針變量enc
  • 調用speex_bits_init(&bits)函數初始化bits
  • 調用enc = speex_encoder_init(&speex_nb_mode)函數初始化enc。其中speex_nb_modeSpeexMode類型的變量,表示的是窄帶模式。還有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都可有可無

  • H5audio標籤能夠播放

  • 音頻格式及瀏覽器支持

  • 目前,<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封裝,抽取了必需要的文件後進一步封裝,修改了在複雜環境下的兼容

  • 本源碼支持環境
  • 原生javaScriptHTML環境
  • 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的數據,可是這種狀況咱們通常不會遇到

  • 使用

相關文章
相關標籤/搜索