【发布时间】:2013-01-02 02:56:16
【问题描述】:
我遇到了一些问题,希望您能够澄清。我自学了一个类似于 Mpeg2 的视频编码过程。流程如下:
将 RGBA 图像拆分为 4 个单独的通道数据内存块。所以一个包含所有 R 值的数组,一个单独的 G 值数组等。
获取数组并获取一个 8x8 像素数据块,使用离散余弦变换 (DCT) 对其进行变换。
使用预先计算的量化矩阵量化这个 8x8 块。
之字形编码量化步骤的输出。所以我应该得到一个连续数字的踪迹。
运行长度编码 (RLE) 之字形算法的输出。
在 RLE 阶段之后对数据进行霍夫曼编码。使用预先计算的霍夫曼表中的值替换。
返回步骤 2 并重复,直到所有通道数据都已编码
返回第 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