- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我基本上想做的是在Java中实现实时视频流。即从一台计算机的网络摄像头获取视频,并将该视频实时发送到另一台计算机
这是我的服务器端代码,我在其中使用opencv库以循环的形式捕获图像,然后将其保存到文件中。
然后,我使用Filestream打开它,并将其发送到其他网络,下面是我的客户端代码
错误:
我在客户端仅获得一张图像,即从网络摄像头捕获的第一张图像
如何获得所有图像(即在客户端上作为视频)的解决方法是什么
我已经导入了所有必要的程序包
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”响应为止,此时它将退出。
消费者
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
public class Consumer {
public static void main(String[] args) {
System.out.println("Connecting to producer");
try (Socket socket = new Socket("localhost", 1234)) {
try (InputStream is = socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
OutputStream os = socket.getOutputStream();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os))) {
boolean moreImages = true;
int imageCount = 0;
do {
System.out.println("Requesting next image " + imageCount);
writer.write("NextImage");
writer.newLine();
writer.flush();
String response = reader.readLine();
System.out.println("Got response " + response);
if (response.startsWith("NextImage;")) {
String type = response.split(";")[1];
String lengthValue = response.split(";")[2];
long bytesToBeConsumed = Long.parseLong(lengthValue);
try (FileOutputStream fos = new FileOutputStream(new File("Image" + imageCount + "." + type))) {
long bytesThatHaveBeenConsumed = 0;
int bytesThatWereRead = 0;
byte[] buffer = new byte[2048];
System.out.println("Reading image of type " + type + " of byte length " + bytesToBeConsumed);
while (bytesThatHaveBeenConsumed != bytesToBeConsumed && (bytesThatWereRead = is.read(buffer)) != -1) {
bytesThatHaveBeenConsumed += bytesThatWereRead;
fos.write(buffer, 0, bytesThatWereRead);
}
System.out.println("Finished reading image " + imageCount + " with " + bytesThatHaveBeenConsumed + " bytes consumed");
}
imageCount++;
} else if (response.startsWith("NoMoreImages")) {
moreImages = false;
System.out.println("No more images...");
writer.write("Bye");
writer.newLine();
writer.flush();
}
} while (moreImages);
}
} catch (IOException exp) {
exp.printStackTrace();
}
System.out.println("Consumer has left the building...");
}
}
import 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");
}
}
关于sockets - 在Java中的套接字上循环传输时,我只得到一个图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26495165/
我使用下拉菜单提供一些不同的链接,但我希望这些链接在同一选项卡中打开,而不是在新选项卡中打开。这是我找到的代码,但我对 Javascript 非常缺乏知识 var urlmenu = docume
我对 javascript 不太了解。但我需要一个垂直菜单上的下拉菜单,它是纯 JavaScript,所以我从 W3 复制/粘贴脚本:https://www.w3schools.com/howto/t
我已经坐了 4 个小时,试图让我的导航显示下 zipper 接垂直,但它继续水平显示它们。我无法弄清楚为什么会发生这种情况或如何解决它。 如果有人能告诉我我做错了什么,我将不胜感激。我有一个潜移默化的
我正在尝试创建选项卡式 Accordion 样式下拉菜单。我使用 jQuery 有一段时间了,但无法使事件状态达到 100%。 我很确定这是我搞砸的 JS。 $('.service-button').
对于那些从未访问过 Dropbox 的人,这里是链接 https://www.dropbox.com/ 查看“登录”的下拉菜单链接。我如何创建这样的下 zipper 接? 最佳答案 这是 fiddle
我正在制作一个 Liferay 主题,但我在尝试设计导航菜单的样式时遇到了很多麻烦。我已经为那些没有像这样下拉的人改变了导航链接上的经典主题悬停功能: .aui #navigation .nav li
如果您将鼠标悬停在 li 上,则会出现一个下拉菜单。如果您将指针向下移至悬停时出现的 ul,我希望链接仍然带有下划线,直到您将箭头从 ul 或链接移开。这样你就知道当菜单下拉时你悬停在哪个菜单上。 知
我有一个带有多个下拉菜单的导航栏。因此,当我单击第一个链接时,它会打开下拉菜单,但是当我单击第二个链接时,第一个下拉菜单不会关闭。 (所以如果用户点击第二个链接我想关闭下拉菜单) // main.js
我正在尝试制作一个导航下拉菜单(使用 Bootstrap 3),其中链接文本在同一行上有多个不同的对齐方式。 在下面的代码中,下拉列表 A 中的链接在 HTML 中有空格字符来对齐它们,但是空白被忽略
我希望有人能帮我解决这个 Bootstrap 问题,因为我很困惑。 有人要求我在底部垂直对齐图像和其中包含图像的链接。 我面临的问题是他们还希望链接在链接/图像组合上具有 pull-right,这会杀
我正在构建一个 Rails 应用程序,并希望指向我的类的每个实例的“显示”页面的链接显示在“索引”页面的下拉列表中。我目前正在使用带有 options_from_collection_for_sele
我有以下 Bootstrap3 导航菜单 ( fiddle here )。我想设置“突出显示”项及其子链接与下拉列表 1 和 2 链接不同的链接文本(和悬停)的样式。我还希望能够以不同于 Highli
我对导航栏中的下拉菜单有疑问。对于普通的导航链接(无下拉菜单),我将菜单文本放在 H3 中,但是当我尝试对下 zipper 接执行相同操作时,箭头不在标题旁边,而是在标题下方。我决定用 span 替换
我是一名优秀的程序员,十分优秀!