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
編集:コードを変更し、コンソールの結果を追加しました