我在C#应用程序中使用win32波形api来制作一个voip系统。一切顺利,但我需要一些方法来动态压缩音频数据。
所以基本上音频数据进入大小为150字节的“记录”缓冲区,然后通过udp发送此缓冲区,在远端,接收150个字节并将其放入“播放”缓冲区。
所以我需要一些在udp->发送之前和udp-> recv之后压缩/解压缩数据的方法。普通压缩算法不适用于音频,包括.NET GZip类。
有没有人知道我可以使用哪个库来帮助我这样做?
提前感谢...
答案 0 :(得分:1)
150字节是用于音频数据的难以置信的小缓冲器 - 例如小于5毫秒。 16 KHz单声道。我不是专家,但我认为无论你选择哪种压缩方案,你的压缩比都会因使用这么小的缓冲区而受到很大影响。除此之外,您发送的每个数据包都会产生大量开销。
也就是说,如果您要发送语音数据,请查看Speex进行有损压缩(我发现它在压缩语音方面非常有效,但音质对音乐来说非常糟糕。)
答案 1 :(得分:1)
我认为您想要批量处理这些150字节的块以获得更好的压缩效果 虽然,即使在这样的小缓冲区大小,你仍然可以得到一些压缩。
如果内置GZipStream不起作用,您可以尝试DotNetZip中包含的GZipStream。在DotNetZip中还有一个ZlibCodec类可以实现Codec模式 - 这可以促进150字节块的压缩。
答案 2 :(得分:0)
您正在寻找的组件更为人熟知的是编码器/解码器,或codec,并且在选择组件时有很多选择。
答案 3 :(得分:0)
如上所述,我会研究Speex。它得到了很好的支持,现在是Flash Player的事实标准。
我假设你设置缓冲区的大小是延迟是个问题(缓冲区越大,延迟越大),所以不要选择具有高解压缩帧大小的编解码器,因为它引入了高延迟。这或多或少地排除了MP3 ...对于5khz输出采样率的语音(它不会用于更高的目的),最小解压缩帧大小是576个样本,或者在发送之前必须编码的~100ms数据。这意味着在您考虑问题的网络部分之前,双向延迟超过200毫秒。