UDP Webcam Streaming (JAVA) - PullRequest
       5

UDP Webcam Streaming (JAVA)

0 голосов
/ 13 мая 2018

Сервер

try {
        DatagramSocket socket = new DatagramSocket(4242);


        byte[] buffer = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length);

        WebcamPanel panel = new WebcamPanel();

        JFrame window = new JFrame("Test webcam panel");
        window.add(panel);
        window.setSize(500, 500);
        window.setResizable(true);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setVisible(true);

        while(true){
            socket.receive(packet);
            System.out.println("received");
            byte[] buff = packet.getData();
            ByteArrayInputStream bain = new ByteArrayInputStream(buff);
            panel.DrawImage(ImageIO.read(bain));
        }
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

Клиент

try{
        DatagramSocket socket = new DatagramSocket();
        InetAddress address = InetAddress.getByName("localhost");

        Webcam webcam = Webcam.getDefault();
        webcam.setViewSize(WebcamResolution.VGA.getSize());

        WebcamPanel panel = new WebcamPanel(webcam);
        panel.setFPSDisplayed(true);
        panel.setDisplayDebugInfo(true);
        panel.setImageSizeDisplayed(true);
        panel.setMirrored(true);

        JFrame window = new JFrame("Test webcam panel");
        window.add(panel);
        window.setResizable(true);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.pack();
        window.setVisible(true);

        ByteArrayOutputStream baos = new ByteArrayOutputStream();

        while(true){
            ImageIO.write(webcam.getImage(),"jpg", baos);
            baos.flush();
            byte[] image_buffer = baos.toByteArray();
            System.out.println(image_buffer.length);
            DatagramPacket packet = new DatagramPacket(image_buffer, image_buffer.length, address, 4242);
            socket.send(packet);

        }

    }catch(Exception e){
        e.toString();
    }

console-> client:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
20884
41796
62687
83582

console-> сервер:

received
received
received

Сервер не может получить целые данные. И получил три данные и остановился. Я не могу понять, почему сервер остановился. Веб-камера в клиенте проверяет веб-камеру. Это работает хорошо, но не может отправить изображение. Как непрерывно получать целые данные? пожалуйста, найдите проблему.

1 Ответ

0 голосов
/ 13 мая 2018

Вы объявляете пакет 1024 bytes

byte[] buffer = new byte[1024];

На вашем сервере вы читаете каждый пакет и рассматриваете его как целое. Изображение:

byte[] buff = packet.getData(); // This is not a whole image yet
ByteArrayInputStream bain = new ByteArrayInputStream(buff);
panel.DrawImage(ImageIO.read(bain));

Например, первое изображение имеет длину 20884, поэтому для его восстановления требуется не менее 20884/1024 + 1 пакетов.

Если вы посмотрите журнал сервера, я думаю, вы увидите какое-то исключение во время выполнения, когда Изображение не полностью построено и используется для рисования на панели.

Чтобы получить целые пакеты и восстановить образ, вам необходимо знать, как определить конец файла на сервере.

Но технически протокол UDP ненадежен, вы можете пропустить некоторые пакеты, порядок полученных вами пакетов не будет таким же, как при отправке. Так что это очень сложно сделать с помощью UDP.

Я предлагаю использовать TCP для передачи файлов. Это надежно, заказ пакетов гарантирован.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...