前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >重磅重构开源 让H5标签代替C++实时解码播放speex压缩协议的音频文件 【IM的福音】

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

作者头像
Peter谭金杰
发布2019-08-02 16:30:04
1.5K0
发布2019-08-02 16:30:04
举报

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

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的福报,马老师

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 编码流程
  • 解码流程
  • 当做即时通信产品,像微信这种的手机端,它们接受到很有可能就是speex协议压缩后的音频文件。当然,文件后缀是wav或者ogg都无关紧要
  • 本开源库基于speex封装,抽取了必须要的文件后进一步封装,修改了在复杂环境下的兼容
  • 主要解决了即时通讯中的speex音频格式文件直接在H5中播放的问题
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档