opencv - TCP Webcam Streaming in java -
thanks reading , sorry bad english in advance.
i'm working on webcam streaming opencv. final goal making skype-like application. i'm trying basic 1:1 tcp model first.
about tcp 1:1 model,
after connection, client send real-time webcam frames , server receive , display in on jpanel.
i did receiving picture , displaying on jpanel far.
i'm trying receive successive frames.
@ first, problem server side socket seems waiting until inputs client finished, i.e, never stops because real-time frames continuously sent.
sent every frame size before sending frame escape unstoppable waiting.
doesn't work well. client keeps sending frames, server doesn't receive well.
example, if client send around 25k byte sized frames, server receive 1 3 bytes per 1 read buffer size 512.
clientthread.java
package client; import java.io.bytearrayinputstream; import java.io.bytearrayoutputstream; import java.io.datainputstream; import java.io.dataoutputstream; import java.io.ioexception; import java.io.inputstream; import java.io.outputstream; import java.net.socket; import javax.imageio.imageio; import video.videocap; public class clientthread extends thread { string serverip; int serverport; socket socket; videocap videocap; public clientthread(socket socket, string serverip, int serverport, videocap videocap) { this.socket = socket; this.serverip = serverip; this.serverport = serverport; this.videocap = videocap; } public void run() { while (clientui.calling) { try { inputstream in = socket.getinputstream(); datainputstream dis = new datainputstream(in); outputstream out = socket.getoutputstream(); dataoutputstream dos = new dataoutputstream(out); // receive int bufsize = dis.readint(); while (clientui.calling) { bytearrayoutputstream baos = new bytearrayoutputstream(); imageio.write(videocap.getoneframe(), "jpg", baos); inputstream inputimage = new bytearrayinputstream(baos.tobytearray()); // frame size dos.writeint(baos.size()); out(inputimage, baos, bufsize); thread.sleep(5000); } } catch (ioexception | interruptedexception e) { e.printstacktrace(); } } } void out(inputstream in, outputstream out, int bufsize) { long size = 0; try { byte[] buf = new byte[bufsize]; int n; while ((n = in.read(buf)) > 0) { out.write(buf, 0, n); size += n; system.out.println("size: " + size); } } catch (ioexception e) { e.printstacktrace(); } { system.out.println(getclass().getname() + " :: out >>> sent size: " + size); } } }
serverthread.java
package server; import java.awt.image.bufferedimage; import java.io.bytearrayinputstream; import java.io.bytearrayoutputstream; import java.io.datainputstream; import java.io.dataoutputstream; import java.io.ioexception; import java.io.inputstream; import java.io.outputstream; import java.net.serversocket; import java.net.socket; import javax.imageio.imageio; import javax.swing.jpanel; public class serverthread extends thread { serversocket serversocket; socket socket; jpanel panel; byte[] buf; public serverthread(serversocket serversocket, jpanel panel, int bufsize) { this.serversocket = serversocket; this.panel = panel; buf = new byte[bufsize]; } public void run() { try { system.out.println("waiting client"); socket = serversocket.accept(); system.out.println("client accepted"); inputstream in = socket.getinputstream(); datainputstream dis = new datainputstream(in); outputstream out = socket.getoutputstream(); dataoutputstream dos = new dataoutputstream(out); dos.writeint(buf.length); while (serverui.calling) { int framesize = dis.readint(); bytearrayoutputstream outimage = new bytearrayoutputstream(); long size = 0; int n; while (framesize >= size) { n = dis.read(buf); if (n == -1) break; outimage.write(buf, 0, n); size += n; system.out.println(n); } inputstream inputimage = new bytearrayinputstream(outimage.tobytearray()); bufferedimage bufferedimage = imageio.read(inputimage); panel.getgraphics().drawimage(bufferedimage, 0, 0, null); } } catch (ioexception e) { e.printstacktrace(); } } }
i changed dataoutput/inputstream objectoutput/inputstream. i'm not sure why did not go well, guess because of serializing problem. byte not necessary serialized don't know exactly.
i'll provide anyhow working codes. because of audioserver divided 2 thread previous codes , codes below pretty different.
videoserverthread.java
import java.awt.image.bufferedimage; import java.io.bytearrayinputstream; import java.io.ioexception; import java.io.inputstream; import java.io.objectinputstream; import java.io.serializable; import java.net.serversocket; import java.net.socket; import javax.imageio.imageio; import javax.swing.jpanel; public class videoserverthread extends thread { private serversocket serversocket; int videoserverport; private socket socket; private jpanel panel; private boolean calling; public videoserverthread(serversocket serversocket, int videoserverport, jpanel panel, boolean calling) { this.serversocket = serversocket; this.videoserverport = videoserverport; this.panel = panel; this.calling = calling; } @override public void run() { system.out.println("video server opened!"); try { serversocket = new serversocket(videoserverport); socket = serversocket.accept(); inputstream in = socket.getinputstream(); objectinputstream ois = new objectinputstream(in); bufferedimage bufferedimage; inputstream inputimage; frame f; while (calling) { f = (frame) ois.readobject(); inputimage = new bytearrayinputstream(f.bytes); bufferedimage = imageio.read(inputimage); panel.getgraphics().drawimage(bufferedimage, 0, 0, panel.getwidth(), panel.getheight(), null); panel.getgraphics().drawimage(bufferedimage, 0, 0, null); bufferedimage.flush(); inputimage.close(); f = null; } } catch (ioexception e) { e.printstacktrace(); } catch (classnotfoundexception e) { e.printstacktrace(); } } class frame implements serializable { public byte[] bytes; public frame(byte[] bytes) { this.bytes = bytes; } public int size() { return bytes.length; } } }
videoclientthread.java
import java.awt.image.bufferedimage; import java.io.bytearrayoutputstream; import java.io.ioexception; import java.io.objectoutputstream; import java.net.socket; import javax.imageio.imageio; import common.frame; import video.videocap; public class videoclientthread extends thread { private final string formattype = "jpg"; private videocap videocap; private socket socket; private string ip; private int port; private boolean calling; public videoclientthread(videocap videocap, socket socket, string ip, int port, boolean calling) { this.videocap = videocap; this.socket = socket; this.ip = ip; this.port = port; this.calling = calling; } public void run() { try { socket = new socket(ip, port); socket.setsotimeout(5000); objectoutputstream oos = new objectoutputstream(socket.getoutputstream()); frame f; bufferedimage bufferedimage; while (calling) { bytearrayoutputstream fbaos = new bytearrayoutputstream(); bufferedimage = videocap.getoneframe(); imageio.write(bufferedimage, formattype, fbaos); f = new frame(fbaos.tobytearray()); oos.writeobject(f); oos.flush(); bufferedimage.flush(); // thread.sleep(33); } } catch (ioexception e) { e.printstacktrace(); } // catch (interruptedexception e) // { // e.printstacktrace(); // } } }
Comments
Post a Comment