1

私はまだ Java を学んでおり、Kryonet の Javadoc を検索しましたが、私の問題に対する答えが見つかりませんでした。

単純なチャット プログラムに Web カメラ機能を追加しています。

現在、ウェブカメラで撮影した単一のフレームを別のコンピューターに転送しようとしています。

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) raster (java.awt.image.BufferedImage)

フレーム (com.jmr.monitor.packets.Packet9WebcamFrame)

com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.write(FieldSerializer.java:585) で com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:213) で com.esotericsoftware.kryo.Kryo.writeObject (Kryo.java:504) com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.write(FieldSerializer.java:564) com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:213) com. esotericsoftware.kryo.Kryo.writeObject(Kryo.java:504) com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.write(FieldSerializer.java:564) com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer. java:213) com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:504) で 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.writeClassAndObject(Kryo.java:571) at com .esotericsoftware.kryonet.KryoSerialization.write(KryoSerialization.java:50) で com.esotericsoftware.kryonet.TcpConnection.send(TcpConnection.java:192) で 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)KryoSerialization.write(KryoSerialization.java:50) com.esotericsoftware.kryonet.TcpConnection.send(TcpConnection.java:192) com.esotericsoftware.kryonet.Connection.sendTCP(Connection.java:59) com.jmr.monitor com.jmr.monitor.Main$1.received(Main.java:93) の .PacketHandler.handlePacket4(PacketHandler.java:131)KryoSerialization.write(KryoSerialization.java:50) com.esotericsoftware.kryonet.TcpConnection.send(TcpConnection.java:192) com.esotericsoftware.kryonet.Connection.sendTCP(Connection.java:59) com.jmr.monitor com.jmr.monitor.Main$1.received(Main.java:93) の .PacketHandler.handlePacket4(PacketHandler.java:131)

したがって、これは bufferOverflow の問題です。クライアントのコンストラクターで、バッファー サイズを増やすなど、いくつかのことを試しましたが、今のところうまくいきません。

この厄介な問題を解決する方法について何か考えはありますか?

前もって感謝します。

よろしく、

アズデ。

4

1 に答える 1

0

パッケージには固定サイズがあります (推測します)。同様の問題で立ち往生しました。つまり、BufferedImage には引数のないコンストラクターがなく、デシリアライズ時にコンストラクターをまったく使用しないなど、別の方法を使用してこの問題を回避すると、問題が解決されます。

したがって、基本的に必要なのは、バッファリングされた画像をシリアル化することです。あなたができることの1つは、独自のシリアライザーを提供することです(githubページで読み取ることができます)、RGBバージョンを抽出するか、画像のバイト/ intコンテンツを保存するか、PNGをメモリに書き込んで代わりにPNG / JPGを送信します(あなたに圧縮を与えます)。

于 2015-11-17T17:42:03.393 に答える