我正在制作一个连接到收音机的微控制器的程序,该收音机必须将JPEG图像的字节发送到计算机。我想知道是否有办法弥补JPEG的某些字节丢失的情况。就像现在一样,即使丢失1个字节也会破坏整个图像。我可以对它进行编程,以便微控制器重新发送丢失的字节,但我想避免浪费一两个字节的通信时间,我不想在微控制器上处理太多。所以,如果我可以用占位符填充空白,那将是理想的,因为这样的图片只有几个像素,这很好。
答案 0 :(得分:2)
您可以使用JPEG重新启动标记,但这会导致丢失一行MCU块,当您受到损坏时,不仅仅是几个像素(取决于您将它们隔开多远)。
您需要在文件开头(扫描开始前)添加一个Define Restart Interval标记,以指定宏块中的重启间隔。
DRI 0xFF,0xDD 4字节定义重启间隔指定宏块中RSTn标记之间的间隔。此标记后跟两个字节,表示固定大小,因此可以将其视为任何其他可变大小的段。
然后在你的流中,按照你指定的多个宏块的间隔,使用一个循环在0到7之间的计数器插入一个2字节的重启标记:
RSTn 0xFF,0xDn(n = 0..7)无重新启动插入每个r宏块,其中r是由DRI标记设置的重启间隔。如果没有DRI标记,则不使用。标记码的低3位周期值为0到7。
在重启标记处,重置块到块预测变量,并将比特流同步到字节边界。重新启动标记提供了比特流错误后的恢复方法,例如通过不可靠的网络传输或文件损坏。由于重启标记之间的宏块运行可以独立解码,因此可以并行解码这些运行。
因此,每次解码器遇到0xFF字节后跟0xDn(0-7)时,您都可以重新同步到字节边界。 0xFF 0xDn序列不允许出现在普通压缩流中(任何0xFF都必须跟一个零填充字节,以避免混淆)。