AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

"Aggressiver" downloaden?

Ein Thema von Medium · begonnen am 5. Aug 2012 · letzter Beitrag vom 7. Aug 2012
Antwort Antwort
Seite 1 von 2  1 2      
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#1

"Aggressiver" downloaden?

  Alt 5. Aug 2012, 16:10
Schmucken Sonntag wünsch ich!

Ich habe ein Programm zur Archivierung von Sicherheitskamerabildern gebaut, bin aber etwas unzufrieden mit meinem Download der Einzelbilder. Technisch sieht das ganze so aus, dass es 17 Kameras sind, die alle ihre Bilder auf einen Webserver packen. Das aktuelle Bild ist also pro Kamera je unter einer URL zu finden. Ich habe jetzt mit C# (war so gewünscht) einen Client gebaut, der in je einem Thread pro Kamera die Bilder abruft, und zunächst mit Datum auf die Platte wirft (später soll mal ein Video daraus werden).

Das Problem ist: Wenn ich die zu den Kameras gehörende Weblösung benutze, bekomme ich deutlich öfter ein neues Bild als mit meiner Lösung. Irgend etwas bremst mich, ich weiss aber nicht was. Selbst wenn ich Weblösung und mein Programm auf ein und der selben Kiste gleichzeitig laufen habe, ist der Webclient erheblich flotter am Werke.
Das Snippet welches bei mir den Download macht: (Dies ist mein Thread-Loop, von dem einer für jede Cam läuft.)
Code:
private void DownloadCycle()
{
   while (!Terminated)
   {
      try
      {
         if (!Paused)
         {
            if (WC == null)
            {
               WC = new WebClientTimeOut();
               WC.TimeOut = 2000;
            }
            bool picOK = true;
            byte[] tmp = new byte[0];
            try {tmp = WC.DownloadData(URL);} catch {picOK = false;}
            if (picOK)
            {
               Image tmpImg = Image.FromStream(new MemoryStream(tmp));
               DateTime newDate = DateTime.Now.Date;
               if (newDate > Today)
               {
                  Today = newDate;
                  CurrentDir = BaseFolder+Today.ToString("yyyyMMdd")+"\\";
                  Directory.CreateDirectory(CurrentDir);
               }
               tmpImg.Save(CurrentDir + DateTime.Now.ToString("HHmmss-fff")+".jpg");
            }
         }
      }
      catch
      {} // Ja böse, aber ich will einfach nur, dass der Thread weiter rennt, egal was passiert =)
   }
}
Die Klasse WebClientTimeOut ist ein aufgebohrter WebClient, da diese sonst den Timeout des WebRequest nicht weiterreicht:
Code:
public class WebClientTimeOut : WebClient
{
   protected override WebRequest GetWebRequest(Uri address)
   {
   WebRequest webRequest = base.GetWebRequest(address);
   webRequest.Timeout = TimeOut;
   return webRequest;
   }
   public int TimeOut { set; get; }
}
Einen Timeout < +inf brauche ich, da ab und an die Requests arg lange dauern. Zwar selten, aber kam schon vor.


Teilweise bekomme ich nur 2-3 Bilder pro Minute, während der Webclient sekündlich ein neues Bild zeigt. Wie könnte ich das auch schaffen?
Besten Dank im Voraus, und schönes Rest-Wochenende noch!
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von Valle
Valle

Registriert seit: 26. Dez 2005
Ort: Karlsruhe
1.223 Beiträge
 
#2

AW: "Aggressiver" downloaden?

  Alt 5. Aug 2012, 18:59
Mir fällt dazu erstmal ein, dass du die HTTP-Verbindung nach Download eines Bildes offen lassen könntest. Nur dass das kein Grund ist, 3 Bilder statt 60 Bilder pro Minute zu erhalten.

Handelt es sich um die gleichen Bilder (Auflösung / Größe?) Und kommen die Bilder von der Kamera sicher schnell genug auf den Server?

Liebe Grüße,
Valentin
Valentin Voigt
BOFH excuse #423: „It's not RFC-822 compliant.“
Mein total langweiliger Blog
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#3

AW: "Aggressiver" downloaden?

  Alt 5. Aug 2012, 19:07
Zum Offenlassen bietet die Klasse irgendiwe keine wirklichen Möglichkeiten. Es gibt da nur die Möglichkeit Dinge in diverse Zielklassen runterzuladen (Text, Binary, etc.), jeweils synchron oder asynchron - wobei letzteres durch den Thread ja obsolet sein dürfte. Von daher weiss ich nicht so recht

Die Bilder ein und derselben Cam sind immer im selben Format, sowohl Auflösung als auch Farbtiefe und Dateiformat (Baseline jpeg). Die Dateigröße variiert natürlich je nach Inhalt.
Dass die Bilder entsprechend zügig auf dem Server sind nehme ich mal stark an, denn die Web-App greift letztlich auch nur auf diese zu und ist verdammt flott. Leider ist im Source des Webclients im Browser nicht ersichtlich, wie dieser seinen Reload macht. Die URL sehe ich, aber zum Reload wird eine Funktion aufgerufen, die ich in der Quelle der Seite nicht ausfindig machen kann
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#4

AW: "Aggressiver" downloaden?

  Alt 5. Aug 2012, 19:14
Wie könnte ich das auch schaffen?
Zwei Ideen:

* mit Fiddler oder Wireshark nachschauen wie das Webinterface mit dem Server kommuniziert
* den Quelltext der HTML Seite des WebInterfaces untersuchen
Michael Justin
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: "Aggressiver" downloaden?

  Alt 5. Aug 2012, 19:16
Speichert die Web-App auch die Bilder als Einzel-JPEG auf die Festplatte?
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#6

AW: "Aggressiver" downloaden?

  Alt 5. Aug 2012, 20:57
@mjustin: Den Quelltext hatte ich mir angesehen, jedoch ist da das folgende Problem: (Alles in "[]" von mir anonymisiert)
Code:
<div class="campicture">
  <div class="title">
    [Kameraident]
  </div>
  <img height="240" width="320" src="[URL]" border="0" height="240" width="320" id="[id]" onmouseover="refresh_start(this.id)" onmouseout="window.clearInterval(s)" />
</div>
Die Funktion "refresh_start()" befindet sich nicht in der Quelle der Seite, die ich zu sehen bekomme. Ich hätte ein einfaches JScript erwartet, aber entweder ist das irgendwie ausgelagert, oder etwas ganz anderes. An mehr Quellen komme ich leider nicht heran.

Der Browser scheint ansonsten wirklich bloß auch auf die Bild-URL zuzugreifen. Wenn ich diese im Browser direkt eintippe und von hand die Seite refreshe wie ein irrer bekomme ich auch die sekündlichen Updates wie der Webclient.

@TiGü: Nein, der zeigt die nur gesammelt auf einer Seite an. Ich habe mal Zeitmessungen eingebracht, um zu schauen, was da so lange braucht. Leider mit mäßigem Erfolg: Das Herunterladen liegt im Schnitt zwischen ~100 und 1300ms (*), das Speichern bei 0 bis 50ms.
*: Das ist der wichtige Teil: Einige Male pro Minute dauert es deutlich Länger, teilweise weit über meinen Timeout von 2s hinaus.

Ich habe für Spaß mal die Cams auf 3 Server verteilt, weil die WebApp ja immer nur ein Bild (das mit der Maus drin) refreshed. Leider keine Besserung, so dass ich auch nicht glaube, den Server zu überlasten. (Alles im LAN, die Verbindung sollte daher auch okay sein und weit mehr als die paar kb/sek verpacken denke ich.)

Irgend etwas macht mein Browser deutlich besser als ich
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#7

AW: "Aggressiver" downloaden?

  Alt 6. Aug 2012, 07:07
Die Funktion "refresh_start()" befindet sich nicht in der Quelle der Seite, die ich zu sehen bekomme. Ich hätte ein einfaches JScript erwartet, aber entweder ist das irgendwie ausgelagert, oder etwas ganz anderes.
Das JavaScript wird ganz sicher im HTML geladen, das kann auch ganz am Ende des HTML Codes sein. Nach script oder js oder javascript suchen wird sicher einen Treffer liefern.
Michael Justin
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: "Aggressiver" downloaden?

  Alt 6. Aug 2012, 09:32
@TiGü: Nein, der zeigt die nur gesammelt auf einer Seite an. Ich habe mal Zeitmessungen eingebracht, um zu schauen, was da so lange braucht. Leider mit mäßigem Erfolg: Das Herunterladen liegt im Schnitt zwischen ~100 und 1300ms (*), das Speichern bei 0 bis 50ms.
*: Das ist der wichtige Teil: Einige Male pro Minute dauert es deutlich Länger, teilweise weit über meinen Timeout von 2s hinaus.
Ich würde trotzdem den "auf-Platte-speichern"-Teil auskommentieren und die Bilder mal direkt anzeigen lassen.

Wie zeitlich genau arbeitet denn die Web-App? Mal im Bild in die Hände klatschen und die zeitliche Differenz messen.
Wenn sie deutlich bemerkbaren Verzug hat, liegt ein Cachen der Bilder vor.
Das müsstest du denn auch implementieren.

Warum wird nicht auf bestehende Lösungen gesetzt?
Es gibt genügend (deutsche) Anbieter für solche Software-Sicherheitslösungen.
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#9

AW: "Aggressiver" downloaden?

  Alt 6. Aug 2012, 11:32
Die Verzögerung ist gerade so lange, wie man der Kamera zugestehen muss, ihr Bild auf den Server zu bringen - also im Millisekundenbereich. Ich sehe mit meinem Programm auch, wenn es denn aktualisiert hat, genau das Bild, dass der Webclient zu diesem Zeitpunkt zeigt. Nur dass der eben öfter zwischen meinen Aktualisierungen noch Updates macht. (Leider auch ohne speichern )

Der Hersteller des ursprünglichen Systems existiert wohl nicht mehr, und man wollte ganz gerne auf einen kompletten Neukauf "am Stück" verzichten. Zumal man an sich ja recht zufrieden ist, nur dass das Altsystem keine Archivierung vornehmen kann. Ich soll dies nun "anbauen". Und eigentlich ist es ja auch ein Klacks - die o.g. Methode ist ja schon fast die ganze Magie, nur leider zaubert das langsam.

@mjustin: Ich hatte nach "refresh_start" im Source gesucht, und hatte nur Treffer in den DIVs. Ich schau nachher noch mal genauer, bin mir aber recht sicher.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#10

AW: "Aggressiver" downloaden?

  Alt 6. Aug 2012, 11:46
@mjustin: Ich hatte nach "refresh_start" im Source gesucht, und hatte nur Treffer in den DIVs. Ich schau nachher noch mal genauer, bin mir aber recht sicher.
Die JavaScript Quelltexte werden dann sicher über externe Dateien nachgeladen (typsiche Endunf *.js) und diese kann man im Browser auch als URL eingeben (Pfad zur HTML Seite davorsetzen).

Beispiel in dem eine stubs.js JavaScript Quelldatei eingebunden wird:

Code:
<script type="text/javascript" src="http://cdn.sstatic.net/js/stub.js?v=7fea23de3996"></script>
Michael Justin
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:30 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz