Sockets 在java中,通过套接字在循环中传输时,我只得到一个图像
基本上我想做的是用java实现实时视频流。i、 e在一台计算机的网络摄像头前抓取视频,并将该视频实时发送到另一台计算机 这是我的服务器端代码,我使用opencv库在循环中获取图像,然后将其保存到文件中。 然后,我使用文件流打开它并将其发送到其他网络,下面是我的客户端代码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
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");
}
}