C#播放SLIK 解决方法

C#播放SLIK 解决方法,第1张

无法直接播放,需要转码。

推荐用 silk-v3-decoder 这个库来做(github 传送门: 网页链接),先将 silk 转换成 pcm / webm,再用 ffmpeg 转换成 mp3 之类的格式。这个作者已经提供了一个编译好的 ffmpeg 版本,下载就可以用。

代码贴个我现在在用的给题主参考一下,其实就是通过 Process 类来 shell 调用。具体细节题主按自己要求改造:

需要注意的有一点,微信小程序 API 录出来的、微信 / QQ 聊天记录里导出来的,两个虽然都是 silk 文件,但其实不太一样。一个是需要 silk ->webm ->mp3 来转;一个是需要 silk ->pcm ->mp3 来转。

silk格式转换成wma,要用到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 = pcmsizememcpy(whead.Riff,"RIFF",4)memcpy(whead.Format,"WAVE",4)memcpy(whead.SubChunkID,"fmt ",4)memcpy(whead.Data,"data",4)whead.ChunkSize =whead.DataLen+44-8whead.SubChunkSize = 0x10whead.AudioFormat = 1whead.NumChannels = 1whead.SampleRate = DecControl.API_sampleRatewhead.BitsPerSample = 16whead.BlockAlign = whead.NumChannels*whead.BitsPerSample/8whead.ByteRate = whead.SampleRate*whead.BlockAlign

其中NumChannels、SampleRate和BitsPerSample等参数需要根据具体情况进行填充,否则,声音会很怪异。

在语音相关的协议还原中,经常会遇到语音编码的问题,通常语音编码的数据无法直接展示,需要转换成WAV,MP3等格式,才能播放。这个转换过程,是首先将音频编码数据使用对应解码库解码为PCM流,然后再将PCM流根据封装格式的要求,进行编码封装,最后得到可供通用播放器支持的编码和格式。

音频编码有很多,各有特色,本文首选介绍目前最流行的SILK编码。SILK编码最早在Skype中使用,它在编码效率和质量之间取得了很好的平衡,因此被广泛应用在互联网的音频相关产品中,目前广泛使用的是SILK V3。

腾讯系产品,包括QQ、微信、小程序,在语音相关的实现中,也大量使用到SILK编码,并且,部分功能是直接让未加密的语音流在网络中传输,这是协议还原很感兴趣的部分。毕竟,腾讯的产品防守相当严密,不宜突破。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/7903281.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-11
下一篇 2023-04-11

发表评论

登录后才能评论

评论列表(0条)

保存