Livestream in Java einbinden

1342

Aktives Mitglied
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
 
Zuletzt bearbeitet:
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?
 
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
 
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
 
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!
 
-> 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.
 
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
 
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.
 
Hallo Leute,

ich hab jetzt ein kleines Programm siehe hier:

Java:
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 zugewiflen
		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ˆfle wird ermittelt
		setPreferredSize(imageSize); // Grˆfle 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)
at webcam.MJPG.readLine(MJPG.java:221)
at webcam.MJPG.readLine(MJPG.java:205)
at webcam.MJPG.readMJPGStream(MJPG.java:182)
at webcam.MJPG.readStream(MJPG.java:157)
at webcam.MJPG.run(MJPG.java:239)
at java.lang.Thread.run(Thread.java:637)
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)
at webcam.MJPG.readLine(MJPG.java:221)
at webcam.MJPG.readLine(MJPG.java:205)
at webcam.MJPG.readMJPGStream(MJPG.java:180)
at webcam.MJPG.readStream(MJPG.java:157)
at webcam.MJPG.run(MJPG.java:239)
at java.lang.Thread.run(Thread.java:637)
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)
at webcam.MJPG.readLine(MJPG.java:221)
at webcam.MJPG.readLine(MJPG.java:205)
at webcam.MJPG.readMJPGStream(MJPG.java:180)
at webcam.MJPG.readStream(MJPG.java:157)
at webcam.MJPG.run(MJPG.java:239)
at java.lang.Thread.run(Thread.java:637)
java.io.IOException: Stream closed
Can't open input Streamjava.io.IOException: Stream closed
Can't open input Streamjava.io.IOException: Stream closed
Can't open input Streamjava.io.IOException: Stream closed
Can't open input Streamjava.io.IOException: Stream closed
Can't open input Streamjava.io.IOException: Stream closed
Can't open input Streamjava.io.IOException: Stream closed
Can't open input Streamjava.io.IOException: Stream closed
Can't open input Streamjava.io.IOException: Stream closed
Can't open input Streamjava.io.IOException: Stream closed
Can't open input Streamjava.io.IOException: Stream closed
Can't open input Streamjava.io.IOException: Stream closed
Can't open input Streamjava.io.IOException: Stream closed
Can't open input Streamjava.io.IOException: Stream closed
Can't open input Streamjava.io.IOException: Stream closed
Can't open input Streamjava.io.IOException: Stream closed
Can't open input Streamjava.io.IOException: Stream closed
Can't open input Streamjava.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)
at webcam.MJPG.readLine(MJPG.java:221)
at webcam.MJPG.readLine(MJPG.java:205)
at webcam.MJPG.readMJPGStream(MJPG.java:180)
at webcam.MJPG.readStream(MJPG.java:157)
at webcam.MJPG.run(MJPG.java:239)
at java.lang.Thread.run(Thread.java:637)

Kann mir vielleicht jemand helfen?

mfg 1342
 
Zuletzt bearbeitet:
"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
 
Zeile 195 und 196 hab ich auskommentiert:

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


Funktioniert perfekt! 🙂
 
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?)
 

Zurück
Oben