3

スクリーンショットを撮り、サイズを変更し、TCP/IP 経由で iPhone アプリケーションに送信する Java サーバーを作成しました。次に、アプリケーションは NSInputStream を使用して着信画像データを収集し、バイト バッファーを使用して NSMutableData インスタンスを作成し、UIImage オブジェクトを作成して iPhone に表示します。基本的に、画面共有。画像データを収集するための私のiPhoneコードは現在次のとおりです。

- (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent{


if(streamEvent == NSStreamEventHasBytesAvailable && [iStream hasBytesAvailable]){
        uint8_t buffer[1024];

    while([iStream hasBytesAvailable]){
        NSLog(@"New Data");

        int len = [iStream read:buffer maxLength:sizeof(buffer)];

        [imgdata appendBytes:buffer length:len];
        fullen=fullen+len;

        /*Here is where the problem lies.  What should be in this
         if statement in order to make it test the last byte of
         the incoming buffer, to tell if it is the End of Image marker
         for the end of incoming JPEG file?
         */
        if(buffer[len]=='FFD9'){
        UIImage *img = [[UIImage alloc] initWithData:imgdata];
        NSLog(@"NUMBER OF BYTES: %u", len);

        image.image = img;
        }
    }

}
}

コード内のコメントで示されているように、私の問題は、NSMutableData オブジェクトでデータの収集をいつ停止し、そのデータを使用して UIImage を作成するかを判断することです。これが送信されたときに画像が表示できるようになるため、着信バイトで JPEG ファイルの終わりマーカー (画像の終わり (EOI) マーカー (FFD9)) を探すのは理にかなっているようです。これをテストするにはどうすればよいですか?データがどのように保存されているか、または JPEG ファイル内のマーカーについて何かが欠けていますが、これをテストするための助けがあれば大歓迎です!

ジェームズ

4

1 に答える 1

3

パフォーマンスが低下するため、明らかにストリームを閉じたくありません。

クライアントサーバー接続を制御するため、画像データを送信する前に画像のバイト数を送信します。さらに良いことに、画像のバイト数、画像データ、および簡単に識別できるシリアル番号を最後に送信して、データが実際に到着したことをすばやく確認できるようにします。

実際にファイルの終わりマーカーをチェックするよりもはるかに簡単で効率的です。もちろん、バイト数を受信した後に確認することもできます。簡単です。

もちろん、これはすべて、例外的なケースを除いて、画面共有スタイルの目的には非常に非効率的です. ほとんどの場合、ミラーリングされる画面のごく一部のみが実際に各フレームで変化します。すべてのフレームで画面全体を送信しようとすると、接続がすぐに飽和状態になり、クライアント側がひどく遅くなり、応答しなくなります。

これが非常に成熟した市場であることを考えると、膨大な数のソリューションとかなりの数のオープン ソースがあり、そこからニーズに合ったソリューションを導き出すことができます (たとえば、VNC を参照)。

于 2010-03-05T04:48:43.963 に答える