Использование Httprequest для получения картинок с заданного URL - PullRequest
0 голосов
/ 02 июня 2011

Я пытаюсь получить фотографии с веб-камер. Существует веб-сервис php-python для получения изображений с веб-камер и их обслуживания: он отображает картинку как http://ip/jpeg/camera=1.

private HttpWebRequest request;
private HttpWebResponse response;
private CookieContainer container;
private Uri uri;
private string _user;
private string _pass;
private string _ip;
//Login code as seen in the previous section should be here
//GetImages is meant to run as a separate thread 
private void GetImages(string camNo)
{
//create the GET request for the JPEG snapshot (found at /jpeg on the IP Camera)
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://" + deviceIP + "/jpeg/camera"+camNo);
request.Method = "GET";
request.ContentType = "application/x-www-form-urlencoded";
request.CookieContainer = container;

//attempt to get a response from the IP110, event if error

try
{
    response = (HttpWebResponse)request.GetResponse();
}
catch (WebException e)
{
    ConnectionError(new ConnectionErrorEventArgs(e.Message));
}

//Get the stream containing the JPEG image.
Stream stream = response.GetResponseStream();

//Read the stream to memory.
byte[] buffer = new byte[100000];
int read, total = 0;

while ((read = stream.Read(buffer, total, 1000)) != 0)
{
    total += read;
}

//create a BMP image from the stream
Bitmap bmp = (Bitmap)Bitmap.FromStream(new MemoryStream(buffer, 0, total));

//send the bmp image to where you would like to display it. 
 }

... тогда я сохраняю это растровое изображение в формате JPEG в папке. Моя проблема начинается здесь; Я хочу сделать этот процесс как можно быстрее. Я хочу сделать снимки с 50 веб-камер, используя этот код, и сохранить их в формате JPEG, и это должно быть быстро - я имею в виду, что каждые 10 секунд мне нужно получать новые снимки с 50 камер.

Я использовал timercontrol, и каждые 500 мс каждые 500 мс использую этот код до этой камеры. номер и сохранить JPEG, но он работает один за другим, поэтому производительность снижается!

50 мс х 500 камер = 25000 мс (25 с), если я установлю интервал управления таймером 100 мс, программа остановится. Когда я использую приведенный выше код, я получаю растровое изображение bmp за 200 мс, но когда оно пытается записать в формате jpeg на диск, это занимает много времени.

Что я могу сделать, чтобы записать на диск быстрее? Я искал карту памяти - это поможет? Я хочу хранить JPEG на диске, потому что я буду размещать эти фотографии на веб-сайте и делиться ими с людьми. Могу ли я использовать отображенную память и обслуживать ее публично через веб-сайт?

UPDATE: Я также использовал класс WebClient для асинхронных работ, http://www.informit.com/guides/content.aspx?g=dotnet&seqNum=571

В результате получилось: получить изображение размером около 300 мс и записать его на диск около 700 мс Поэтому я должен найти решение, чтобы записать на диск как можно больше.

Какой из них лучше? Записать картинки на диск или отправить картинки в базу? Я пытался сохранить фотографии, чтобы они были готовы к подаче, потому что на сайте люди должны видеть обновленные фотографии. Какой из них лучше для тысяч клиентских запросов? Хранить их на диске или хранить в базе данных как двоичные файлы?

Ответы [ 2 ]

1 голос
/ 02 июня 2011

Код для извлечения изображений является синхронным.Я бы предложил изменить ваш код, чтобы использовать HttpWebRequest.BeginGetResponse() для получения ваших изображений, как подробно описано в этом ответе .

Поэтому, когда срабатывает ваш (одиночный) таймер, начинайте асинхронные запросы к вашим кулачкам,затем (по завершении) обратный вызов будет запускаться для каждого выполненного запроса, и вы можете сохранить возвращенное изображение.

Если вам потребуется дальнейшая оптимизация, вы можете делегировать сохранение изображения на диск в фоновом режиме ThreadPool рабочий элемент .

0 голосов
/ 02 июня 2011

Каждый раз, когда вам нужно получить ответы быстрее, чем позволяют сложенные ответы, вам в конечном итоге приходится выполнять несколько частей работы одновременно, используя более одного потока (последнее слово здесь подсказка).

В .NET это означает либо настройку собственной библиотеки потоков, с использованием TPL и т. Д.

ДОБАВЛЕНО: Это может означать, как указано в комментарии ниже, использование асинхронных вызовов и разрешение платформе неявно создавать потокидля вас, вместо того, чтобы контролировать их самостоятельно.Фактически, вы можете использовать пул потоков и по-прежнему выбирать асинхронность или синхронизацию, не контролируя количество созданных потоков.Если вы действительно хотите приступить к работе, вы даже можете разгрузить многопоточность в ОС, используя обработчик прерываний на уровне ОС (например, метод, используемый Ruby до 1.9, который ввел «истинную» многопоточность, а не »).зеленые темы - да, TMI).

Ответ остается в силе, если у вас есть 2 минуты на выполнение работы и 30 секунд на ее выполнение, вам нужно многопоточное решение, будь вызнать, что вы на самом деле работаете с потоками (явное создание) или нет (неявное создание обрабатывается фреймворком / ОС).

...