Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 在java中,通过套接字在循环中传输时,我只得到一个图像_Sockets_Javacv_Live Streaming - Fatal编程技术网

Sockets 在java中,通过套接字在循环中传输时,我只得到一个图像

Sockets 在java中,通过套接字在循环中传输时,我只得到一个图像,sockets,javacv,live-streaming,Sockets,Javacv,Live Streaming,基本上我想做的是用java实现实时视频流。i、 e在一台计算机的网络摄像头前抓取视频,并将该视频实时发送到另一台计算机 这是我的服务器端代码,我使用opencv库在循环中获取图像,然后将其保存到文件中。 然后,我使用文件流打开它并将其发送到其他网络,下面是我的客户端代码 public class filere extends Applet { //static IplImage bimg; public static void main(String ar[]) throws Excep

基本上我想做的是用java实现实时视频流。i、 e在一台计算机的网络摄像头前抓取视频,并将该视频实时发送到另一台计算机

这是我的服务器端代码,我使用opencv库在循环中获取图像,然后将其保存到文件中。 然后,我使用文件流打开它并将其发送到其他网络,下面是我的客户端代码

public class filere extends Applet {
  //static IplImage bimg;
  public static void main(String ar[]) throws Exception{
    CanvasFrame canvas = new CanvasFrame("Webcam");
    ServerSocket ss=new ServerSocket(1234);
   while(true){
    Socket clientSocket=ss.accept();
    InputStream in=clientSocket.getInputStream();
    //OutputStream out=clientSocket.getOutputStream();
    FileOutputStream fos=new FileOutputStream("b.jpg");
    int x=0;
    while(true){
        x=in.read();
        if(x==-1)break;
        fos.write(x);
    }
    bimg = opencv_highgui.cvLoadImage("b.jpg");
    canvas.showImage(bimg);

  }
}
}
错误: 我在客户端只获得一个图像,即从网络摄像头捕获的第一个图像

在客户端获取所有图像(即视频)的解决方法是什么

我已经进口了所有必要的包装

     public class filesen{
       static IplImage bimg;
       public static void main(String ar[])throws Exception{
           Socket clientSocket=new Socket("localhost",1234);
           CanvasFrame canvas = new CanvasFrame("sending");
           //int i=1;
           FrameGrabber grabber = new OpenCVFrameGrabber("");
           try {
                grabber.start();
                IplImage img;
                while (true) {
                OutputStream out=clientSocket.getOutputStream();
                img = grabber.grab();
                if (img != null) {

                        opencv_highgui.cvSaveImage("a.jpg", img); 

                        FileInputStream fis=new FileInputStream("a.jpg");
                        System.out.println(fis);
                        int x=0;
                        while(true){
                                x=fis.read();
                                if(x==-1)break;
                                out.write(x);
                            }
                        bimg = opencv_highgui.cvLoadImage("a.jpg");
                        canvas.showImage(bimg);
                    //    out.close();
                        //canvas.showImage(img);
                    i++;
                    System.out.println(i);
                    }

                }

        }
        catch (Exception e) {
        }
    }
}
这是我的客户端代码

public class filere extends Applet {
  //static IplImage bimg;
  public static void main(String ar[]) throws Exception{
    CanvasFrame canvas = new CanvasFrame("Webcam");
    ServerSocket ss=new ServerSocket(1234);
   while(true){
    Socket clientSocket=ss.accept();
    InputStream in=clientSocket.getInputStream();
    //OutputStream out=clientSocket.getOutputStream();
    FileOutputStream fos=new FileOutputStream("b.jpg");
    int x=0;
    while(true){
        x=in.read();
        if(x==-1)break;
        fos.write(x);
    }
    bimg = opencv_highgui.cvLoadImage("b.jpg");
    canvas.showImage(bimg);

  }
}
}

这样想吧

你有一个生产者,它生成图像,你有一个消费者,它想要得到这些图像

消费者要求制作者提供下一张图片,当制作者准备好后,它会发送下一张图片,消费者会以自己想要的方式消费它

通常,消费者会等待制作人制作一些东西,然后进行处理,我采取了一个稍微不同的方向,允许消费者“请求”下一张可用的图像。这使得制作人可以继续它的快乐的小方式,而不被困在发送所有它可以

为什么您可能会问,因为生成帧可能比通过网络发送帧要快,这样您就可以生成一个帧丢弃算法,用图像填充队列,并让队列管理它愿意缓冲的帧数。然后,“生产者”会根据消费者的请求提取队列的帧并发送它们

这只是一个概念证明,它不涉及多个连接或连接恢复,也不涉及您需要处理的一系列其他事情

本例中的生产者(服务器)从服务器上的目录发送图像文件。应客户/消费者的请求,它将继续发送图像,直到不再有图像,此时它将发送“NoMoreImages”响应

消费者将从服务器请求下一个映像,将其写入磁盘并继续,直到收到“NoMoreImages”响应,此时它将退出

消费者 制作人
导入java.io.BufferedReader;
导入java.io.BufferedWriter;
导入java.io.File;
导入java.io.FileFilter;
导入java.io.FileInputStream;
导入java.io.IOException;
导入java.io.InputStream;
导入java.io.InputStreamReader;
导入java.io.OutputStream;
导入java.io.OutputStreamWriter;
导入java.net.ServerSocket;
导入java.net.Socket;
公共级制作人{
公共静态void main(字符串[]args){
try(ServerSocket-ServerSocket=newserversocket(1234)){
System.out.println(“等待来自消费者的连接…”);
try(Socket=serverSocket.accept()){
System.out.println(“列出文件…”);
File[]images=新文件(“/some/directory/full/of/images”).listFiles(新文件过滤器(){
@凌驾
公共布尔接受(文件路径名){
String name=pathname.getName().toLowerCase();
返回名称.endsWith(“.gif”)
||name.endsWith(“.jpeg”)
||名称.endsWith(“.jpg”)
||名称.endsWith(“.png”);
}
});
System.out.println(“Have”+images.length);
int-imageIndex=0;
try(InputStream=socket.getInputStream();
BufferedReader reader=新的BufferedReader(新的InputStreamReader(is));
OutputStream os=socket.getOutputStream();
BufferedWriter writer=新的BufferedWriter(新的OutputStreamWriter(os))){
布尔值moreRequets=true;
做{
System.out.println(“等待消费者请求”);
字符串请求=reader.readLine();
如果(“NextImage”.equals(请求)){
System.out.println(“获取下一幅图像”+图像索引);
if(images!=null&&imageIndeximport java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Producer {

    public static void main(String[] args) {

        try (ServerSocket serverSocket = new ServerSocket(1234)) {

            System.out.println("Waiting for connection from consumer...");
            try (Socket socket = serverSocket.accept()) {

                System.out.println("Listing files...");
                File[] images = new File("/some/directory/full/of/images").listFiles(new FileFilter() {
                    @Override
                    public boolean accept(File pathname) {
                        String name = pathname.getName().toLowerCase();
                        return name.endsWith(".gif")
                                        || name.endsWith(".jpeg")
                                        || name.endsWith(".jpg")
                                        || name.endsWith(".png");
                    }
                });

                System.out.println("Have " + images.length);

                int imageIndex = 0;

                try (InputStream is = socket.getInputStream();
                                BufferedReader reader = new BufferedReader(new InputStreamReader(is));
                                OutputStream os = socket.getOutputStream();
                                BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os))) {

                    boolean moreRequets = true;

                    do {

                        System.out.println("Waiting for consumer request");
                        String request = reader.readLine();
                        if ("NextImage".equals(request)) {

                            System.out.println("Get next image " + imageIndex);
                            if (images != null && imageIndex < images.length) {

                                File imageFile = images[imageIndex];
                                imageIndex++;

                                long length = imageFile.length();
                                String type = imageFile.getName();
                                type = type.substring(type.lastIndexOf(".") + 1).toLowerCase();

                                String response = new StringBuilder(128).
                                                append("NextImage;").
                                                append(type).
                                                append(";").
                                                append(length).toString();

                                System.out.println("Sending response to consumer " + response);
                                writer.write(response);
                                writer.newLine();
                                writer.flush();

                                System.out.println("Sending file...");
                                try (FileInputStream fis = new FileInputStream(imageFile)) {

                                    byte[] buffer = new byte[2048];
                                    int bytesRead = -1;
                                    while ((bytesRead = fis.read(buffer)) != -1) {

                                        os.write(buffer, 0, bytesRead);

                                    }

                                }

                                System.out.println("File sent...");

                            } else {

                                System.out.println("No more images...");
                                writer.write("NoMoreImages");
                                writer.newLine();
                                writer.flush();

                            }

                        } else if ("Bye".equals(request)) {

                            moreRequets = false;
                            System.out.println("Consumer has left the building...");

                        }

                    } while (moreRequets);

                }

            }

        } catch (IOException exp) {
            exp.printStackTrace();
        }

        System.out.println("Producer has left the building");
    }

}