【问题标题】:Why does compressed buffer needs to be bigger than input buffer in LZW compression?为什么压缩缓冲区需要大于 LZW 压缩中的输入缓冲区?
【发布时间】:2016-08-02 18:56:42
【问题描述】:

我目前正致力于从 FFmpeg 源代码到我的项目中实现 LZW 压缩和解压缩方法。我偶然发现的是输出缓冲区的大小(将存储压缩数据的地方)需要大于我们要压缩的输入缓冲区的大小。这与压缩本身不矛盾吗?

代码的下一部分位于ff_lzw_encode() 函数中,该函数是lzwenc.c 源文件的一部分。

if (insize * 3 > (s->bufsize - s->output_bytes) * 2)
{
    printf("Size of output buffer is too small!\n");
    return -1;
}

对于我的特定示例,我尝试在本地发送原始视频帧之前对其进行压缩。但是,如果我为大小为(insize * 3) / 2(将存储压缩数据)的缓冲区分配内存,那么使用send() 函数发送比发送大小为insize 的原始缓冲区不会花费更多时间吗?

【问题讨论】:

    标签: ffmpeg compression libavcodec libav lzw


    【解决方案1】:

    您不能保证“压缩”表单的大小小于甚至等于输入的大小。考虑无法以任何方式压缩的纯随机数据的最坏情况,最好的情况是压缩到其原始大小的 100%;除此之外,还需要添加一些压缩元数据或转义序列,从而导致例如100% + 5 个字节。

    事实上,将不可压缩数据“压缩”到“仅”100% 的原始大小通常不会自动发生。如果算法只是尝试正常压缩输入,则结果甚至可能比输入显着。智能压缩工具会检测到这种情况并退回以发送未压缩的数据块,然后添加一些元数据以至少表明该块未压缩。

    您分配的缓冲区必须足够大,以包含最坏情况下的“压缩”字节数,因此需要一些“净空”。

    使用 send() 函数发送时间不会比 发送原始缓冲区

    是的,会的。这就是为什么您不发送整个(分配的)缓冲区,而只发送来自该缓冲区的字节数,因为压缩函数表明它已使用。

    【讨论】:

    • 是的,这是真的。我实际上尝试压缩主要由“绿色”像素组成的帧(大多数电影和电影预告片中的第一帧),只有 4.87% 的分配内存被压缩数据占用。我为摆脱缓冲区的冗余 95.13% 内存所做的就是只发送前 4.87% 的重要数据并在客户端解压缩它。解压完成后,将数据写入文件并使用 InfraView 进行预览。它奏效了!我在客户端的帧与在服务器端的帧相同(可能不是 100% 相同,因为我没有逐位比较)。
    猜你喜欢
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-16
    • 2021-06-02
    相关资源
    最近更新 更多