質問

Javaサーバーを作成しました。これは、スクリーンショットを撮影し、サイズを変更し、TCP/IPを介してiPhoneアプリケーションに送信します。その後、アプリケーションはNSINPUTSTREAMを使用して、着信イメージデータを収集し、バイトバッファーを使用してNSMutableDataインスタンスを作成し、iPhoneに表示するUIIMAGEオブジェクトを作成します。基本的にスクリーンシェア。画像データを収集する私の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を作成することです。 Image Marker(EOI)Marker(FFD9)のJPEGエンド(ENDのEND(FFD9))を探すことは理にかなっているようです。これをテストするにはどうすればよいですか?データがどのように保存されているかについて、またはJPEGファイル内のマーカーについて何かが欠けていますが、これのテストのヘルプは大歓迎です!

ジェームズ

役に立ちましたか?

解決

それはパフォーマンスを殺すので、あなたは明らかにストリームを閉じたくありません。

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

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top