【问题标题】:DCT based Video Encoding Process基于 DCT 的视频编码过程
【发布时间】:2013-01-02 02:56:16
【问题描述】:

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

  1. 将 RGBA 图像拆分为 4 个单独的通道数据内存块。所以一个包含所有 R 值的数组,一个单独的 G 值数组等。

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

  3. 使用预先计算的量化矩阵量化这个 8x8 块。

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

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

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

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

  8. 返回第 2 步,对每个通道重复

第一个问题是我是否需要将 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 视频,这有助于我理解各个算法,但不能帮助我理解它们如何链接在一起以形成代码中的编码过程。

【问题讨论】:

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


    【解决方案1】:

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

    如果您使用 RGB 而不是 YUV,您可能无法获得相同的压缩比和/或质量,但您可以根据需要这样做。与算法的其余部分相比,色彩空间转换几乎不是繁重的工作量。

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

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

    【讨论】:

    • 非常感谢您快速而彻底的回复。 1) 是的,我想你可以说它更像 JPEG 而不是 MPEG-2,因为我只对编码一系列 I 帧而不是 P/B 帧感兴趣。 2)我做了一些分析,我使用的 YUV 转换器(完全优化的 SIMD MMX 程序集)是我 CPU 上最慢的功能。 3) 感谢您为我清理 RLE/Huffman 阶段。非常感谢。
    【解决方案2】:

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

    2) 你不必 RLE,你可以直接 Huffman 编码。

    【讨论】:

    • 我正在尝试更换正在使用的编码器,但我没有源代码。我知道它是基于 MPEG-2 的。我开始使用基于小波的薛定谔编解码器link。我不想要专利问题。我让它在 VS2005 中使用 alpha 通道。我为此编码器尝试实现了一个 RGBA->YUV+A 转换器。 YUV 的形式为 YUV420。不幸的是,我无法让这个编码器在内存消耗和速度方面都像原来的一样好。所以我把它留给了旧的 MPEG-2 系统和 RGBA。希望这能解释我的想法。
    • 顺便说一句,您是否研究过 Google 的 WebM/libvpx/VP8 编解码器?这是一个很棒的视频编解码器(可以说接近 mpeg4 质量),多平台,有源代码。如果需要,您可以将其设置为执行所有 I/Key 帧(基本上是 WebP)...
    • 我看过 WebM Mark。就视频编码器而言,它似乎确实是下一个“大事”。与 Schroedinger 一样,我的理解是:它是基于小波的,专为流式传输大型 (HD) 文件而设计。所以我想我会发现我在使用 WebM 时遇到了与在 Schroedinger 中发现的类似的问题。应该注意的是,我花了很多时间修复 Schroedinger 以运行 VS2005 并在其中添加 alpha 通道支持。我没有时间在 WebM 上遇到同样的麻烦。
    猜你喜欢
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    • 2016-05-25
    • 2010-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多