这么牛逼的轮子,确定要美图镇楼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的数据,可是这种状况咱们通常不会遇到
使用