我有一个USB调制解调器,并希望在它上发送和接收语音流,但为了达到足够的质量,我可能需要实现一些“USB”编码,因为普通的Omni56K提供太小的采样率,即使是中等质量的语音传输,它也不能通过ZyXEL工作(可能是因为即使是这个比特率太高的ZyXEL-串行转换器在它)。
这个神秘的编解码器在所有Microsoft WAV相关库中都是它理论上支持的许多编解码器之一,但我发现没有实现。
有没有人可以用任何语言或者一些文档提供一个实现?对我来说,编写一个自定义的µ法则解码算法不是问题。
谢谢。
发布于 2010-01-21 20:36:37
我不确定ADPCM与其他版本的ZyXEL有什么不同,但在一些谷歌搜索中可以找到各种不同的ADPCM实现。
然而,我这篇文章的真正原因是为什么选择ADPCM。ADPCM是一种自适应差分脉冲编码调制。这意味着传递的数据是样本之间的差异,而不是当前值(这也是为什么您会看到如此巨大的压缩)。在一个干净的环境中没有比特损失(即磁盘驱动器),这是很好的。然而,在流传输环境中,通常假设比特可能周期性地损坏。数据的任何一点损坏,你都会很快听到静态或其他音频伪像,而且通常是相当严重的。
ADPCM的复位机制不是基于帧的,这意味着音频问题可能会持续很长一段时间,具体取决于编码器。重置代码通常是一组0(我想到的是16,但我已经多年没有写过自己的端口了)。
电话环境中的ADPCM通常将12位PCM采样转换为4位ADPCM采样(还不错)。至于音频quality...not不利于电话交谈和说话,但大多数人,在盲目测试中,可以很容易地检测到质量下降。
在你的最后一句话中,你在问题中抛出了一个曲线球。你开始提到muLaw。muLaw是一种PCM实现,它采用12位采样,并使用对数刻度将其转换为8位采样。这是北美时分多路复用(电话)网络的典型压缩机制(世界上大多数其他地区使用类似的称为ALaw的算法)。
所以,我搞不懂你到底想找什么。
您还提到了Microsft和WAV的实现。您可能知道,但以防万一,WAV只是音频数据的包装器,它提供格式、采样信息、通道、大小和其他有用的信息。在不涉及WAV、AU或其他包装器的情况下,muLaw和ADPCM通常以原始数据的形式呈现。
如果您正在实现ADPCM,还有一个技巧。正如我所指出的,它们使用4位来表示12位样本。他们通过双方都有一个乘法器表而逃脱了这一点。您在表中的位置将根据4位值进行更改(换句话说,该值既是步长的倍数,又用于计算新的步长)。我见过各种算法使用略有不同的表(不知道为什么,但您通常会看到发送和接收的信号慢慢偏离偏差)。其中一个较老的、流行的声音包与我通常从电话硬件供应商那里看到的不同。
而且,对于更多无用的琐事,有多种风格的ADPCM。方差涉及表、源样本大小和目标样本大小,但我从来没有使用它们的需要。当我在互联网上搜索电话中使用的各种音频格式的规范时,我发现了一些有文档记录的风格。
发布于 2010-01-21 20:42:18
通过ffmpeg -f u16le -i - -f wav -acodec adpcm_ms -传输您的pcm可能会起作用。
http://ffmpeg.org/
https://stackoverflow.com/questions/2103593
复制相似问题