Hallo Java Freunde,
ich hab hier ein kleines Problem. Ich betreibe eine WLAN-Kamera und habe zur Wiedergabe des Livestreams und zur Steuerung ein Programm geschrieben.
Das Problem ist nun dass das Bild sich kurzzeitig aufhängt und nach 5-10sek wieder läuft.
Hier hab ich mal die Fehlerausgabe:
Hier ist der Quellcode meines Programmes:
Suche seit Tagen eine Lösung und finde keine, ihr seid meine letzte Hoffnung.
mfg 1342
ich hab hier ein kleines Problem. Ich betreibe eine WLAN-Kamera und habe zur Wiedergabe des Livestreams und zur Steuerung ein Programm geschrieben.
Das Problem ist nun dass das Bild sich kurzzeitig aufhängt und nach 5-10sek wieder läuft.
Hier hab ich mal die Fehlerausgabe:
Java:
com.sun.image.codec.jpeg.ImageFormatException: Not a JPEG file: starts with 0x0b 0x01
at sun.awt.image.codec.JPEGImageDecoderImpl.readJPEGStream(Native Method)
at sun.awt.image.codec.JPEGImageDecoderImpl.decodeAsBufferedImage(Unknown Source)
at wlankamera.MJPG.readJPG(MJPG.java:193)
at wlankamera.MJPG.readMJPGStream(MJPG.java:183)
at wlankamera.MJPG.readStream(MJPG.java:159)
at wlankamera.MJPG.run(MJPG.java:241)
at java.lang.Thread.run(Unknown Source)
com.sun.image.codec.jpeg.ImageFormatException: Not a JPEG file: starts with 0x00 0x61
at sun.awt.image.codec.JPEGImageDecoderImpl.readJPEGStream(Native Method)
at sun.awt.image.codec.JPEGImageDecoderImpl.decodeAsBufferedImage(Unknown Source)
at wlankamera.MJPG.readJPG(MJPG.java:193)
at wlankamera.MJPG.readMJPGStream(MJPG.java:183)
at wlankamera.MJPG.readStream(MJPG.java:159)
at wlankamera.MJPG.run(MJPG.java:241)
at java.lang.Thread.run(Unknown Source)
com.sun.image.codec.jpeg.ImageFormatException: Not a JPEG file: starts with 0xe3 0xfc
at sun.awt.image.codec.JPEGImageDecoderImpl.readJPEGStream(Native Method)
at sun.awt.image.codec.JPEGImageDecoderImpl.decodeAsBufferedImage(Unknown Source)
at wlankamera.MJPG.readJPG(MJPG.java:193)
at wlankamera.MJPG.readMJPGStream(MJPG.java:183)
at wlankamera.MJPG.readStream(MJPG.java:159)
at wlankamera.MJPG.run(MJPG.java:241)
at java.lang.Thread.run(Unknown Source)
com.sun.image.codec.jpeg.ImageFormatException: Not a JPEG file: starts with 0x00 0x70
at sun.awt.image.codec.JPEGImageDecoderImpl.readJPEGStream(Native Method)
at sun.awt.image.codec.JPEGImageDecoderImpl.decodeAsBufferedImage(Unknown Source)
at wlankamera.MJPG.readJPG(MJPG.java:193)
at wlankamera.MJPG.readMJPGStream(MJPG.java:183)
at wlankamera.MJPG.readStream(MJPG.java:159)
at wlankamera.MJPG.run(MJPG.java:241)
at java.lang.Thread.run(Unknown Source)
com.sun.image.codec.jpeg.ImageFormatException: Not a JPEG file: starts with 0x96 0xdd
at sun.awt.image.codec.JPEGImageDecoderImpl.readJPEGStream(Native Method)
at sun.awt.image.codec.JPEGImageDecoderImpl.decodeAsBufferedImage(Unknown Source)
at wlankamera.MJPG.readJPG(MJPG.java:193)
at wlankamera.MJPG.readMJPGStream(MJPG.java:183)
at wlankamera.MJPG.readStream(MJPG.java:159)
at wlankamera.MJPG.run(MJPG.java:241)
at java.lang.Thread.run(Unknown Source)
com.sun.image.codec.jpeg.ImageFormatException: Not a JPEG file: starts with 0x0b 0x01
at sun.awt.image.codec.JPEGImageDecoderImpl.readJPEGStream(Native Method)
at sun.awt.image.codec.JPEGImageDecoderImpl.decodeAsBufferedImage(Unknown Source)
at wlankamera.MJPG.readJPG(MJPG.java:193)
at wlankamera.MJPG.readMJPGStream(MJPG.java:183)
at wlankamera.MJPG.readStream(MJPG.java:159)
at wlankamera.MJPG.run(MJPG.java:241)
at java.lang.Thread.run(Unknown Source)
Hier ist der Quellcode meines Programmes:
Java:
package wlankamera; // Klasse gehört zum Paket wlankamera
//Import der benötigten Pakete
import java.io.*;
import java.net.*;
import java.awt.*;
import javax.swing.*;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageDecoder;
//Die Klasse wird erweiter durch JPanel und ist abgeleitet von Runnable
public class MJPG extends JPanel implements Runnable
{
// Attribute definieren
public boolean useMJPGStream = true;
public boolean connected = false;
private boolean initCompleted = false;
public String jpgURL;
public String mjpgURL;
private String username;
private String password;
private String base64authorization = null;
private Image image = null;
public Dimension imageSize = null;
DataInputStream dis;
HttpURLConnection huc = null;
public MJPG (String Daten[]) // Konstruktor
{
// Übergebene Daten werden den Variablen zugewiesen
mjpgURL = "http://"+Daten[0]+"/videostream.cgi";
jpgURL = "http://"+Daten[0]+"/videostream.cgi";
username = Daten[4];
password = Daten[1];
// Benutze Benutzer und Passwort nur wenn sie gegeben sind
if(username == null || password == null) // Wenn eine der Variablen leer ist
{
System.out.println("Kein Benutzer angegeben!"); // Gibt eine Meldung in der Konsole aus
}
else
{
// Ruft eine Methode auf und speichert deren Rückgabewert in eine Variable
base64authorization = this.encodeUsernameAndPasswordInBase64(username, password);
}
}
// Verschlüsselt Benutzer und Passwort
private String encodeUsernameAndPasswordInBase64(String usern, String psswd)
{
String s = usern + ":" + psswd; // Benutzername und Passwort in eine Variable schreiben
String encs = new sun.misc.BASE64Encoder().encode(s.getBytes()); // Verschlüsselung des Strings
return "Basic " + encs; // Wert zurückgeben
}
// Verbindung zur Kamera aufbauen
public void connect()
{
try // Versuche
{
URL u = new URL(useMJPGStream?mjpgURL:jpgURL); // Ein neues URL objekt wird erstellt
// Es wird eine URL Verbindung mit speziellen HTTP Methoden erzeugt
huc = (HttpURLConnection) u.openConnection();
// Wenn die Verschlüsselung stattgefunden hat
if(base64authorization != null) // Wenn die Variable ungleich null ist
{
huc.setDoInput(true); // Benutze die URLConnection als Eingabe benutzt
// Benutzer und Passwort benutzen
huc.setRequestProperty("Authorization",base64authorization);
huc.connect(); // Die Verbindung wird geöffnet
}
InputStream is = huc.getInputStream(); // Es wird von der geöffneten Verbindung gelesen
connected = true; // Wert der Variable setzen
BufferedInputStream bis = new BufferedInputStream(is); // Ein Lesepuffer wird verwendet
// Stellt Routinen zur Verfügung, mit denen Werte der Standarddatentypen aus
// einem Stream gelesen werden können
dis = new DataInputStream(bis);
if (!initCompleted) // Wenn Variable false ist
{
initDisplay(); // Methode aufrufen
}
}
// Bei einem Fehler wird nochmals probiert eine Verbindung herzustellen
catch(IOException e) // Wird ausgeführt wenn ein Fehler stattgefunden hat
{
try // Versuche
{
huc.disconnect(); // HTTPURLConnection trennen
Thread.sleep(60); // Thread schlafen lassen
}
catch(InterruptedException ie) // Beim einem Fehler
{
huc.disconnect(); // // HTTPURLConnection trennen
connect(); // Methode aufrufen
}
connect(); // Methode aufrufen
}
catch(Exception e) // Bei einem Fehler
{
}
}
// Anzeige einstellen
public void initDisplay()
{
if (useMJPGStream) // Wenn der MJPG Stream verwendet wird
{
readMJPGStream(); // Methode aufrufen
}
else // Wenn der JPG Bilder verwendet werden
{
readJPG(); // Methode aufrufen
disconnect(); // Methode aufrufen
}
imageSize = new Dimension(image.getWidth(this), image.getHeight(this)); // Bildgröße wird ermittelt
setPreferredSize(imageSize); // Größe des JPanel wird gesetzt
initCompleted = true; // Variable wird auf true gesetzt
}
// DataInputStream trennen
public void disconnect()
{
try // Versuche
{
if(connected) // Wenn Verbindung zur Kamera vorhanden
{
dis.close(); // DataInputStream wird geschlossen
connected = false; // Variable wird buttonauf false gesetzt
}
}
catch(Exception e) // Bei einem Fehler
{
}
}
// Bild auf JPanel zeichnen
public void paint(Graphics g)
{
if (image != null) // Wenn Bild in Variable gespeichert
{
g.drawImage(image, 0, 0, this); // Bild auf das Panel setzen
}
}
// Methode um ständig den Stream zu lesen
public void readStream()
{
try // Versuche
{
if (useMJPGStream) // Wenn MJPG Stream verwendet wird
{
while(true) // Endlosschleife
{
readMJPGStream(); // Methode aufrufen
repaint(); // Bild neu zeichnen
}
}
else // Wenn JPG Bilder verwendet werden
{
while(true) // Endlosschleife
{
connect(); // Methode aufrufen
readJPG(); // Methode aufrufen
repaint(); // Methode aufrufen
disconnect(); // Methode aufrufen
}
}
}
catch(Exception e) // Bei einem Fehler
{
}
}
// Bild aus dem Stream lesen
public void readMJPGStream()
{
readLine(4,dis); // Verwirft die ersten 4 Linien
readJPG(); // Methode aufrufen
readLine(1,dis); // Verwirft die letzte Linie
}
// Liest das eingebettete Bild
public void readJPG()
{
try // Versuche
{
JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(dis); // JPEG Dekoder erstellen
image = decoder.decodeAsBufferedImage(); // Bild als BufferedImage in Variable speichern
}
catch(Exception e) // Bei einem Fehler wird folgender Code ausgeführt
{
e.printStackTrace(); // Fehler buttonauf Konsole ausgeben
//disconnect(); // Methode aufrufen
}
}
// Liest die Linien heraus
public void readLine(int n, DataInputStream dis)
{
for (int i=0; i<n; i++) // Wird so oft ausgeführt so viele Linien man heraus schneiden will
{
readLine(dis); // Methode aufrufen
}
}
// Zeilen lesen
public void readLine(DataInputStream dis)
{
try // Versuche
{
boolean end = false; // Deklaration
String lineEnd = "\n"; // Zeichen für das Ende der Linie
byte[] lineEndBytes = lineEnd.getBytes(); // String in Bytes umwandeln
byte[] byteBuf = new byte[lineEndBytes.length]; // Länge von lineEndBytes
while(!end) // Solange end = false
{
dis.read(byteBuf,0,lineEndBytes.length); // Ausschnitt aus dem Stream lesen
String t = new String(byteBuf); // Gelesenes in String schreiben
if(t.equals(lineEnd)) // Wenn Zeilenende erreicht
{
end = true; // Variable aus true setzen
}
}
}
catch(Exception e) // Wird bei einem Fehler ausgeführt
{
e.printStackTrace(); // Fehler auf Konsole ausgeben
}
}
// Hauptmethode wird beim Starten des Threads ausgeführt
public void run()
{
connect(); // Methode aufrufen
readStream(); // Methode aufrufen
}
// Getter Methode für die Screenshot-Funktion
public Image getImage()
{
return image; // Variable image zurückgeben
}
}
Suche seit Tagen eine Lösung und finde keine, ihr seid meine letzte Hoffnung.
mfg 1342