基于DCT的视频编码过程
DCT based Video Encoding Process
我有一些问题,我希望你能澄清。我自学了一个类似于Mpeg2的视频编码过程。步骤如下:
-
将RGBA图像分割为4个单独的通道数据内存块。一个包含所有R值的数组,一个单独的G值数组等等
-
取数组并抓取一个8x8像素数据块,使用离散余弦变换(DCT)对其进行变换。
-
使用预先计算的量化矩阵量化此8x8块
-
Zigzag编码量化步骤的输出。所以我应该得到一串连续的数字
-
运行长度编码(RLE) zigzag算法的输出
-
Huffman对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视频,这有助于我理解各个算法,但不知道它们是如何链接在一起形成编码过程的。
(这看起来更像JPEG而不是MPEG-2 -视频格式更多的是压缩帧之间的差异,而不仅仅是图像压缩)
如果你在RGB而不是YUV中工作,你可能不会得到相同的压缩比和/或质量,但你可以这样做,如果你想。与算法的其余部分相比,色彩空间转换几乎没有繁重的工作量。
通常在这种类型的应用程序中,你RLE零,因为这是你得到很多重复的元素(希望在每个块的末尾也有一个好数字,可以用单个标记值替换),而其他系数不是那么重复,但如果你期望其他值的重复,我猜是YMMV。
是的,您可以将RLE对编码为霍夫曼编码中的单个符号。
1)是的,你想转换成YUV…为了获得更高的压缩比,你需要利用人眼"忽略"显着色彩损失的能力。通常情况下,您将保持Y平面相同的分辨率(可能A平面也是如此),但将U和V平面降低2x2。例如,如果你做的是640x480, Y平面是640x480, U和V平面是320x240。此外,您可以为U/V平面选择不同的量化。与DCT或DFT相比,这种转换的成本很小。
2)你不需要RLE,你可以直接使用Huffman Code
- 递归函数计算序列中的平方和(并输出过程)
- 如何确定我已使用非编码文件到达 EOF?
- 是否删除在对象构造过程中创建的对象
- 使用 MATLAB 编码器生成C++代码:编译错误"undefined reference to `rgb2gray_tbb_real64'"
- 在卡萨布兰卡形成编码参数的列表
- 使用C++进行游程编码
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 使用已使用 java 编码的 openssl 解码数据
- 如何在鼠标挂钩过程中检测拖动
- 此测试()中发生了什么意外过程?为什么总是覆盖 ch[0 1 2..]?
- clang 插件:在编译过程中修改 AST
- boost 是否有按特殊类型值编码状态"compact optional"?
- 如何在CPP的给定目录中列出UTF编码的文件名?
- 如何使用 C++将 ISO-2022-KR 编码转换为 UTF-8 编码?
- 如何使变量从 x 到 y,然后从 y 返回到 x 并始终重复该过程
- 绝对编码器十六进制输入
- 在C++中调用 MS SQL 存储过程
- 防止C++中的硬编码数字
- C 中的远程过程调用(RPC):在硬编码端点时,可以多个客户端侦听一台服务器
- 基于DCT的视频编码过程