基于DCT的视频编码过程

时间:2013-01-18 11:44:16

标签: c++ video-encoding huffman-code dct run-length-encoding

我有一些问题,我希望你能澄清一下。我自学了一个类似于Mpeg2的视频编码过程。过程如下:

  1. 将RGBA图像分割为4个独立的通道数据存储块。所有R值的数组,一个单独的G值数组等。

  2. 取数组并抓取一块8x8像素数据,使用离散余弦变换(DCT)对其进行变换。

  3. 使用预先计算的量化矩阵对此8x8块进行量化。

  4. Zigzag编码量化步骤的输出。所以我应该得到连续数字的踪迹。

  5. 运行长度编码(RLE)Z字形算法的输出。

  6. 霍夫曼对RLE阶段后的数据进行编码。使用预先计算的霍夫曼表中的值替换。

  7. 返回步骤2并重复,直到所有通道数据都已编码

  8. 返回步骤2并为每个频道重复

  9. 第一个问题是我需要将RGBA值转换为YUV + A(YCbCr + A)值才能使进程正常工作,还是可以继续使用RGBA?我问,因为RGBA-> YUVA转换是一项繁重的工作量,如果可能的话我想避免。

    下一个问题。我想知道RLE存储只运行0或者可以扩展到数组中的所有值吗?见下面的例子:

     440000000111 == [2,4][7,0][3,1]   // RLE for all values
     or
     440000000111 == 44[7,0]111        // RLE for 0's only
    

    最后一个问题是关于霍夫曼阶段的单个符号是什么?要替换的符号是2或4的值,或者符号是运行级对[2,4]。

    感谢您花时间阅读并帮助我。我已经阅读了很多论文并观看了许多YouTube视频,这些视频帮助我理解了各个算法,但没有帮助我们将它们联系在一起以形成代码中的编码过程。

2 个答案:

答案 0 :(得分:1)

(这看起来更像JPEG而不是MPEG-2 - 视频格式更多的是压缩帧之间的差异,而不仅仅是图像压缩)

如果您使用的是RGB而不是YUV,那么您可能无法获得相同的压缩比和/或质量,但如果您愿意,也可以这样做。与算法的其余部分相比,色彩空间转换并不是一项繁重的工作量。

通常在这种类型的应用程序中,您将RLE归零,因为这是您获得大量重复的元素(并且希望在每个块的末尾也是一个可以用单个标记值替换的好数字),而其他系数不是那么重复,但如果你期望重复其他值,我猜YMMV。

是的,您可以将RLE对编码为霍夫曼编码中的单个符号。

答案 1 :(得分:1)

1)是的,你想要转换为YUV ......为了获得更高的压缩比,你需要利用人眼“忽视”显着的颜色损失的能力。通常,您将保持Y平面的分辨率相同(也可能是A平面),但是将U和V平面下采样2x2。例如。如果你做640x480,Y是640x480,U和V平面是320x240。此外,您可以为U / V平面选择不同的量化。与DCT或DFT相比,此转换的成本很低。

2)你没有RLE它,你可以直接使用Huffman Code。