补偿丢失的 jpeg 字节

Compensating for missing jpeg bytes

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

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

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

DRI 0xFF, 0xDD 4 bytes Define Restart Interval Specifies the interval between RSTn markers, in macroblocks. This marker is followed by two bytes indicating the fixed size so it can be treated like any other variable size segment.

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

RSTn 0xFF, 0xDn (n=0..7) none Restart Inserted every r macroblocks, where r is the restart interval set by a DRI marker. Not used if there was no DRI marker. The low 3 bits of the marker code cycle in value from 0 to 7.

At a restart marker, block-to-block predictor variables are reset, and the bitstream is synchronized to a byte boundary. Restart markers provide means for recovery after bitstream error, such as transmission over an unreliable network or file corruption. Since the runs of macroblocks between restart markers may be independently decoded, these runs may be decoded in parallel.

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