Невозможно выполнить быстрый ввод / вывод динамически генерируемых изображений на IP-камере - PullRequest
1 голос
/ 30 июня 2010

У меня есть файл изображения, хранящийся на удаленном сервере (т.е. http://example.com/images).The изображения в этой папке обновляются со скоростью 1 изображение в 100 миллисекунд Подумайте о ip-камерах, которые передают изображения MJPEG .

Я использую apache HTTP-клиент api для подключения к моему удаленному серверу. Я получаю поток контента

HttpClient httpClient = new DefaultHttpClient();
    HttpGet httpget = new HttpGet("http://example.com/images/screenshot.jpg");
    HttpResponse response = httpClient.execute(httpget);
    HttpEntity entity = response.getEntity();
    if (entity != null) {
    InputStream instream = entity.getContent();

Я обертываю входной поток в BufferedInputStream для более быстрого ввода-вывода. Но поскольку изображения генерируются с очень высокой скоростью, а их размер составляет в среднем 250 КБ.

Я хотел бы использовать функции NIO, такие как FileChannel, а также MemoryMappedBuffers для повысить производительность ввода-вывода, а также получить доступ к сгенерированным файлам изображений на удаленном сервере в неблокирующем режиме.

Но все примеры, которые я видел, говорят о создании FileInputStream / RandomAccessFiles, которые принимают File Object в качестве параметра.

Я получаю InputStream как ответ от удаленного сервера, который не могу преобразовать в FileInputStream для получения FileChannel.

Я хотел бы знать, есть ли какая-либо реализация в apache http client api, которая выдает fileChannels.

Или я должен исследовать сокеты, чтобы получить доступ к каналу. Я также исследовал javax.imageIO, но не уверен, что он удовлетворит мое требование более быстрого ввода / вывода

1 Ответ

0 голосов
/ 30 июня 2010

Вашим ограничивающим фактором будет сеть.Если у вас линия 1 Мбит / с, это означает, что ваш практический максимальный объем передачи, вероятно, составит около 100 килобайт в секунду (я понимаю, что 8 байт в байте, но с учетом служебных данных связи типичная наблюдаемая скорость передачи данных обычно составляет 10: 1).*

Если вы хотите обрабатывать 10 изображений в секунду, и каждое изображение имеет скорость 250 Кбит / с, вам нужно сетевое соединение со скоростью 25 Мбит / с.

Сокеты могут предложить незначительные улучшения, но они все равно не достигнут того, чтоты хочешь.Вы рассматривали сжатие?Например, на сервере, собрать несколько изображений в сжатый архив, скачать и распаковать.Это все равно не даст вам 10 250 тыс. Изображений в секунду, но может приблизить вас.

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

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

...