2010-06-30 25 views
1

J'ai un fichier image stocké sur un serveur distant (ie http://example.com/images).The images dans ce dossier sont de mise à jour à raison de 1 image par 100 millisecondes Pensez à cames IP qui transmettent des images MJPEG.Impossible de faire E/S rapide des images générées dynamiquement sur une caméra IP

J'utilise api client apache HTTP pour se connecter à mon serveur distant .Je reçois un flux de contenu

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

J'enveloppait l'entrée stream dans BufferedInputSt ream pour des E/S plus rapides. Mais puisque les images sont générées à un rythme très rapide et qu'elles ont une taille moyenne de 250kb. Je voudrais utiliser les fonctionnalités NIO comme FileChannel ainsi que MemoryMappedBuffers à améliorer les performances d'E/S ainsi que les fichiers d'images générés par accès sur le serveur distant en mode non bloquant.

Mais quels que soient les exemples que j'ai vus parler de la création de FileInputStream/RandomAccessFiles qui prennent File Object comme paramètre.

Je reçois l'InputStream comme réponse du serveur distant que je ne peux pas convertir en FileInputStream pour obtenir FileChannel.

Je voudrais savoir s'il existe une implémentation dans api client apache qui donne des chemins de fichiers. Ou devrais-je explorer les sockets pour obtenir l'accès au canal. J'ai également javax.imageIO, mais je ne sais pas si cela répondra à mon besoin d'E/S plus rapides

+0

1) Quelle est la bande passante entre votre serveur et votre client? 2) Pouvez-vous démarrer les transferts depuis le serveur distant (via ftp, dir mapping, peu importe)? –

+0

la bande passante serait d'environ 1 mbps, je ne peux utiliser que http. Même si le protocole FTP est pris en charge par ma caméra ip, mais il télécharge des images sur le serveur FTP à un intervalle de 60 secondes. Et je ne peux pas contrôler le taux de téléchargement. En fait, mon ip cam a intégré linux et serveur web dessus et transmet le flux h264 ainsi que les images mjpeg. Je suis capable de télécharger les images vers un dossier spécifié sur ma boîte de dev, mais le processus est très lent. Dans mon expérience précédente, j'ai observé que le fichier E/S fait en utilisant FileChannels considérablement accélérer les performances –

Répondre

0

Votre facteur limitant sera le réseau. Si vous avez une ligne de 1mbps, cela signifie que votre transfert max pratique sera probablement d'environ 100 kilo-octets par seconde (je réalise 8 bits pour l'octet, mais compte tenu de la communication, le transfert observé tend à être 10-à-1).

Si vous cherchez à tirer 10 images par seconde, et chaque image est 250k, vous avez besoin d'une connexion réseau de 25 mbps.

Les sockets peuvent offrir des améliorations mineures, mais ils n'atteindront toujours pas ce que vous voulez. Avez-vous considéré la compression? Par exemple. sur le serveur, assemblez plusieurs images dans une archive compressée, téléchargez et décompressez. Cela ne vous permettra toujours pas 10 250k images par seconde, mais pourrait vous rapprocher.

Une autre option peut être d'utiliser un flux vidéo, sauf si vous avez absolument besoin d'images.

Si vous avez absolument besoin de 10 images par seconde, vous devez augmenter la vitesse de votre connexion au serveur ou réduire la taille des images, ou une combinaison des deux.

+0

Notez le "B" s et "b" s –

+0

Je les ai noté, mais la chose la plus difficile, il n'y a pas la différence ou souvent se tromper, donc ce n'est pas toujours digne de confiance. Néanmoins, s'il peut obtenir des téléchargements d'environ 1 méga octet par seconde, le débit de données est toujours insuffisant. – Taylor

+0

@Taylor Dans un cas, il est serré, mais l'autre est impossible –