capturing video from ip camera

13,227

jpeg magic code is "0xff 0xd8" and not "0x0d 0x0a" (see [1]), that why your code fails. Maybe your code part which strips lines in readMJPGStream() is to hungry :)

[1] http://en.wikipedia.org/wiki/JPEG

Share:
13,227
Ruby
Author by

Ruby

Software Engineer, Love Java Coding

Updated on June 04, 2022

Comments

  • Ruby
    Ruby almost 2 years

    I am trying to capture video from ip camera into my application , its giving exception

    com.sun.image.codec.jpeg.ImageFormatException: Not a JPEG file: starts with 0x0d 0x0a
        at sun.awt.image.codec.JPEGImageDecoderImpl.readJPEGStream(Native Method)
        at sun.awt.image.codec.JPEGImageDecoderImpl.decodeAsBufferedImage(Unknown Source)
        at test.AxisCamera1.readJPG(AxisCamera1.java:130)
        at test.AxisCamera1.readMJPGStream(AxisCamera1.java:121)
        at test.AxisCamera1.readStream(AxisCamera1.java:100)
        at test.AxisCamera1.run(AxisCamera1.java:171)
        at java.lang.Thread.run(Unknown Source)
    

    its giving exception at image = decoder.decodeAsBufferedImage();

    Here is the code i am trying

    private static final long serialVersionUID = 1L;
        public boolean useMJPGStream = true;
        public String jpgURL = "http://ip here/video.cgi/jpg/image.cgi?resolution=640×480";
        public String mjpgURL = "http://ip here /video.cgi/mjpg/video.cgi?resolution=640×480";
        DataInputStream dis;
        private BufferedImage image = null;
        public Dimension imageSize = null;
        public boolean connected = false;
        private boolean initCompleted = false;
        HttpURLConnection huc = null;
        Component parent;
    
        /** Creates a new instance of AxisCamera */
        public AxisCamera1(Component parent_) {
            parent = parent_;
        }
    
        public void connect() {
            try {
                URL u = new URL(useMJPGStream ? mjpgURL : jpgURL);
                huc = (HttpURLConnection) u.openConnection();
    
                // System.out.println(huc.getContentType());
                InputStream is = huc.getInputStream();
    
                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(60);
                } 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);
            parent.setSize(imageSize);
            parent.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();
                        parent.repaint();
                    }
                } else {
                    while (true) {
                        connect();
                        readJPG();
                        parent.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() {
            System.out.println("in Run...................");
            connect();
            readStream();
        }
    
        @SuppressWarnings("deprecation")
        public static void main(String[] args) {
    
    
            JFrame jframe = new JFrame();
            jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            AxisCamera1 axPanel = new AxisCamera1(jframe);
            new Thread(axPanel).start();
            jframe.getContentPane().add(axPanel);
            jframe.pack();
            jframe.show();
        }
    
    }
    

    Any suggestions what I am doing wrong here??