2

我正在接收来自 WiRC 的 mjpeg 流。

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

Camera image format      JPEG
Camera image resolution  CIF: 352 × 288

该文档描述了以下内容:

数据包规格

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

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

name        offset  width    description
version     0       32 bit   protocol version and flags  
frame num   4       32 bit   bit index of the JPEG frame in the stream
offset      8       32 bit   offset of the packet data in the JPEG frame
length      12      32 bit   number of data bytes in the packet beyond the header

版本字段

标志在版本字段的高 16 位中编码,低 16 位包含版本号(在解释版本字段时请注意主机字节顺序)。

name                  bits     description
reserved flag bits    31..17   these bits shall be ignored
last packet flag      16       if set this is the last packet of a JPEG frame
version information   15..0    Protocol version, expected value is 0x5503

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

int offset = ((int)(bytes[8]  & 255) << 24) |
             ((int)(bytes[9]  & 255) << 16) |
             ((int)(bytes[10] & 255) <<  8) |
             ((int)(bytes[11] & 255));
int length = ((bytes[12]  & 255) << 24) |
             ((bytes[13]  & 255) << 16) |
             ((bytes[14]  & 255) <<  8) |
             ((bytes[15]  & 255));
long frame = ((bytes[4]  & 255) << 24) |
             ((bytes[5]  & 255) << 16) |
             ((bytes[6]  & 255) <<  8) |
             ((bytes[7]  & 255));

System.out.printf("Version: 0x%02X 0x%02X", bytes[2], bytes[3]);

Boolean last = (bytes[1]   &   1) == 1 ? true : false;

System.out.println(" Offset: "+offset+" Length: "+length);
System.out.println("Lastpacket: "+last + " framenum: "+frame);
System.out.println();

Bitmap bmp=BitmapFactory.decodeByteArray(bytes,32,length);

但是,这会不断返回 BitmapFactory 失败的消息

有什么想法或建议吗?


我在控制台上得到以下响应:

UDP received stuff
Version:  0x5503    Offset:     0    Length: 7584
Lastpacket: true    framenum: 223

编辑:更改代码并添加控制台结果

4

3 回答 3

0

为了更好地使用 mjpeg 流,您应该使用 libjpeg 库。或这个 demp 项目 http://www.anddev.org/resources/file/1484

于 2013-12-04T13:24:05.097 回答
0

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

Bitmap bmp=BitmapFactory.decodeByteArray(bytes, 32, length);

它应该在哪里:

Bitmap bmp=BitmapFactory.decodeByteArray(bytes, 16, length);

其余的都做对了。

不过谢谢各位。

于 2013-06-06T11:17:55.060 回答
0

JPEG 图像通过 UDP 数据包进行分段,而 UDP 数据包可能会出现乱序。

因此,您必须查看标题:

  • 帧数:相同编号 - 相同帧
  • 偏移量:在框架内订购
  • Last Packet flag:此数据包的帧号是帧中的最后一个。

现在你必须弄清楚如何将它们组合在一起。我猜每帧的偏移量将从 0 开始,所以想出一些东西应该是相当容易的。

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

例如:如果您的第 x 帧仍未完成,而第 x+1 帧已经完成,则放弃它。或者你最终会得到一个充满不完整图像的记忆:)

- - 编辑 - -

您可能需要考虑使用ByteBuffer。它有非常方便的方法来处理字节顺序和 int / long 任何从字节的转换。

于 2013-06-05T15:14:54.727 回答