将java mjpeg流字节转换为图像

将java mjpeg流字节转换为图像,java,android,mjpeg,Java,Android,Mjpeg,我正在接收来自WiRC的mjpeg流 WiRC文档描述了以下关于流的内容: Camera image format JPEG Camera image resolution CIF: 352 × 288 本文档描述了以下内容: 数据包规范 该协议使用UDP数据包传输MJPEG流。MJPEG流包括 独立的JPEG帧。JPEG帧以多个数据包的形式发送。片段大小由服务器应用程序决定 数据包的前16个字节是报头。数据包头有四个字段,其中包含网络字节顺序(大端)的32位字 版本字段 标志编码

我正在接收来自WiRC的mjpeg流

WiRC文档描述了以下关于流的内容:

Camera image format      JPEG
Camera image resolution  CIF: 352 × 288
本文档描述了以下内容:

数据包规范 该协议使用UDP数据包传输MJPEG流。MJPEG流包括 独立的JPEG帧。JPEG帧以多个数据包的形式发送。片段大小由服务器应用程序决定

数据包的前16个字节是报头。数据包头有四个字段,其中包含网络字节顺序(大端)的32位字

版本字段 标志编码在版本字段的上16位,下16位 包含版本号(在解释 版本字段)

我使用以下代码将流解码为图像:


int offset=((int)(字节[8]&255)JPEG图像在UDP数据包上被分割,UDP数据包可能会乱序

因此,您必须查看标题:

  • 帧编号:相同编号-相同帧
  • 偏移量:帧内订购
  • Last Packet flag:此数据包的帧号是帧中的最后一个
现在你必须弄清楚如何把它们放在一起。我想每帧的偏移量将从0开始,所以应该很容易找到一些东西

记住要建立一些超时机制,因为UDP是不可靠的

例如:如果第x帧尚未完成,且第x+1帧已完成,请将其丢弃。否则,您的内存中将充满未完成的图像:)

----编辑----


<>你可能想考虑使用A。它有非常方便的方法来处理字节顺序和int/long,不管是从字节转换过来的。

我发现了自己的错误。我是这样构建图像的:

Bitmap bmp=BitmapFactory.decodeByteArray(bytes, 32, length);
本应是:

Bitmap bmp=BitmapFactory.decodeByteArray(bytes, 16, length);
其余的都做对了


不过,谢谢各位。

为了更好地使用mjpeg流,您应该使用libjpeg库。 或者这个demp项目

看到起始大小有点不正确,是128,本来应该是32。改变了这个,明天还要测试你在这里重新定位镜框吗?在我看来,你只是试图解码部分帧。记住,它们是零碎的。如果你重新组装,请添加代码。我不做任何重新配置,我希望某种计数器告诉我要添加什么帧。所以我需要做的就是合并帧,直到我得到最后一个数据包标志?每4个字节:小端或大端?而不是8,9,10,11,它可能是11,10,9,8等。与似是而非/可检查值(如版本)进行比较。我明白了,我将对此进行研究。然而,就我所见,偏移量始终为0。请参阅我的上述评论。它可能是一个小的图像适合一个包。这个尺寸有意义吗?那么帧数会增加吗?顺便问一下:如果这些是“无符号整数”,那么在Java中应该使用long。每个帧包含我所能看到的最后一个帧位。帧计数器上升得很好。当我读取字节2和字节3时,版本被正确读取:非常明显,一个被切换。这是否意味着图像字节也会翻转?这是否意味着长度也会翻转?这给了我一个
2016935936
的帧大小,这在我看来不太可能。
UDP received stuff
Version:  0x5503    Offset:     0    Length: 7584
Lastpacket: true    framenum: 223
Bitmap bmp=BitmapFactory.decodeByteArray(bytes, 32, length);
Bitmap bmp=BitmapFactory.decodeByteArray(bytes, 16, length);