首页 > 解决方案 > Java WebCam Streaming over TCP Socket,将图像序列重定向到客户端接收者

问题描述

提前感谢您的时间和精力!目前,我正在构建一个即时消息应用程序,并通过 Github 的 Sarxos Webcam API 包含网络摄像头流功能。我的应用程序的实现是,只要接受客户端,运行服务器应用程序的机器操作系统上的另一个线程就会打开,并且客户端存储在 MySql 数据库中。我还没有学习 IO 多路复用,因此我暂时坚持使用这种实现。

关于网络摄像头流,我能够将图像从客户端应用程序发送到服务器应用程序,并且服务器应用程序正在接收图像序列并渲染视频,并且没有延迟。

但是,我的麻烦是将这些图像(视频)序列从服务器重定向到启动流的客户端希望与之进行视频聊天的指定客户端。

我已经尝试了太多的实现来列出,但这是我当前的代码:

客户申请:

    Thread t1 = new Thread() {
        @Override
        public void run() {
            while (true) {
                BufferedImage frame = webCam.getImage();
                int frameWidth = frame.getWidth();
                int frameHeight = frame.getHeight();

                try {
                    videoOutputStream.writeInt(frameWidth);
                    videoOutputStream.writeInt(frameHeight);

                    int[] pixelData = new int[frameWidth * frameHeight];
                    frame.getRGB(0, 0, frameWidth, frameHeight, pixelData, 0, frameWidth);
                    for (int i = 0; i < pixelData.length; i++) {
                        videoOutputStream.writeInt(pixelData[i]);
                    }
                     Thread.sleep(20);
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    };
    t1.start();

服务器应用:

      BufferedImage frame; 

        while (true) {

    //Client who is SENDING images via webcam is using the "videoInputStream" object 
    //Client who is RECEIVING these images is using the "recipientVideoOutputStream" object 

DataOutputStream recipientVideoOutputStream = c.getVideoOutputStream(); 
                int frameWidth = videoInputStream.readInt(); 
                int frameHeight = videoInputStream.readInt();

                frame = new BufferedImage(frameWidth, frameHeight, BufferedImage.TYPE_INT_RGB);

                recipientVideoOutputStream.writeInt(frameWidth);
                recipientVideoOutputStream.writeInt(frameHeight);

                int[] pixelData = new int[frameWidth * frameHeight];
                for (int i = 0; i < pixelData.length; i++) {
                    pixelData[i] = videoInputStream.readInt();
                }

                for (int i = 0; i < pixelData.length; i++) {
                    recipientVideoOutputStream.writeInt(pixelData[i]); //This is where we write/re-direct the images as bytes to the receiving client
                }
            }

而且,现在,客户端应用程序的代码在接收视频源时,该视频源是客户端-服务器发送的,服务器现在将图像重定向到指定的客户端接收者:

            Thread t1 = new Thread() {
                @Override
                public void run() {
                    int frameWidth;
                    int frameHeight;
                    int[] pixelData;
                    BufferedImage frame;
                    Image imagefx;

                    while (true) {

                        try {
                            frameWidth = videoInputStream.readInt();
                            frameHeight = videoInputStream.readInt();
                            pixelData = new int[frameWidth * frameHeight];

                            for (int i = 0; i < pixelData.length; i++) {
                                pixelData[i] = videoInputStream.readInt();
                                System.out.println("CLIENT READING PIXEL DATA " + pixelData[i]);
                            }

                            frame = new BufferedImage(frameWidth, frameHeight, BufferedImage.TYPE_INT_RGB);
                            frame.setRGB(0, 0, frameWidth, frameHeight, pixelData, 0, frameWidth);

                            imagefx = SwingFXUtils.toFXImage(frame, null);
                            System.out.println("CLIENT GOT IMAGE " + imagefx);
                            videoStreamStage.updateImage(imagefx); //Sets the image for the client's stage showing the streamed video, this is within a Platform.runLater()
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            };

目前,接收客户端看到大约 1 帧后因 NegativeArraySizeException 而崩溃,有时还会出现内存堆异常。我可以毫无问题地传递从客户端服务器渲染视频的图像,但是将视频源重定向到另一个客户端已经占用了我整个周末,遗憾的是没有成功。

(编辑):在客户端应用程序中执行以下行时抛出 NegativeArraySizeException,(正在接收流图像的客户端):

pixelData = new int[frameWidth * frameHeight];

我如何将这些图像重新定向到指定的客户接收者,并且它甚至可以按照我的实施方式进行吗?

再次感谢您的宝贵时间!

标签: javasocketstcpwebcam

解决方案


推荐阅读