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