Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   "Aggressiver" downloaden? (https://www.delphipraxis.net/169692-aggressiver-downloaden.html)

Medium 5. Aug 2012 15:10

"Aggressiver" downloaden?
 
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!

Valle 5. Aug 2012 17:59

AW: "Aggressiver" downloaden?
 
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. :gruebel:

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

Medium 5. Aug 2012 18:07

AW: "Aggressiver" downloaden?
 
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 :gruebel:

mjustin 5. Aug 2012 18:14

AW: "Aggressiver" downloaden?
 
Zitat:

Zitat von Medium (Beitrag 1176949)
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

TiGü 5. Aug 2012 18:16

AW: "Aggressiver" downloaden?
 
Speichert die Web-App auch die Bilder als Einzel-JPEG auf die Festplatte?

Medium 5. Aug 2012 19:57

AW: "Aggressiver" downloaden?
 
@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 :pale:

mjustin 6. Aug 2012 06:07

AW: "Aggressiver" downloaden?
 
Zitat:

Zitat von Medium (Beitrag 1176972)
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.

TiGü 6. Aug 2012 08:32

AW: "Aggressiver" downloaden?
 
Zitat:

Zitat von Medium (Beitrag 1176972)
@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.

Medium 6. Aug 2012 10:32

AW: "Aggressiver" downloaden?
 
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.

mjustin 6. Aug 2012 10:46

AW: "Aggressiver" downloaden?
 
Zitat:

Zitat von Medium (Beitrag 1177067)
@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>


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:42 Uhr.
Seite 1 von 2  1 2      

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