2010-07-25 8 views
3

나는 모니터링 시스템을 가지고 있으며 알람 트리거가 발생하면 카메라에서 스냅 샷을 저장하려고합니다. 나는 그것을하기 위해 많은 방법을 시도했다 ... 그리고 그것은 카메라에서 스트림 스냅 샷을 누른 다음 PC에서 jpg로 저장하고있다. 괜찮아요. 하지만 문제는 애플리케이션 성능에 있습니다 ... 스팀을 읽는 데 약 20 ~ 30 초가 걸리므로 그 방법은 불립니다. 2 초마다. 그 코드가 무엇이 잘못되었는지, 어떻게 그 코드를 빨리 얻을 수 있는지 알아야합니다. ? 사전 코드에 많은 감사 :스트림에서 읽는 속도가 느림.

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); 

답변

3

나는이 코드는 적어도 첫 번째 방법 호출에 대해, 문제의 원인인지 매우 의심 (그러나 아래에서 더 읽음).

기술적으로 메모리 버퍼에 저장하지 않고 비트 맵을 생성하거나 이미지를 표시 할 필요가 없으면 비트 맵을 구성하지 않고 원시 데이터를 저장할 수 있지만 그럴 수는 없습니다. 성능 향상에 도움이되는 여러 초의 관점에서 도움을줍니다. 브라우저, wget, 컬 또는 다른 도구를 사용하여 해당 URL에서 이미지를 다운로드하는 데 시간이 얼마나 걸렸는지 확인 했습니까? 인코딩 소스와 관련하여 문제가 발생했기 때문입니다.

자원을 정리해야합니다. 스트림을 제대로 닫으십시오. 이 메서드를 정기적으로 호출하면 문제가 발생할 수 있습니다. .NET은 한 지점에서 동일한 호스트에 대한 연결을 몇 개만 열어주기 때문입니다.

// 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

내가 WebResponse를 스트림의 네트워크 동작을 시도 할 수는 없지만 (메모리 스트림에 한 번 루프에 한 번)를 두 번 스트림을 처리 할 수 ​​있습니다.

나는 모든 문제의 일을하지 않습니다하지만 난 그것을 시도를 줘야 할 것 :

 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

시간당 1000 바이트보다 큰 데이터를 읽으십시오. 예를 들어 아무런 문제가 보이지 않습니다.

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

은 데이터가 스트림에 쓰여지는 것보다 빨리 읽을 수 있다는 점을 제외하면 데이터가 손실 될 수 있습니다. 그러나 주요 아이디어는, 어쨌든, 한 번에 더 큰 바이트의 덩어리를 읽는 것입니다. –

0

파일을 다운로드 해보십시오.

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

날짜 시간을 사용하여 고유 한 스탬프를 찍을 수 있습니다.

관련 문제