1. 分类你需要低 MIPS 还是低复杂度
让我冒昧地把这个问题分成两部分。
- 低复杂度编码 - 允许较低的资源(特别是内存中的)使其在给定系统中快速响应编码。
- 计算中的低显式 (MIPS)。- 仅涉及最小可能的 CPU 周期。
还有第三个标准 - 人们谈论“低延迟” - 对于像视频会议这样的应用程序,计算资源可能不重要 - 但是编码引入的总体延迟
重要的是要注意,在较低复杂度的系统中 - 访问内存(内存总线速度和宽度)以及有时 IO 通常非常慢,这就是为什么 MPEG 类算法会受到影响,即使计算算法可能很简单。
在您对编解码器的要求做出判断之前 - 您应该尝试根据 -
一种。每秒的 CPU 周期。
湾。最大内存吞吐量。
C。IO 延迟
2. 您应该自定义 MPEG 而不是重新发明
一般而言 - MPEG 类编解码器为您提供了非常灵活的机制来执行此操作。从这个意义上说,您不必像您宁愿定制MPEG 2 或 MPEG 4 来完成您的工作那样重新发明编解码器。
首先,让我们说一下使压缩成为可能的所有元素并按复杂程度排列它们:
- 运动估计和运动补偿。1.a. 前向预测(P 帧) 1.b。双预测(B 帧) 1.c. 高分辨率运动矢量
- 帧内编码 - DCT (+ IDCT)
- 量化 - 和编码器模式选择
- VLC - 可变长度编码。(H.264 中的 CABAC)
- 系数预测 [在 mpeg2 中只有 DC 预测 - MPEG4 有更多]
在 MPEG 类算法中,基于 DCT 的编码和 VLC 在没有太多选择的情况下变得非常强制性 - 但所有机制的其余部分都非常重要
例如,运动估计和运动补偿是 MIPS 消耗最高的元素之一。如果您没有资源来执行此操作 - 您可以简单地将所有帧编码为 I 帧(这使得它非常像 MJPEG - 但标准 MPEG 解码器可以对此进行解码)。如果你能负担得起更多的资源——你可以使用帧差来进行微不足道的运动补偿——而不是将每一帧作为帧内发送,你可以从它的前一帧块中减去每个块;如果差异高于原始信号,则将其作为 Intra 发送。
当然 - 所有这一切都意味着您将失去上述编码器所承诺的一些效率 - 但我认为您愿意放弃这一点!
编辑:
您可以将以下编解码器视为很好的参考点:
MSSG:http
://www.mpeg.org/MPEG/video/mssg-free-mpeg-software.html
有助于理解,但可能是世界上最慢的。
FFMPEG: http: //ffmpeg.org/
可能是地球上最快的。最好从黑盒开始,但不要尝试从内部更改代码。当你使用库 API 时,可能会给你很好的选择来控制东西。它已经移植到许多平台上——但在新平台上进行移植可能是一项任务。
FAME: http: //fame.sourceforge.net/
这最初的目的与您描述的相同。虽然,我有点脱节 - 但你可以试试这个。
Xvid:http ://www.xvid.org/
这是 MPEG-4。这是干净代码和合理速度之间的最佳平衡之一。如果您最终住在编码器内部,应该是最容易使用的。
JPEG:http ://www.ijg.org/
这是 JPEG。这是跨平台移植它的最佳库之一。此外,JPEG 本质上比 MPEG 的某些方面更简单 - 所以您可能应该先尝试一下。世界上大多数相机可能都按原样使用了这个库——而不是创建自己的东西!
可能是我在使用 MPEG 时错了!但这是一种值得冒的风险。
检查这是否可行的最佳方法可能是 - 只需尝试对图像进行量化的标准 8x8 DCT;优化这个。如果您能够接近您的实时要求,那么我认为您对所有所有 JPEG 帧或所有 I 帧 MPEG 编解码器都做得很好。如果您偏离目标 - 那就不值得了。