C# 压缩/解压缩音频数据

C# 压缩/解压缩音频数据,c#,compression,waveform,C#,Compression,Waveform,我正在使用C#应用程序中的win32波形api制作voip系统。一切都进行得很顺利,但是我需要一些方法来实时压缩音频数据 所以基本上音频数据进入一个150字节大小的“记录”缓冲区,然后这个缓冲区通过udp发送,在远端,150字节被接收并放入“播放”缓冲区 因此,我需要在udp->send之前和udp->recv之后压缩/解压缩数据。普通的压缩算法不适用于音频,包括.NET GZip类 有谁知道我可以使用一个图书馆来帮助我做到这一点吗 提前感谢…您正在寻找的组件更为知名的是编码器/解码器,或者,当

我正在使用C#应用程序中的win32波形api制作voip系统。一切都进行得很顺利,但是我需要一些方法来实时压缩音频数据

所以基本上音频数据进入一个150字节大小的“记录”缓冲区,然后这个缓冲区通过udp发送,在远端,150字节被接收并放入“播放”缓冲区

因此,我需要在udp->send之前和udp->recv之后压缩/解压缩数据。普通的压缩算法不适用于音频,包括.NET GZip类

有谁知道我可以使用一个图书馆来帮助我做到这一点吗


提前感谢…

您正在寻找的组件更为知名的是编码器/解码器,或者,当选择一个组件时,有很多选择。

150字节是一个难以置信的音频数据小缓冲区,例如16 KHz单声道,不到5毫秒。我不是专家,但我认为无论您选择何种压缩方案,使用如此小的缓冲区都会大大降低您的压缩比。此外,您发送的每个数据包都有很大的开销


这就是说,如果您发送语音数据,请查看有损压缩(我发现它在压缩语音方面非常有效,但音质对音乐来说非常糟糕。)

我认为您可能希望将这些150字节的数据块进行批量处理以获得更好的压缩。
尽管如此,即使在这样小的缓冲区大小下,您仍然可以得到一些压缩


如果内置的GZipStream不起作用,您可以尝试中包含的GZipStream。DotNetZip中还有一个ZlibCodec类,它实现了编解码器模式——这可能有助于压缩150字节块

如上所述,我会调查Speex。它得到了很好的支持,现在是Flash Player的事实标准


我假设通过设置缓冲区的大小,延迟是一个问题(缓冲区越大,延迟越大),因此不要选择具有高解压帧大小的编解码器,因为它会引入高延迟。这或多或少排除了MP3。。。对于5khz输出采样率下的语音(如果提高采样率,则不会有太多用途),最小解压缩帧大小为576个采样,或发送前必须编码的约100ms数据。这意味着在您考虑问题的网络部分之前,双向延迟超过200ms。

您是否愿意冒险一次?在16khz时,您建议的缓冲区大小是多少?它被设置为150,因为skype就是这么做的(用udp嗅探器观察),虽然我会想象skype的缓冲区大于150,但在压缩后会变成150。我建议压缩前至少20-30毫秒,或者压缩前最多1KB(如果你的压缩非常好,压缩后你可能会达到150字节,但我不是专家)。更大的块直接导致更高的延迟,但20毫秒的额外延迟不是什么大问题。总之,这是压缩和块大小(=延迟)之间的折衷.你可以有很好的压缩效果,也可以有很小的块,但很难同时获得这两种效果。