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

Popular posts from this blog

Command prompt result in label. Python 2.7 -

javascript - How do I use URL parameters to change link href on page? -

amazon web services - AWS Route53 Trying To Get Site To Resolve To www -