2010-07-25 7 views
3

J'ai un système de surveillance et je veux enregistrer une photo à partir d'une caméra lors du déclenchement de l'alarme. J'ai essayé de nombreuses méthodes pour cela ... et tout fonctionne très bien, flux instantané de la caméra, puis enregistrez-le comme un jpg dans le PC .... image (format jpg, 1280 * 1024,140KB) .. C'est bon Mais mon problème est dans la performance de l'application ... L'application a besoin d'environ 20 ~ 30 secondes pour lire la vapeur, ce n'est pas acceptable car cette méthode sera appelée toutes les 2 secondes. J'ai besoin de savoir quel est le problème avec ce code et comment je peux l'obtenir beaucoup plus vite que cela. ? Un grand merci à l'avance code:Lenteur dans la lecture du flux .NET

string sourceURL = "http://192.168.0.211/cgi-bin/cmd/encoder?SNAPSHOT"; 
byte[] buffer = new byte[200000]; 
int read, total = 0; 
WebRequest req = (WebRequest)WebRequest.Create(sourceURL); 
req.Credentials = new NetworkCredential("admin", "123456"); 
WebResponse resp = req.GetResponse(); 
Stream stream = resp.GetResponseStream(); 
while ((read = stream.Read(buffer, total, 1000)) != 0) 
    { 
     total += read; 
    } 
Bitmap bmp = (Bitmap)Bitmap.FromStream(new MemoryStream(buffer, 0,total)); 
string path = JPGName.Text+".jpg"; 
bmp.Save(path); 

Répondre

3

Je doute fort que ce code est la cause du problème, au moins pour la première méthode appel (mais lisez plus loin ci-dessous). Techniquement, vous pouvez produire le bitmap sans l'enregistrer dans un tampon mémoire, ou si vous n'avez pas besoin d'afficher l'image, vous pouvez sauvegarder les données brutes sans jamais créer de bitmap, mais cela ne va pas aider en termes de plusieurs secondes amélioration des performances. Avez-vous vérifié combien de temps il faut pour télécharger l'image à partir de cette URL en utilisant un navigateur, wget, curl ou tout autre outil, car je soupçonne que quelque chose se passe avec la source d'encodage.

Quelque chose que vous devriez faire est de nettoyer vos ressources; fermez le flux correctement. Cela peut potentiellement causer le problème si vous appelez cette méthode régulièrement, car .NET n'ouvrira que quelques connexions au même hôte à tout moment.

// Make sure the stream gets closed once we're done with it 
using (Stream stream = resp.GetResponseStream()) 
{ 
    // A larger buffer size would be benefitial, but it's not going 
    // to make a significant difference. 
    while ((read = stream.Read(buffer, total, 1000)) != 0) 
    { 
     total += read; 
    } 
} 
1

Je ne peux pas essayer le comportement du réseau du flux WebResponse, mais vous gérer le flux deux fois (une fois dans votre boucle et une fois avec votre flux de mémoire).

Je ne ai pas chose qui est tout le problème, mais je donnerais un essai:

 string sourceURL = "http://192.168.0.211/cgi-bin/cmd/encoder?SNAPSHOT"; 
    WebRequest req = (WebRequest)WebRequest.Create(sourceURL); 
    req.Credentials = new NetworkCredential("admin", "123456"); 
    WebResponse resp = req.GetResponse(); 
    Stream stream = resp.GetResponseStream(); 
    Bitmap bmp = (Bitmap)Bitmap.FromStream(stream); 
    string path = JPGName.Text + ".jpg"; 
    bmp.Save(path); 
1

Essayez de lire des données plus volumineuses que 1000 octets par heure. Je ne vois aucun problème avec, par exemple,

read = stream.Read(buffer, 0, buffer.Length); 
+0

sauf que cela peut lire plus rapidement que les données sont écrites dans le flux, ce qui entraînera des pertes de données. Mais l'idée principale, de toute façon, c'est de lire de plus gros morceaux d'octets à la fois. –

0

Essayez ceci pour télécharger le fichier.

using(WebClient webClient = new WebClient()) 
{ 
    webClient.DownloadFile("http://192.168.0.211/cgi-bin/cmd/encoder?SNAPSHOT", "c:\\Temp\myPic.jpg"); 
} 

Vous pouvez utiliser un DateTime pour placer un tampon unique sur la photo.