2

WiRC から mjpeg ストリームを受信して​​います。

WiRC ドキュメントでは、ストリームについて次のように説明されています。

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

ドキュメントには、次の内容が記載されています。

パケット仕様

このプロトコルは、UDP パケットを使用して MJPEG ストリームを転送します。MJPEG ストリームは、独立した JPEG フレームで構成されています。JPEG フレームは複数のパケットで送信されます。フラグメント サイズは、サーバー アプリケーションによって決定されます。

パケットの最初の 16 バイトはヘッダーです。パケット ヘッダーには、ネットワーク バイト順 (ビッグ エンディアン) の 32 ビット ワードを含む 4 つのフィールドがあります。

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

私は自分のバグを見つけました。私はこのようにイメージを構築していました:

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

本来あるべき場所:

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

残りは正しく行われました。

しかし、みんなありがとう。

于 2013-06-06T11:17:55.060 に答える