1

リモート サーバー (例: http://example.com/images ) に保存されている画像ファイルがあります。このフォルダー内の画像は、100 ミリ秒あたり 1 画像の割合で更新されます 。MJPEG 画像を送信する IP カメラを考えてみてください

リモートサーバーに接続するために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();

I/O を高速化するために、入力ストリームを BufferedInputStream にまとめています。

FileChannel や MemoryMappedBuffers などの NIO 機能を使用して、I/O パフォーマンスを改善し、非ブロッキング モードでリモート サーバー上の生成された画像ファイルにアクセスしたいと考えています。

しかし、私が見たサンプルは、ファイルオブジェクトをパラメーターとして取る FileInputStream / RandomAccessFiles の作成について話しています。

FileChannel を取得するために FileInputStream に変換できないリモート サーバーからの応答として InputStream を取得しています。

fileChannelsを提供するApache httpクライアントAPIに実装があるかどうかを知りたいです。

または、ソケットを調べてチャネル アクセスを取得する必要があります。javax.imageIO も調査しましたが、より高速なI/Oの要件を満たすかどうかはわかりません

4

1 に答える 1

0

制限要因はネットワークになります。1 mbps の回線を使用している場合、実際の最大転送量はおそらく 1 秒あたり約 100 キロバイトになります (1 バイトあたり 8 ビットだと認識していますが、通信オーバーヘッドを考えると、典型的に観察される転送は 10 対 1 になる傾向があります)。

1 秒あたり 10 枚の画像を取得しようとしていて、各画像が 250k の場合、25 mbps のネットワーク接続が必要です。

ソケットは小さな改善を提供するかもしれませんが、それでもあなたが望むものを達成することはできません. コンプレッションを考えたことはありますか?たとえば、サーバー上で、複数の画像を圧縮アーカイブにアセンブルし、ダウンロードして解凍します。これでも 1 秒あたり 10 枚の 250k 画像を取得することはできませんが、近づくことはできます。

絶対に画像が必要でない限り、別のオプションとしてビデオ ストリームを使用することもできます。

1 秒あたり 10 個の画像が絶対に必要な場合は、サーバーへの接続速度を上げるか、画像のサイズを小さくするか、または両方を組み合わせる必要があります。

于 2010-06-30T15:33:47.947 に答える