将java mjpeg流字节转换为图像
我正在接收来自WiRC的mjpeg流 WiRC文档描述了以下关于流的内容:将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位字 版本字段 标志编码
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);