2014-10-05 28 views
1

我仍然在学习Java,我已经搜索到Kryonet的Javadoc,并没有找到我的问题的任何答案。Kryonet,不能发送BufferedImage

我正在给一个简单的聊天程序添加一个网络摄像头功能。

我目前正在尝试将我的网络摄像头拍摄的单个帧传输到另一台计算机。

Kryonet让我送 “自制” 的数据包,所以使这个包:

Packet9WebcamFrame.java

import java.awt.image.BufferedImage; 

public class Packet9WebcamFrame{ 
    public BufferedImage frame; 
} 

在我的客户我只好再注册这个包:

client.getKryo().register(Packet9WebcamFrame.class); 

但后来我有错误,让我注册其他类:

client.getKryo().register(java.awt.image.BufferedImage.class); 
client.getKryo().register(java.awt.image.ComponentColorModel.class); 
client.getKryo().register(java.awt.color.ICC_ColorSpace.class); 
client.getKryo().register(float[].class); 
client.getKryo().register(java.awt.color.ICC_ProfileRGB.class); 
client.getKryo().register(short[].class); 
client.getKryo().register(byte[].class); 
client.getKryo().register(int[].class); 
client.getKryo().register(sun.awt.image.SunWritableRaster.class); 
client.getKryo().register(java.awt.image.DataBufferByte.class); 
client.getKryo().register(byte[][].class); 

所以,现在,当我的客户端接收数据包说:“你好,我需要你给我的摄像头帧请”,它是:

webcam.open(); 

    if (webcam.isOpen()) 
    { 

     Packet9WebcamFrame wFrame = new Packet9WebcamFrame(); 

     wFrame.frame = webcam.getImage(); 

     //We send the frame via the packet 
     try 
     { 
      Main.client.sendTCP(wFrame); 
     } 

     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
     System.out.println("I have sent a webcam frame"); 

     webcam.close(); 

    }  

之后,我希望它的工作,但仍然一个错误:

com.esotericsoftware.kryo.KryoException: java.nio.BufferOverflowException序列化迹:Bankdata银行 (java.awt.image.DataBufferByte中)的DataBuffer (sun.awt.image.SunWritableRaster)RAST呃 (java.awt.image.BufferedImage中)

帧(com.jmr.monitor.packets.Packet9WebcamFrame)

在 com.esotericsoftware.kryo.serializers.FieldSerializer $ ObjectField.write(FieldSerializer.java :585) 处 com.esotericsoftware.kryo com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:213) 在com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:504)。 serializers.FieldSerializer $ ObjectField.write(FieldSerializer.java:564) at com.esotericsoftware.kryo.serializers.FieldSerializer.wri te(FieldSerializer.java:213) at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:504)at com.esotericsoftware.kryo.serializers.FieldSerializer $ ObjectField.write(FieldSerializer.java:564) at com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:213) at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:504)at com.esotericsoftware.kryo.serializers.FieldSerializer $ ObjectField .WRITE(FieldSerializer.java:564) 在 com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:213) 在com.esotericsoftware.kryo.Kryo.writeClassAndObject(Kryo.java:571) 在 com.esotericsoftware.kryonet.KryoSerial ization.write(KryoSerialization.java:50) at com.esotericsoftware.kryonet.TcpConnection.send(TcpConnection.java:192) at com.esotericsoftware.kryonet.Connection.sendTCP(Connection。Java的:59) 在 com.jmr.monitor.PacketHandler.handlePacket4(PacketHandler.java:131) 在com.jmr.monitor.Main $ 1.received(Main.java:93)

所以,这是一个bufferOverflow问题,我在我的客户端的构造函数中尝试了一些东西,例如增加缓冲区大小但目前还没有运气。

任何想法如何解决这个恼人的问题?

预先感谢您。

Regards,

Azsde。

回答

0

包有一个固定的大小(我猜)。我坚持着类似的问题。归结起来,BufferedImage没有非参数构造函数,如果使用不同的方法来解决这个问题,比如在反序列化时不使用构造函数,它就会向南。

所以基本上你想要的是序列化一个缓冲的图像。你可以做的一件事就是提供你自己的序列化程序(可以在它们的github页面上读取),或者提取RGB版本或者存储图像的byte/int内容,甚至可以将PNG写入内存,然后发送PNG/JPG给你压缩)。