补偿丢失的 jpeg 字节

问题描述 投票:0回答:1

我正在为连接到无线电的微控制器编写一个程序,该程序必须将 JPEG 图像的字节发送到计算机。我想知道是否有办法弥补 JPEG 某些字节丢失的情况。就像现在一样,即使丢失 1 个字节也会损坏整个图像。我可以对其进行编程,以便微控制器重新发送丢失的字节,但我想避免浪费一两个字节的通信时间,并且我不想在微控制器上处理太多。因此,如果我可以用占位符填充空白,那就太理想了,因为这样图片就只有几个像素,这很好。

c jpeg microcontroller data-loss radio-transmission
1个回答
2
投票

您可以使用JPEG重新启动标记,但这意味着当您损坏时会丢失一行MCU块左右,而不仅仅是几个像素(取决于您将它们分开的距离)。

您需要在文件开头(开始扫描之前)添加定义重新启动间隔标记,以指定宏块中的重新启动间隔。

DRI 0xFF、0xDD 4 字节 定义重启间隔 指定 RSTn 标记之间的间隔(以宏块为单位)。该标记后面跟着两个字节,指示固定大小,因此可以像任何其他可变大小段一样对待它。

然后在您的流中,以您指定的宏块数量为间隔,插入一个 2 字节重新启动标记,使用在 0 到 7 之间循环的计数器:

RSTn 0xFF, 0xDn (n=0..7) 无 Restart 插入每 r 个宏块,其中 r 是由 DRI 标记设置的重启间隔。如果没有 DRI 标记则不使用。标记码的低 3 位的值从 0 到 7 循环。

在重新开始标记处,块到块的预测变量被重置,并且比特流被同步到字节边界。重新启动标记提供了比特流错误后的恢复方法,例如通过不可靠的网络传输或文件损坏。由于重新开始标记之间的宏块运行可以独立解码,因此这些运行可以并行解码。

因此,每次解码器遇到 0xFF 字节后跟 0xDn (0-7) 时,您都可以重新同步到字节边界。 0xFF 0xDn 序列不允许出现在正常压缩流中(任何 0xFF 后面都必须跟一个零填充字节,以避免混淆)。

© www.soinside.com 2019 - 2024. All rights reserved.