重磅重构开源 让H5标签替代C++及时解码播放speex紧缩协定的音频文件 【IM的福音】

《重磅重构开源 让H5标签替代C++及时解码播放speex紧缩协定的音频文件 【IM的福音】》

这么牛逼的轮子,肯定要美图镇楼

Speex是一套重要针对语音的开源免费,无专利庇护的音频紧缩花样。

本轮子,实用超大型项目,由于库自身很大,固然自身
IM项目就没有小项目吧

  • 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花样音频数据帧举行解码要经由以下步骤:
  • 定义一个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都可有可无

  • 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的数据,然则这类状况我们平常不会碰到
  • 运用<script>标签引入源码
  • 假如你的运用体式格局是直接在页面中 <audio src=”./test.ogg”>,那末请你在引入源码后,立即在全局JS代码顶部挪用函数 initAudio()
  • 假如你的运用体式格局是动态增加audio标签,或许动态修正audio标签的src属性,那末请你每次修正src属性后挪用函数initAudio(),否则是不能够播放speex花样的音频文件的
  • speex花样音频文件,后缀多是ogg的,然则任然能够播放(speex只是一个开源免费紧缩协定)
  • 本项目不支撑任何模块化 制止在框架中经由过程 import或许require导入 ,由于源码中触及8进制的代码,严厉形式下是不能够运用八进制的
  • MVVM框架和原生的JS运用方法都是经由过程script引入,全局挪用initAudio函数

迎接
github提交
issue,这个轮子是经由整合他人代码后优化,后期会继承优化。
github堆栈地点

npm i speex-in-h5也能够下载,然则本项目不支撑任何模块化计划,请手动引入
index文件,堆栈中有
Demo

途经点赞,
6天6次要9 ———
996的福报,马先生

    原文作者:Peter谭金杰
    原文地址: https://segmentfault.com/a/1190000019401511
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞