行程编码(Run-Length Encoding,简称RLE),又称游程编码或运行长度编码,是一种经典的无损数据压缩算法。其核心原理是将数据流中连续出现的相同值(称为"run"或"行程")替换为一个计数值和该值的组合,从而显著减少存储空间。RLE是一种完全无损的压缩技术,解压缩后可比特级精确恢复原始数据,无任何信息丢失。
在视频无损压缩领域,RLE虽非主流独立codec的核心,但作为高效的辅助或中间步骤,被广泛集成到多种专业无损视频编码器中。视频数据存在大量空间冗余(帧内相邻像素相似)和时间冗余(帧间相似),经过预测处理后生成的残差(residual)往往包含长串连续零或相同值,此时RLE能有效去除这些统计冗余,提升整体压缩比。典型应用包括Lagarith、HuffYUV变体、某些DICOM医疗视频封装以及混合方案(如预测+RLE)。与其他熵编码(如Huffman或算术编码)结合,RLE在屏幕录制、动画、医疗影像和高静态视频中表现突出。
RLE的技术原理与数学基础
RLE的原理基于数据流的统计特性:识别连续相同符号序列,并用"计数 + 值"对表示。假设数据序列为S = {s1, s2, ..., sn},RLE扫描序列,输出列表{(c1, v1), (c2, v2), ...},其中ci为连续出现次数,vi为值。
编码算法伪码:
- 初始化计数器count=1,当前值prev=s1
- 遍历后续元素:
- 若当前元素==prev,count++
- 否则,输出(count, prev),重置count=1,prev=当前元素
- 结束时输出最后一对
变体优化:
- 修改版RLE:仅在run长度>阈值(如3)时应用RLE,否则直接输出原始字节,避免文件膨胀(常见于视频codec)。
- 变长计数:计数用可变长度整数(如Golomb-Rice或指数Golomb)编码,长run用更多位但高效。
- 平面分离:视频常分离RGB/YUV通道独立RLE,提高重复概率。
- 与预测结合:先差分预测(DPCM)或中值预测生成残差,残差多为零序列,再RLE。
数学上,RLE接近零阶熵压缩极限。对于概率p的重复符号,理想压缩比与熵H = -p log p - (1-p) log(1-p)相关。但实际中,计数开销使RLE在随机数据上可能膨胀(压缩比<1)。
在视频中,原始像素重复少,但预测残差(如中值预测:pred = median(left, top, top-left),residual = pixel - pred)常产生长零run。RLE在此阶段效率高,可将残差流压缩20-50%。
RLE在视频无损压缩中的应用与codec实现
RLE在视频无损压缩中多作为预处理或辅助模块,与预测和高级熵编码结合。
Lagarith Lossless Codec (2004年起):基于HuffYUV改进,使用中值预测生成残差,然后可选修改版RLE(仅有益时启用),再用范围编码(Range Coding,一种算术编码变体)。RLE帮助处理高静态场景(如屏幕录制),压缩比优于HuffYUV 10-30%。支持RGB/YUV多种空间,实时编码快。
HuffYUV及其变体(1998年起):核心用中值预测+Huffman编码残差。FFmpeg的ffvhuff变体支持上下文自适应Huffman,但早期版本借鉴RLE思想。纯HuffYUV无直接RLE,但残差Huffman类似于run-level编码。
FFV1(FFmpeg Video Codec 1,2003年起):开源存档首选,使用Golomb-Rice或范围编码。虽无显式RLE,但支持"run-mode"优化残差零序列,类似RLE变体。压缩比高,适合档案。
其他应用:
- DICOM医疗视频:RLE作为封装格式,支持字节级无损压缩。
- 研究方案:论文《Lossless Video Compression Using Prediction and RLE》提出预测后RLE变体,结合变长计数优化彩色视频。
- 屏幕录制:高重复区域(如静态背景)RLE极高效。
典型管道:
- 色彩空间转换(RGB→YUV可选平面分离)
- 帧内/帧间预测生成残差
- RLE压缩残差run(可选修改版)
- 熵编码(Huffman/算术)
- 打包成流

优缺点与性能分析
优点:
- 实现极简单,编码/解码速度快(实时易实现,多核优化佳)。
- 对平坦/静态视频压缩出色(压缩比可达5:1+局部)。
- 低资源占用,适合嵌入式/实时捕获。
- 与预测结合,接近熵极限。
缺点:
- 对自然视频(噪声多、残差随机)压缩有限,甚至膨胀。
- 无位置信息,仅适合一维流。
- 现代被LZ77/算术编码取代,但仍辅助。
性能对比表(基于典型测试,相对原始大小):
| Codec | 主要技术 | RLE角色 | 压缩比(屏幕录制) | 压缩比(自然视频) | 编码速度 |
|---|---|---|---|---|---|
| HuffYUV | 中值预测 + Huffman | 间接类似 | 40-60% | 50-70% | 极快 |
| Lagarith | 中值预测 + 修改RLE + 范围 | 直接辅助 | 30-50% | 40-60% | 快 |
| FFV1 | Golomb/范围 + run-mode | 类似优化 | 25-40% | 30-50% | 中等 |
示例
Python模拟视频残差RLE(修改版,避免膨胀):
python
def modified_rle_encode(data, threshold=3):
encoded = []
i = 0
while i < len(data):
count = 1
while i + count < len(data) and data[i + count] == data[i] and count < 255:
count += 1
if count >= threshold:
encoded.append((0, count)) # 标志RLE
encoded.append((1, data[i])) # 值
else:
for j in range(count):
encoded.append((1, data[i + j])) # 直接输出
i += count
return encoded
# 模拟残差:大量零 + 少量变化
residual = [0]*100 + [1,2,3] + [0]*50 + [255]
encoded = modified_rle_encode(residual)
print(f"原始长度: {len(residual)}")
print(f"编码后对数: {len(encoded)*2} (假设每对2字节)")
总结
行程编码(RLE)作为视频无损压缩的基石技术,以其简单高效在残差处理中发挥关键作用。虽现代codec多用高级熵编码,RLE的变体(如修改版、run-mode)仍活跃于Lagarith、FFV1等专业工具中,特别适合高重复视频。未来,随着AI预测提升残差零run概率,RLE将继续贡献于实时编辑、医疗存档和屏幕捕获等领域。