C# gzip流:压缩文件比原始文件大

C# gzip流:压缩文件比原始文件大,c#,gzipstream,C#,Gzipstream,我试图在C#中使用gzip流,但压缩后的文件似乎比以前大。 它发生在我处理.avi和.mkv文件时。但如果我使用的是.txt和.html压缩文件,则比原始文件小 using (MemoryStream output = new MemoryStream(blockToCompress.Length)) { using (GZipStream cs = new GZipStream(output, CompressionMode.Compress)) { c

我试图在C#中使用gzip流,但压缩后的文件似乎比以前大。 它发生在我处理.avi和.mkv文件时。但如果我使用的是.txt和.html压缩文件,则比原始文件小

using (MemoryStream output = new MemoryStream(blockToCompress.Length))
{
     using (GZipStream cs = new GZipStream(output, CompressionMode.Compress))
     {
          cs.Write(blockToCompress, 0, blockToCompress.Length);
     }
}

我通过在不编辑代码的情况下检查框架(从3.5到4.0)解决了这个问题。

您的代码是正确的。不幸的是,你的期望没有实现

大多数视频和音频文件已经被严重压缩。它们将无法像GZip那样被进一步压缩。事实上,您可能会稍微增加文件大小—包括GZip在内的每种文件格式都会带来一些开销/簿记

如果你真的需要缩小它们的尺寸,你需要使用一个能理解视频格式的。基本上,您将删除数据,可能会降低外观质量,以换取更小的尺寸


如果源内容未压缩,像GZip这样的无损压缩方案可以将文件大小减少25-50%。含有大量重复文本(HTML)或英文文本(通用文本文件)的文件通常压缩得更好。

您的avi和mkv文件与大多数媒体格式一样已经被严重压缩,gzip可能无法进一步压缩它们,大小的增加是一个奇怪的问题,但根据gzip规范,至少有一个头标志字节,根据实现情况,它可能会添加更多的元数据。

假设一个无损压缩算法能够压缩每个文件。这样,您就可以再次压缩压缩的输出并得到更小的文件,如果您只是一次又一次地压缩,最终您可以将每个文件压缩到零大小。这显然不是事实,其原因在于信息理论原则。但这也意味着,对于每一种压缩算法,都有一些文件无法压缩,或者会因压缩而增长。最后,由于压缩而增长的文件是具有高熵的文件,压缩的视频文件属于这一类别,这就解释了您看到的情况。

(大多数)视频文件已经被严重压缩,因此重新压缩通常会增加其大小。英文文本是非常可压缩的。这是一个重复的问题。如果这些格式可以进一步压缩,那么所有视频提供商(如youtube)都会以这种格式传输它们。NET压缩代码非常糟糕。对于不可压缩数据,使用外部库至少保持非常接近100%。