import java.applet.Applet; import java.awt.Component; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Image; import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGImageDecoder; /** * * @author David E. Mireles, Ph.D. */ public class LiveDemo extends Applet implements Runnable { /** * */ private static final long serialVersionUID = 1L; public boolean useMJPGStream = false;//true; public String jpgURL="http://10.0.0.81/axis-cgi/jpg/image.cgi?resolution=1024x768"; public String mjpgURL="http://10.0.0.81/axis-cgi/jpg/image.cgi?resolution=1024x768"; DataInputStream dis; private Image image = null; public Dimension imageSize = null; public boolean connected = false; private boolean initCompleted = false; HttpURLConnection huc = null; Component parent; /** Creates a new instance of Ax52Camera */ public void init() { new Thread(this).start(); } public void connect(){ try{ URL u = new URL(useMJPGStream?mjpgURL:jpgURL); huc = (HttpURLConnection)u.openConnection(); System.out.println(huc.getContentType()); InputStream is = huc.getInputStream(); System.out.println(is.toString()); connected = true; BufferedInputStream bis = new BufferedInputStream(is); dis= new DataInputStream(bis); if (!initCompleted) initDisplay(); }catch(IOException e){ //incase no connection exists wait and try again, instead of printing the error try{ huc.disconnect(); Thread.sleep(33); }catch(InterruptedException ie){huc.disconnect();connect();} connect(); }catch(Exception e){;} } public void initDisplay(){ //setup the display if (useMJPGStream)readMJPGStream(); else {readJPG();disconnect();} imageSize = new Dimension(image.getWidth(this), image.getHeight(this)); setPreferredSize(imageSize); this.setSize(imageSize); this.validate(); initCompleted = true; } public void disconnect(){ try{ if(connected){ dis.close(); connected = false; } }catch(Exception e){;} } public void paint(Graphics g) { //used to set the image on the panel if (image != null) g.drawImage(image, 0, 0, this); } public void readStream(){ //the basic method to continuously read the stream try{ if (useMJPGStream){ while(true){ readMJPGStream(); this.repaint(); } } else{ while(true){ connect(); readJPG(); this.repaint(); disconnect(); } } }catch(Exception e){;} } public void readMJPGStream(){ //preprocess the mjpg stream to remove the mjpg encapsulation readLine(3,dis); //discard the first 3 lines readJPG(); readLine(2,dis); //discard the last two lines } public void readJPG(){ //read the embedded jpeg image try{ JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(dis); image = decoder.decodeAsBufferedImage(); }catch(Exception e){e.printStackTrace();disconnect();} } public void readLine(int n, DataInputStream dis){ //used to strip out the header lines for (int i=0; i<n;i++){ readLine(dis); } } public void readLine(DataInputStream dis){ try{ boolean end = false; String lineEnd = "\n"; //assumes that the end of the line is marked with this byte[] lineEndBytes = lineEnd.getBytes(); byte[] byteBuf = new byte[lineEndBytes.length]; while(!end){ dis.read(byteBuf,0,lineEndBytes.length); String t = new String(byteBuf); //System.out.print(t); //uncomment if you want to see what the lines actually look like if(t.equals(lineEnd)) end=true; } }catch(Exception e){e.printStackTrace();} } public void run() { connect(); readStream(); } }
var
This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)