# Livestream als AVI speichern



## 1342 (13. Sep 2010)

Hallo zusammen,

ich habe ein Programm, welches einen Livestream einer WLAN kamera anzeigt.

Nun würde ich diesen Livestream gerne als avi speichern. Momentan speichert es mir zwar was ab, aber ich kann es mit keinem PLayer wiedergeben.

Hier ist der code:

```
public class iListener implements ItemListener  // Interne Klasse iListener
    {    
        private AbstractButton button; // Privates Attribut        
        
        // Wird aufgerufen wenn sich bei "Record" was ändert
        public void itemStateChanged(ItemEvent e)    
        {    
            button = (AbstractButton)e.getItem(); // Gibt das auslösende Objekt zurück
                            
            if(button.isSelected()) // Wenn "Record" gesetzt
            {
                try // Versuche
                {
                Date dt = new Date(); // Datum erzeugen
                SimpleDateFormat dtformat = new SimpleDateFormat("dd.MM.yyyy 'at' HH.mm.ss");// Datumsformat festlegen
                URL url = new URL("http://"+Daten[0]+"/videostream.cgi?&user=benutzer&pwd=passwort&resolution=32");
                URLConnection conn = url.openConnection();
                BufferedInputStream stream = new BufferedInputStream(conn.getInputStream());
                FileOutputStream fos = new FileOutputStream(Daten[3] + "\\"+ dtformat.format(dt) +".avi"); 
                char  buffer[] = new char[0xffff];
                int   nbytes;

                while( (nbytes=stream.read()) != 3) {
                    fos.write(0);

                } 
            }
                catch(IOException e1) // Wird ausgeführt wenn ein Fehler stattgefunden hat
                {
                      e1.printStackTrace();
                }
                                        
            }                
        }
    }
```

Ich suche schon seit Tagen im Netz, finde aber keine passende Lösung.

Hat jemand von Euch ne Ahnung? Ich bin am Verzweifeln......

Gruß


----------



## SlaterB (13. Sep 2010)

allein mit wiederholten 
> fos.write(0);
gedenkst du einen Stream zu speichern?


----------



## Kr0e (13. Sep 2010)

Was zum Henker soll

                while( (nbytes=stream.read()) != 3) {
                    fos.write(0);

                } 

bewirken  ?? Du schreibst unendlich viele Nullen damit!! Du liest ein Zeichen in nBytes aber nur wenn es ungleich 3 ist, schreibst du ne Null HÄ ?!

Nichtmal VLC PLayer dürfte das abspielen können^^ Und der kann alles!


----------



## 1342 (13. Sep 2010)

hm, ich hab den code im netz gefunden und in mein programm eingefügt.

die "3" war eigentlich eine"-1", aber wenn ich es bei einer "-1" lasse stürzt mir das programm komplett ab?????

Da ich noch nicht so lange mit Java arbeite weiss ich leider nicht mal genau was dieser teil genau macht:
	
	
	
	





```
while( (nbytes=stream.read()) != 3) {
                    fos.write(0);
```

gibt es den noch andere Möglichkeiten als > fos.write(0); ?

Danke!!


----------



## Kr0e (13. Sep 2010)

Ne Menge 

Learn the basics. Es bringt nix, wenn dir hier einer erklärt, wie man es löst... Du hast ja auch gerade gesagt, dass du den Code aus dem Internet hast. Ein-zwei wochen ein Tut durcharbeiten und du wirst dir an den Kopf fassen wenn du dir den Code oben nochmal anschaust 


PS:

Vlt. schonmal als Starthilfe: Lerne alles bzg. Streams. Sprich java.net.io ist das was du dir anschauen solltest.


----------



## Blakh (13. Sep 2010)

```
while( (nbytes=stream.read()) != -1) {
fos.write(0);

}
```

Das würde schon mehr Sinn machen. Dann schreibst du solange Nullen, bis der Stream zu Ende ist . Was passiert denn wenn du fos.write(nbytes) machst?


----------



## 1342 (13. Sep 2010)

Danke für den Tipp!

also wenn ich es so mache, dann änderts sich eigentlich nichts, außer dass mein Programm hängen bleibt.
Allerdings speichert es solange eine avi Datei ab, bis ich das Programm mit dem Task Manager beende.
Ja länger ich damit warte, desto größer wird sie.....aber sie lässt sich nicht abspielen. Ich hab da irgendwo noch einen (oder mehrere  ) Fehler drin, die bewirken, dass ich eine nicht abspeilbare datei speichere.

wenn ich bei der abgespeicherten Datei auf Eigenschaften gehe und dann auf Details sollte es mir eigentlich Dinge anzeigen, wie :Länge 30s ,  Bildbreite 480, Bildhöhe 640, Datenrate 4601 kBit/s, Gesamtrate 4601 kBit/s , Einzelbildrate 100 Einzelbilder / sekunde

Aber diese Felder sind alle leer! Es ist klar dass kein Player sowas abspielen kann :-(

Ich will den Fehler finden, warum meine Datei so abgespeichert wird, dass nichts funkt.

Zum verrückt werden!


----------



## Sonecc (13. Sep 2010)

Sein Problem dürfte sein, dass sein Programm hängt, weil das ganze nicht in einem eigenen Thread läuft.
Heißt, solange der Stream läuft hängt sein Programm, deswegen hat er die -1 auf 3 geändert.
Mal vom 0en schreiben abgesehen...

Ich kann mich nur dem anschließen, dass du erstmal Basics lernen solltest


----------



## Sonecc (13. Sep 2010)

1342 hat gesagt.:


> Ich will den Fehler finden, warum meine Datei so abgespeichert wird, dass nichts funkt.




Das liegt daran, dass du nur nullen (in zahlen 0 ) in deine Datei schreibst.
Verwende fos.write(nbytes) und es wird besser sein (ob es danach geht weiß ich zwar nicht, dann sollten aber wenigstens nicht nur 0 en in deiner Datei stehen)


-.- ... Sorry für Doppelpost :/


----------



## 1342 (13. Sep 2010)

Danke für eure antworten,

aber selbst wenn ich die 0 auf nbytes ändere, änderts sich nichts an meiner gespeicherten datei.......


----------



## SlaterB (13. Sep 2010)

selbst wenn man mit der Batterie nach dem Fernseher schmeißt kommt kein schönes Bild,

nein so gehts nicht voran,
das Speichern einer Datei erfordert konzentriertes geplantes sinnvolles Vorgehen,
kein beliebiges Ausprobieren von Befehlen

aber da nix anderes in Frage kommt darfst du nun 

```
char  buffer[] = new char[0xffff];
      while (true) {
        int amountRead = stream.read(buffer);
        if(amountRead == -1) {
            break;
        }
        fos.write(buffer, 0, amountRead);
      }
```
ausprobieren,
kopiert von
Kapitel 14: Daten lesen und schreiben mit Streams


----------



## 1342 (13. Sep 2010)

danke auch für diesen beitrag, aber irgendwie scheint es nicht zu wollen.

ich forsche weiter......


----------



## 1342 (14. Sep 2010)

Ich einfach nicht mehr weiter .... hat keiner eine idee oder ein hilfe?

Mein versuch bis jetzt:


```
try // Versuche
	    		{
					
				Date dt = new Date(); // Datum erzeugen
				SimpleDateFormat dtformat = new SimpleDateFormat("dd.MM.yyyy 'at' HH.mm.ss");// Datumsformat festlegen
				URL url = new URL("http://"+Daten[0]+"/videostream.cgi?&user=admin&pwd=1342&resolution=32");
				URLConnection conn = url.openConnection();
				
				
				BufferedInputStream stream = new BufferedInputStream(conn.getInputStream());
        	    FileOutputStream fos = new FileOutputStream(Daten[3] + "\\"+ dtformat.format(dt) +".avi"); 
        	    
        	    
        	    
        	    byte[] buffer = new byte[1024];
                int len = 0;
     
                while ((len = stream.read(buffer)) >= -1) {
                    fos.write(buffer, 0, len);
                }
                stream.close();
                fos.flush();
                fos.close();
            }

        	      
				catch(IOException e1) // Wird ausgeführt wenn ein Fehler stattgefunden hat
	    		{
	    			  e1.printStackTrace();
	    		}
										
			}
```


----------



## SlaterB (14. Sep 2010)

>= -1 ist schlicht falsch, wie kommst du darauf?
aus meinem geposteten Code mit break bei == -1 kann man != -1 oder von mir aus > -1 für deine Schleife ableiten, nicht >= -1

zu dem Code wären auch weitere Infos sinnvoll, 
wird eine Datei erstellt, wächst deren Größe,
hört die URLConnection eigentlich irgendwann auf, wie lange soll das Programm laufen,
was macht es am Ende oder eben nicht (die >= -1 deuten nämlich auf eine Endlosschleife hin),
treten Exceptions auf usw.


----------



## 1342 (14. Sep 2010)

Okay, hier die Infos: 

Es wird eine Datei erstellt

Ihre Größe wächst

Die URL connection hört nie auf. Erst wenn ich das Programm manuell beende.

Sobald ich aufnehmen will (mithilfe eines ItemListener) bleibt der Livestream hängen und ich kann mein Programm nicht mehr bedienen. Die Dateigröße wächst aber trotzdem weiter.


----------



## Sonecc (14. Sep 2010)

Sonecc hat gesagt.:


> Sein Problem dürfte sein, dass sein Programm hängt, weil das ganze nicht in einem eigenen Thread läuft.
> Heißt, solange der Stream läuft hängt sein Programm (...)



Nur ums nochmal zu erwähnen


----------



## SlaterB (14. Sep 2010)

und solange in die Datei geschrieben wird, sollte die sowieso kein anderes Programm benutzen, zumindest unter Windows


----------



## Tomate_Salat (14. Sep 2010)

@1324: Wann soll den deiner Meinung nach die Verbindung enden? Die bleibt bestehen bis einer der beiden Parteien "off" geht! Solange hängst du in dem aktuellen Thread fest, weil [c]stream.read()[/c] immer etwas > -1 zurückgeben wird. Also entweder schaust du dir Multithreading an (viel Spaß!) oder du setzt ein limit: z.B. nur 10s Videos aufnehmen und dann die Verbindung kappen und das Ergebnis speichern.


----------



## 1342 (14. Sep 2010)

Kann das nicht daran liegen das in meiner Übertragung was nicht stimmt?

Hier wird die Verbindung zu dem URL hergestellt

```
URL url = new URL("http://"+Daten[0]+"/videostream.cgi?&user=admin&pwd=1342&resolution=32");
                URLConnection conn = url.openConnection();
```

Hier wird sie zum BufferedInput übertragen:

```
BufferedInputStream stream = new BufferedInputStream(conn.getInputStream());
```


```
....da fehlt doch die übertragen vom buffered zum FileOutputStream? Oder versteh ich das falsch?
```


und schreibt doch die Datei:

```
FileOutputStream fos = new FileOutputStream(Daten[3] + "\\"+ dtformat.format(dt) +".avi");
```

Und wegen dem kann meine Datei nicht erkannt werden weil der FileOutputStream einfach nur eine Datei ohne nichts speichert?! Wenn ich auf Details in der Datei gehe steht dort auch nichts drine im Video bereich.


----------



## SlaterB (14. Sep 2010)

> da fehlt doch die übertragen vom buffered zum FileOutputStream? Oder versteh ich das falsch?

die Übertragung ist die while-Schleife,

aber schon richtig dass man da sehr viele Dinge bedenken muss, ist das wirklich eine richtige Aufgabe für dich?


----------



## Tomate_Salat (14. Sep 2010)

mal abgesehen von der Endlosschleife, kann man so wirklich eine valide avi-Datei erstellen, indem man Bilder nacheinander in eine datei schreibt und sie .avi tauft? (oder schickt die Kamera tatsächlich einen Stream und *keine* Einzelbilder?)


----------



## 1342 (14. Sep 2010)

> aber schon richtig dass man da sehr viele Dinge bedenken muss, ist das wirklich eine richtige Aufgabe für dich?



Dieses Projekt ist Inhalt einer Weiterbildung.
Vor einem Jahr habe ich das erste Mal etwas von Java gehört. Seit dem bringen wir uns quasi selber das "Programmieren" bei. Vieles davon verstehe ich auch nicht, weil wir fast dazu aufgefordert werden uns die Sachen ausm Netz zusammen "zuklauen". Davon bin ich auch nicht begeistert.

Aber ich muss das nunmal hinbekommen........ich probiere, bastel und forsche seit wochen, habe mir die Insel gekauft und lese darin, habe von Erlenkötter ein Java Büchlein und lese auch darin.
Das Problem ist, dass ich mit dem Inhalt dieser Bücher oft, leider nichts anzufangen weiss, da mir das ganze Hintergrundwissen fehlt, welches man sich in Jahren erarbeitet.Diese Zeit habe ich aber nicht. Also versuche ich mein bestes und bin eben auch auf Hilfe angewiesen........


----------



## Sonecc (14. Sep 2010)

Also gerade die Java-Insel ist meiner Meinung nach auch für Anfänger verständlich. Da braucht man kein jahrelang erarbeitetes Wissen für.

Vielleicht hilft dir ja folgender Link (habs nur gegoogelt, nicht getestet)

Werner Randelshofer’s Blog  Blog Archive  Writing AVI videos using pure Java


----------



## 1342 (14. Sep 2010)

Die Kamera schickt uns einen avi Stream mit 100 einzlbilder pro sekunde.


----------

