silk 编解码_SILK编码语音转WAV格式
“SILK音频编码格式介绍、WAV文件封装格式介绍以及SILK音频编码到WAV的转换。”
在语音相关的协议还原中,经常会遇到语音编码的问题,通常语音编码的数据无法直接展示,需要转换成WAV,MP3等格式,才能播放。这个转换过程,是首先将音频编码数据使用对应解码库解码为PCM流,然后再将PCM流根据封装格式的要求,进行编码封装,最后得到可供通用播放器支持的编码和格式。
音频编码有很多,各有特色,本文首选介绍目前最流行的SILK编码。
SILK编码最早在Skype中使用,它在编码效率和质量之间取得了很好的平衡,因此被广泛应用在互联网的音频相关产品中,目前广泛使用的是SILK V3。
腾讯系产品,包括QQ、微信、小程序,在语音相关的实现中,也大量使用到SILK编码,并且,部分功能是直接让未加密的语音流在网络中传输,这是协议还原很感兴趣的部分。毕竟,腾讯的产品防守相当严密,不宜突破。
WAV作为古老的音频文件格式,虽然有很多缺点,但使用仍然相当广泛,本文将对其关键点进行介绍,SILK编码音频文件解码并封装为WAV格式的方法。
01
—
SILK编码
SILK采样率可为8、12、16或24 kHz,比特率可为6至40 kbit/s。对应到报文层面的直观印象,即SILK编码的语音数据每帧长度是不等的。
SILK编码已经开源,目前可下载到的版本为V1.0.9,它是Opus编码的基础。因此可以在Opus编码的源文件中找到SILK编码的实现代码,下载地址如下:
http://www.opus-codec.org/release/stable/2017/06/26/libopus-1_2_1.html
当然,其它地方也能很容易找到SILK编码的实现,比如GitHub上:
当前经常遇到的SILK V3的编码就是SILK编码,在SILK的V1.0.9版SDK中的编码就是SILK V3编码,另外SILK库版本差异对语音解码基本可以忽略。如果各位朋友需要下载SILK编码库,可关注本公众号后发送关键词“silk”获取。
SILK编码库的功能是提供接口将SILK格式音频数据解码为PCM流以及将PCM流编码为SILk格式。在库内提供了编解码的例子,很容易懂。
02
—
WAV封装格式
语音编码后,如果一个软件不支持该编码,则语音是无法解码的,因此,语音数据的播放,首先需要的是将编码数据解码。如上一部分中的SILK编码库,就是用来将语音的原始PCM数据编码为SILK编码数据,以及将SILK编码数据解码为PCM数据流的。
各类通用的音视频播放器,对一个编码的支持,首先是根据文件名称后缀或者文件的内容进行封装格式识别,再根据封装格式中对编码的描述来进行编码的识别,如果编码被识别,并且集成了该编码库,则该编码的语音数据就可以被播放,也就是被支持了。
在当前技术发展阶段,对音频播放器而言,WAV格式和MP3格式是最基本的封装格式,基本上都会被支持,WAV格式支持原始的音频流即PCM流,这是最简单的格式,只需要将所有语音编码数据解码保存,然后在文件头部加上WAV格式结构体,即可进行封装。
当然,WAV格式缺点明显,其数据相当于未压缩,体积很大。
WAV格式头共44字节,定义及描述如下:struct WAVHeader { char Riff[4]; uint32 ChunkSize; char Format[4]; char SubChunkID[4]; uint32 SubChunkSize; uint16 AudioFormat; uint16 NumChannels; uint32 SampleRate; uint32 ByteRate; uint16 BlockAlign; uint16 BitsPerSample; char Data[4]; uint32 DataLen; };Riff:4字节,固定值“RIFF”。ChunkSize:4字节,整个文件不包含Riff及ChunkSize的8字节。Format:4字节,固定值“WAVE”。SubChunkID:4字节,固定值“fmt ”,注意最后1字节为空格0x20。SubChunkSize:4字节,对应WAV,值为0x10。AudioFormat:2字节,格式类型,线性PCM则值为1,其它值则为压缩的编码格式,如0x06为PCMA,0x07为PCMU。NumChannels:2字节,声道数,1或者2。SampleRate:4字节,采样频率,如11025,44100等。ByteRate:4字节,码率=采样频率*PCM采样位深/8*声道数。BlockAlign:2字节,采样一次占内存的长度=声道数*PCM采样位深/8。BitsPerSample:2字节,PCM采样位深,如8、16。Data:4字节,固定值“data”。DataLen:4字节,PCM数据总长度。
一个典型的WAV头部数据如下:
03
—
SILK V3转换到WAV
SILK编码到WAV的转换,当然要用到SILK编码库,供下载的SILK编码库内,提供了4个不同的平台版本,功能基本相同。
在SILK编码库的SDK内,test目录下,有一个Decoder.c文件,是解码的示例文件,编译后它能够直接解码如下格式的SILK音频文件:
如上图所示,SILK文件格式以"#!SILK_V3"开始,之后就是一帧帧的语音内容块,每帧的帧长占两字节,然后为帧内容,这是因为SILk编码是变长编码,每帧的长度是不同的。
在各个test_vectors\bitstream目录下的.bit文件,即为SILK格式文件,可以被解码程序Decoder.c支持。
解码程序将SILK文件解码为PCM流文件,但缺少WAV头,无法直接用播放器播放。
如果需要使解码后的PCM流能够播放,则需要PCM流前面添加WAV头。对微信语音短消息,WAV头赋值如下(pcmsize为PCM流的字节数):whead.DataLen = pcmsize;
memcpy(whead.Riff,"RIFF",4);
memcpy(whead.Format,"WAVE",4);
memcpy(whead.SubChunkID,"fmt ",4);
memcpy(whead.Data,"data",4);
whead.ChunkSize =whead.DataLen+44-8;
whead.SubChunkSize = 0x10;
whead.AudioFormat = 1;
whead.NumChannels = 1;
whead.SampleRate = DecControl.API_sampleRate;
whead.BitsPerSample = 16;
whead.BlockAlign = whead.NumChannels*whead.BitsPerSample/8;
whead.ByteRate = whead.SampleRate*whead.BlockAlign;
其中NumChannels、SampleRate和BitsPerSample等参数需要根据具体情况进行填充,否则,声音会很怪异。
对SILK编码转换为WAV语音文件,如果有疑惑,可以咨询我。
长按进行关注。
silk 编解码_SILK编码语音转WAV格式相关推荐
- silk 编解码_Silk编解码在android实现
Silk编解码是Skype向第三方开发人员和硬件制造商提供免版税认证(RF)的Silk宽带音频编码器.Skype已将其开源,可以访问http://developer.skype.com/silk获取最 ...
- silk 编解码_Silk解码 开发日志
标签: 本人用的是SILK_SDK_SRC_v1.0.9进行开发.开发过程是曲折的,结果自然也是丰盛的. SDK是从github下载的,由于这个已被整合到一个Android项目,但是文件目录结构尚完整 ...
- silk 编解码_silk音频编解码C++类
/*silkcodec 头文件 */ /* * QQ: 617242746 * Developer: yu * Time: 2013.4.16 */ #ifndef _SILKCODEC_H_ #de ...
- 音视频开发入门(3):视频编解码之编码基础
前言 即时通讯应用中的实时音视频技术,几乎是IM开发中的最后一道高墙.原因在于:实时音视频技术 = 音视频处理技术 + 网络传输技术 的横向技术应用集合体,而公共互联网不是为了实时通信设计的.有关实时 ...
- 视音频编解码学习工程:TS封装格式分析器
===================================================== 视音频编解码学习工程系列文章列表: 视音频编解码学习工程:H.264分析器 视音频编解码学习 ...
- 视音频编解码学习工程:FLV封装格式分析器
===================================================== 视音频编解码学习工程系列文章列表: 视音频编解码学习工程:H.264分析器 视音频编解码学习 ...
- 即时通讯音视频开发(三):视频编解码之编码基础
前言 即时通讯应用中的实时音视频技术,几乎是IM开发中的最后一道高墙.原因在于:实时音视频技术 = 音视频处理技术 + 网络传输技术 的横向技术应用集合体,而公共互联网不是为了实时通信设计的. 系列文 ...
- 视频编解码的编码结构
初识编码结构 全帧内编码结构(AI) 低延迟编码结构(LP) 随机接入编码结构(RA) GOP(Group of picture) 首先根据参考软件中的cfg可知,我以VTM6.0为例共有4个配置文件 ...
- gold matlab 编解码_JPEG编码解码(Matlab)
搜索了网上的JPEG的matlab实现方式,发现只有寥寥几个,几乎都是只实现了一半,要么就是哈夫曼编码没有实现,要么就是只算出了哈夫曼的码长计算了一下效率,但是没有实际编码.要么就是太难我看不懂(汗. ...
最新文章
- asp css怎么写?_一次完整的asp.netmvc页面优化过程
- 关于request.setAttribute多页传值,多页取值
- 互联网男士穿搭推荐-2020年新版
- The FLARE On Challenge
- 叨叨20220304
- Android 手机app缓存清理实现
- NI VISION视觉安装
- Excel2007文件XML
- XMU毕业生总结写paper常用网站
- wps 写论文时 参考文献的横线怎么消除
- 从实验室跃进产业,腾讯AI是如何向to B进化的?
- myApps常用脚本API(一)
- SVN提交更新飞书群通知 (飞书机器人)
- 单片机c语言 〉〉,PìC单片机C语言编程入门(课件).doc
- 前端无法反序列化START\u数组标记-JSONCannot deserialize instance of `java.lang.String` out of START_ARRAY toke
- html让下拉框自动选择,html下拉框设置连接 html怎么设置下拉列表必须选择
- MAC下连接Windows的远程桌面Microsoft Remote Desktop
- 【CodeForces 】 400D(并差集+Floyd最短路)
- 奈奎斯特与香农定理_奈奎斯特定理和香农定理
- mysql的事务隔离级别与锁的关系、sql日志、Spring事务的特性
热门文章
- 利用递归查询部门表,以树(tree)的结构展示返回给前端出来,一般都要有这种需求的
- github windows系统监控_你需要的:Windows | 精品软件集
- java easing_[译] 动画中缓动(easing)的基础知识
- PHPUnit袖珍指南 第六章 装置器
- 广州天象网络技术有限公司分享在北上广月薪没过万是种怎样的体验
- 微信小程序分享功能(微信好友,朋友圈)
- 2018年物联网发展的八大趋势!
- Unity游戏开发前置知识
- 安卓手机上最好的3个epub阅读器
- 终端文本编辑神器--Vim命令详解。如何配置使用Vim、Vim插件?