# Livestream in Java einbinden



## 1342 (25. Aug 2010)

Hallo,

ich habe ein Problem.
Ich habe eine WLAN-Kamera(7Link PX-3309) gekauft und möchte nun ein Programm mit Eclipse schreiben, welches mir den Live Stream der Kamera in einem Applet ausgibt.
Die Videos der Kamera sind im Avi-Format.

Ich weiss nicht wie ich da anfangen soll.

Kann jemand helfen?

Gruß, 1342


----------



## Gast2 (25. Aug 2010)

such mal im JMF nach AVI ... ansonsten reicht da zum Testen erstmal das JPG selber

ps: ich habe gerade nichts in der Anleitung gefunden ... hast Du ein Handbuch wo der Temperaturbereich und IP (Schutzart) drinnen stehen? ... wenn ja - was für Werte?


----------



## 1342 (25. Aug 2010)

Hallo mogel,

ich hab das JMF gerade eben installiert und weiß nicht wie ich nach AVI suchen soll, oder was ich damit machen kann.
Und was heißt zum testen? Ich weiß noch nicht mal wie ich anfangen soll zu programmieren, kann ich mit dem JMF etwas machen?

Warum willst du die Schutzart und den Temperaturbereich wissen?

mfg 1342


----------



## Gast2 (25. Aug 2010)

1342 hat gesagt.:


> ich hab das JMF gerade eben installiert und weiß nicht wie ich nach AVI suchen soll, oder was ich damit machen kann. Und was heißt zum testen? Ich weiß noch nicht mal wie ich anfangen soll zu programmieren, kann ich mit dem JMF etwas machen?


so genau kann ich Dir da auch nicht helfen ... mit Java mache ich recht wenig Video/Audio ... aber das JMF kannst Du eigentlich dafür verwenden - evt. mit FMJ ... was eine freie (?) Implementierung ist



> Warum willst du die Schutzart und den Temperaturbereich wissen?


weil ich eine Kamera suche die ich unters Dach hängen kann, damit meine Frau sehen kann wer da an der Tür klingelt


----------



## 1342 (25. Aug 2010)

Okay danke dir aber, ich hoff noch auf andere hilfen .

Also ich hab auch nichts gefunden was für eine IP sie hat und den Temperaturbereich, aber ich würd sagen unter das Dach wenn kein Regen an die Kamera kommt ist sie geeignet. Sie hat auch Nachtsicht also funktioniert gut in der Nacht.

Ich dank dir!


----------



## Kr0e (25. Aug 2010)

-> GStreamer-Java. JMF/FMJ sind auf gut deutsch scheiße und bekommt man nur mit überdimensionalen mehraufwand zum laufen.
Um iwas abzuspielen/umzuwandeln werden haufenweise Plugins benötigt... JMF wird schon seit Jahren nicht mehr weiterentwickelt und FMJ ist auch mehr alpha als beta...
Ansonsten Xuggler und direkt die einzelnen Bilder mit Timpstamp holen und dann entsprechend des Timestamp mit einem Timer
zum "Leben" bringen.


----------



## 1342 (25. Aug 2010)

Das hört sich alles cool an. Aber ich weiß wirklich nicht bei was ich überhaupt anfangen soll, meine frage ist einfach woher bekomm ich die Information mit was ich anfangen muss damit ich ein Livestream von meiner Kamera in mein Programm rein zu bekommen? Ich hab noch nicht so viel Erfahrung im Programmieren.
mfg


----------



## Tomate_Salat (25. Aug 2010)

Habe ich auch in naher zukunft vor aber noch nicht großartig mit auseinander gesetzt. Ich hoffe darauf, dass ich über eine URL an die Kamera rankomme und darüber einen Stream aufbauen kann => dann könnte man schauen, dass man die WebCam auf DynDNS registriert bekommt und ich kann von überall drauf zugreifen.


----------



## 1342 (31. Aug 2010)

Hallo Leute,

ich hab jetzt ein kleines Programm siehe hier:


```
package webcam; // Klasse gehˆrt zum Paket webcam

//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
{
	// Definition der Attribute
	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 zugewiﬂen
		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 auf 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 auf 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 ab
		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 auf 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
	}	
}
```


Nur hab ich jetzt ein kleines Problem, ich bekomme ein Bild von meiner WLAN Kamera hin aber nach 5-10Sekunden bekomm ich diese Fehlermeldungen im 100stelSekundenTakt:



> java.io.IOException: Stream closed
> at java.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.java:145)
> at java.io.BufferedInputStream.read(BufferedInputStream.java:308)
> at java.io.DataInputStream.read(DataInputStream.java:132)
> ...



Kann mir vielleicht jemand helfen?

mfg 1342


----------



## Gast2 (31. Aug 2010)

> java.io.IOException: Stream closed


Deine Kamera hat den Stream geschlossen


----------



## 1342 (31. Aug 2010)

Ja und die frage ist warum sie das nach ca. 5-10Sekunden macht?
Problem gelöst


----------



## Tomate_Salat (31. Aug 2010)

"Problem gelöst" hilft anderen mit womöglich dem selben Problem nicht weiter, wäre nett, wenn du die Lösung posten könntest. Danke


----------



## 1342 (31. Aug 2010)

Zeile 195 und 196 hab ich auskommentiert:

 e.printStackTrace(); // Fehler auf Konsole ausgeben
 disconnect(); // Methode aufrufen


Funktioniert perfekt!


----------



## Friedhelm (31. Aug 2010)

Welche Cam's kann ich mit diesem Stück Code anzapfen und einen MJPEG Stream anfordern?

Ich überlege mir auch eine Cam zu kaufen, evtl eine ohne WLAN, also mit einfacher LAN-Buchse.
(gibts da gescheite mit IR-Sensor?)


----------



## Tomate_Salat (31. Aug 2010)

Steht doch im ersten post:


> WLAN-Kamera(7Link PX-3309)


----------



## Friedhelm (31. Aug 2010)

Tomate_Salat hat gesagt.:


> Steht doch im ersten post:



Ja, nur meinte ich ja noch andere Cam's ausser dieser 
(siehe: "Cam ohne WLAN")


----------

