概述
MJPEG(Motion JPEG)是一种基于 JPEG 静态图像压缩 的视频编码格式。其核心思想是:将视频序列中的每一帧都当作一张独立的 JPEG 图片进行编码和存储,而不利用帧与帧之间的时间相关性。
与 H.264、H.265 等现代视频编码标准不同,MJPEG 不涉及复杂的帧间预测、运动补偿或参考帧机制,因此结构简单、编码延迟极低、实现成本小。
基本编码原理
1. 帧级独立编码
MJPEG 的最大特点是帧内编码:
- 视频流 = 一系列 JPEG 图像
- 每一帧独立压缩
- 帧之间互不依赖
因此,任意一帧都可以被直接解码和显示,不需要依赖前后帧。
2. 颜色空间转换
原始视频帧通常为 RGB 或 YUV 格式,MJPEG 编码前会进行颜色空间处理:
- RGB → YCbCr
- Y(亮度) + Cb/Cr(色度)
由于人眼对亮度更敏感,MJPEG 通常对色度分量进行 下采样(如 4:2:2 或 4:2:0),以降低数据量。
3. 分块与离散余弦变换(DCT)
MJPEG 采用 JPEG 的核心技术:
- 将图像分割为 8×8 像素块
- 对每个块进行 离散余弦变换(DCT)
- 将空间域信号转换到频域
DCT 能有效地将能量集中在低频部分,为后续压缩提供基础。
4. 量化(Quantization)
量化是 MJPEG 有损压缩的主要来源:
- 高频系数量化得更粗
- 低频系数量化得更精细
通过量化表控制压缩率与画质:
- 量化步长大 → 压缩率高、画质差
- 量化步长小 → 压缩率低、画质好
5. 熵编码
量化后的 DCT 系数会经过熵编码:
- Zig-Zag 扫描
- 游程编码(RLE)
- Huffman 编码
这是 MJPEG 中唯一的无损压缩阶段。
数据结构与封装
1. 裸 MJPEG 流
裸 MJPEG 流通常表现为:
- 连续 JPEG 帧
- 每一帧以
FFD8开始,以FFD9结束
播放器通过扫描 JPEG 头尾识别帧边界。
2. 常见封装格式
MJPEG 通常被封装在以下容器中:
- AVI(最常见)
- MOV
- MKV
- RTP(网络实时传输)
在 RTP 中,MJPEG 有独立的 RFC(RFC 2435)。
压缩特性
1. 压缩效率
MJPEG 的压缩效率明显低于现代视频编码:
| 编码格式 | 压缩效率 |
|---|---|
| MJPEG | 低 |
| MPEG-2 | 中 |
| H.264 | 高 |
| H.265 | 很高 |
原因在于:
- 未利用帧间冗余
- 相邻帧重复信息大量存在
2. 码率特征
MJPEG 的码率特点:
- 码率高
- 波动大(与画面复杂度强相关)
- 不适合低带宽环境
例如:
- 1080p@25fps 的 MJPEG
- 码率可能达到 80~150 Mbps
3. 延迟与实时性
MJPEG 的优势在于:
- 无参考帧
- 编码解码流程短
- 延迟极低(毫秒级)
非常适合对实时性要求极高的应用。
优点与缺点
优点
- 实现简单
- 基于 JPEG 编码器即可
- 低延迟
- 无帧间预测
- 强健性好
- 丢帧不影响后续帧
- 随机访问能力强
- 任意帧可独立解码
- 适合硬件实现
- FPGA / DSP 易实现
缺点
- 压缩效率低
- 存储与带宽消耗大
- 不适合长时间录像
- 缺乏现代编码工具
- 无 B 帧、无 CABAC、无运动补偿
与现代编码标准对比
| 特性 | MJPEG | H.264 | H.265 |
|---|---|---|---|
| 编码复杂度 | 极低 | 中 | 高 |
| 压缩率 | 低 | 高 | 很高 |
| 延迟 | 极低 | 低 | 较低 |
| 帧间预测 | 无 | 有 | 有 |
| 抗丢包能力 | 强 | 一般 | 一般 |
| 随机访问 | 强 | 一般 | 一般 |
总结
MJPEG 是一种以 JPEG 为基础的帧内视频编码技术,通过对每一帧进行独立压缩,实现了结构简单、低延迟、高稳定性的特点。虽然其压缩效率远低于现代视频编码标准,但在工业视觉、实时视频采集、浏览器流媒体等领域仍具有实际价值。
在视频系统设计中,MJPEG 更适合作为:
- 实时性优先方案
- 简单可靠方案
- 中间处理格式
而非面向低带宽、大规模分发的主流视频编码方案。