1

我正在编写一个从服务器下载数据并显示它的应用程序。数据由文本、视频、音频和图片文件组成。数据以所谓的数据包下载。数据包可以由所有数据类型的集合组成,范围从几千字节到数百兆字节。数据包太大的原因是视频文件。

服务器是用 Go 编写的,应用程序是用 Java (Android) 编写的。

问题:如果我想传输数据包(小型和大型),哪种压缩算法是最好的方法?Deflate 是否足够,还是我应该考虑更复杂的方法?

4

1 回答 1

2

首先,我假设您的视频、音频和图像文件已经使用有损算法进行了压缩。在这种情况下,您通常无法使用其他不同的压缩算法来压缩数据(很多)。如果文本数据通常只是整个数据包的一小部分,我认为我根本不会费心应用任何进一步的压缩,因为增加软件的复杂性以获得非常小的整体收益是不合理的。例如,如果你将一个 10MB 的音频文件与一个 5kB 的文本文件结合起来,并且能够将文本压缩到 1kB(这可能比你在现实中实现的要好得多),那么数据包的完整大小只会从 10.005MB 减少到 10.001MB,或减少 0.04%。

如果文本量通常很高,您可以证明压缩是合理的,Android 支持使用标准 Android API 的 inflate/deflate 和 gzip。还有用于 bzip2 和 lzma(2) 的 3rd 方 Java 库,我想它们可以在不修改 Android 的情况下编译(虽然我没有尝试过)。快速的 Google 搜索也可以找到 Go 的 gzip、bzip2 和 lzma 实现。

这些算法通常以更高的计算成本和内存要求为代价更好地压缩数据,按以下顺序排列:deflate、gzip、bzip2、lzma。尤其是 lzma 编码器/解码器可能需要比 Android 应用程序实际可用的内存更多。特别是压缩器需要相对较多的内存,如果您保留较小的字典,解码器就不需要那么多了。

于 2013-02-05T13:34:12.023 回答