Gå til innhold

Anbefalte innlegg

Hei,

 

driver å prøver å lage ett enkelt og greit brukergrensesnitt for å vise flere ipkamera.

 

Har per idag satt opp ZoneMinder på en laptop og kjører dette gjennom der.

Men ønsker selvsagt å utforske selv og lære. Det jeg støter på av progblem er att jeg ikke får oppdatert kildene kjapt nok.

Ligger på rundt 1 til 2 bilder i sekundet.

 

Jeg har valgt å ta den enkleste implementerings metoden først, dvs jeg laster ned "snapshots" istedefor å kjøre videostream mjpeg.

 

Har en tråd som laster ned nye bilder hele veien og legger dem i en collection hvor en annen tråd plukker opp for så å oppdatere gui. Kjørte først bildet rett i gui, ingen forskjell i oppdateringsfrekvens av bildet.

 

Kode for nedlasting av bilde

 

 

string Source = "http://" + IPAddress + "/snapshot.cgi?user=" + Username + "&pwd=" + Password;

while (this._IsRunning)

{

byte[] buffer = new byte[100000];

int read = 0, total = 0;

// create HTTP request

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(Source);

// get response

WebResponse resp = req.GetResponse();

// get response stream

Stream stream = resp.GetResponseStream();

// read data from stream

while ((read = stream.Read(buffer, total, 1000)) != 0)

{

total += read;

}

// get bitmap

Bitmap bmp = (Bitmap)Bitmap.FromStream(

new MemoryStream(buffer, 0, total));

_Images.Add(bmp);

_Thread.Join(1);

}

 

 

 

Noen som har tips og råd til hvordan jeg får lastet ned flere bilder kjappere?

 

Mvh Birger

Lenke til kommentar
Videoannonse
Annonse

GUI-tråden burde aldri gjøre tunge jobber som dette. Du må delegere til en annen tråd som så ber GUI-tråden om å oppdatere. Husk å kall Dispose() på bildene når du bytter til et nytt bilde.

Du burde heller ikke bruke Thread.Join. La heller tråden gå hele tiden, og bruk synkroniseringsmekanismer.

Lenke til kommentar

Jeg har vært bort i Vivotek sitt bibliotek da jeg lagde min egen .NET applikasjon (og en ActiveX for browser) for håndtering av IP-cam. Men jeg har brukt streaming-metoden, den fungerte utmerket rett ut fra boksen.

 

Kan du verifisere at det faktisk ligger flere enn 1-2 bilder i bufferen per sekund? Selv om det ser ut som det er et typisk GUI-problem, så kan det være at du ikke får tak i flere enn så og så mange bilder per sekund.

 

Som sagt i tidligere kommentarer, du burde flytte bildehåndteringsbiten ut av GUI-tråden. Den skal kun tegne det nye (oppdaterte) bildet siden siste gang den kjørte. La heller en egen tråd ta seg av bildebehandlingen, slik at bildene er klare for GUI-tråden.

 

Akkurat i dette tilfellet kan det kanskje være positivt å bruk trådprioritet? Jeg har selv aldri hatt bruk for det, men dersom f.eks. GUI-tråden må kjøre en getPic() metode som ligger i bildebehandlingstråden din, så bør GUI-tråden ha høyest prioritet. Dette er bare mine tanker rundt dette.

Lenke til kommentar

Takker for svarene selv om det ikke direkte fikk ting til å gå kjappere.

 

Prøvd med flere tråder og threadpool uten noen forbedring i ytelse, så noe må være galt av det jeg gjør men det får nå være.

 

Main -> Kaller Cam.Start() som starter en tråd som atter starter flere tråder.

Hver tråd kjører i loop til programmet avsluttes eller til Cam blir stoppet/utilgjengelig og for hvert bilde en tråd henter kjører jeg Form1.BeginInvoke men tror jeg har misforstått noe her. Prøvde også å stacke dem i en liste men fikk bare ett nytt bilde pr sekund ca. uansett.

 

La den ideen fra meg og begynte å se på MJPEG stream istedefor og ser jo potensialet i dette og kameraene støtter jo dette så det burde gi bedre flyt når de rette prosesseringene av streamen er på plass.

 

Etter hva jeg har forstått er det følgende som blir sendt ved en MJPEG stream

 

 

HTTP/1.1 200 OK

Content-Type: multipart/x-mixed-replace; boundary=ipcamera

--ipcamera

Content-Type: image/jpeg

Content-length: 12345

[image 1 encoded jpeg data]

 

--ipcamera

Content-Type: image/jpeg

Content-length: 45678

[image 2 encoded jpeg data]

 

 

 

 

Men det jeg har støtt på her nå er hvordan søker jeg i en byte array etter en gitt strøm? Fant ett eksempel på en annen nettside men den benyttet Array.Find som ikke var helt i henhold til hva jeg fikk til å fungere. :\

 

Noen tips? Annet en laste ned aforge.Net sitt rammeverk

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...