java通过socket连接和webcame包实现视频聊天,抛出异常

我使用java的SOCKET类和Webcam包来实现两台电脑的视频聊天,但是在发起视频聊天后,发送方能把图像绘画出来,但是一瞬后就卡住,接收视频的电脑会报错

img

img

这个错误通常是由于数组大小为负数引起的。可能是在创建数组时,使用了负数的索引或者长度。
可能是在接收视频数据时,尝试创建一个负数大小的数组,导致了这个错误。增加日志或者debug调试看看。

// 客户端代码
public class Client {
    public static void main(String[] args) throws Exception {
        // 创建socket连接
        Socket socket = new Socket("localhost", 8888);
        // 获取webcam视频流
        OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
        grabber.start();
        // 创建视频显示窗口
        CanvasFrame frame = new CanvasFrame("Video Chat");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // 循环发送视频数据
        while (true) {
            // 读取视频帧
            Frame videoFrame = grabber.grab();
            // 将视频帧转换为byte数组
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            BufferedImage bufferedImage = videoFrameToBufferedImage(videoFrame);
            ImageIO.write(bufferedImage, "jpg", baos);
            byte[] data = baos.toByteArray();
            // 发送视频数据
            OutputStream os = socket.getOutputStream();
            os.write(data);
            os.flush();
            // 显示视频帧
            frame.showImage(videoFrame);
        }
    }
}

// 服务端代码
public class Server {
    public static void main(String[] args) throws Exception {
        // 创建socket连接
        ServerSocket serverSocket = new ServerSocket(8888);
        Socket socket = serverSocket.accept();
        // 创建视频显示窗口
        CanvasFrame frame = new CanvasFrame("Video Chat");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // 循环接收视频数据
        while (true) {
            // 接收视频数据
            InputStream is = socket.getInputStream();
            byte[] data = new byte[is.available()];
            is.read(data);
            // 将byte数组转换为视频流
            ByteArrayInputStream bais = new ByteArrayInputStream(data);
            BufferedImage bufferedImage = ImageIO.read(bais);
            Frame videoFrame = bufferedImageToVideoFrame(bufferedImage);
            // 显示视频帧
            frame.showImage(videoFrame);
        }
    }
    
    // 将视频帧转换为BufferedImage
    private static BufferedImage videoFrameToBufferedImage(Frame videoFrame) {
        Java2DFrameConverter converter = new Java2DFrameConverter();
        return converter.getBufferedImage(videoFrame, 1);
    }
    
    // 将BufferedImage转换为视频帧
    private static Frame bufferedImageToVideoFrame(BufferedImage bufferedImage) {
        Java2DFrameConverter converter = new Java2DFrameConverter();
        return converter.getFrame(bufferedImage);
    }
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632