Frage

Ich habe einen Java -Server erstellt, auf dem Screenshots angezeigt werden, ändert ihn und sendet sie über TCP/IP an meine iPhone -Anwendung. Die Anwendung verwendet dann NSInputStream, um die eingehenden Bilddaten zu sammeln, eine NSMutableableData -Instanz mit dem Byte -Puffer zu erstellen und dann ein UIImage -Objekt zum Anzeigen auf dem iPhone zu erstellen. Screenshare im Wesentlichen. Mein iPhone -Code zum Sammeln der Bilddaten ist derzeit wie folgt:

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

}
}

Mein Problem, wie der In-Code-Kommentar angezeigt, besteht darin, herauszufinden, wann das Sammeln von Daten im NSMutableabledata-Objekt nicht mehr erfasst werden soll, und die Daten zum Erstellen einer Benutzeroberfläche verwenden. Es scheint sinnvoll zu sein, nach dem JPEG-Ende des Dateimarkers zu suchen-End of Image (EOI) -Marker (FFD9)-in den eingehenden Bytes, da das Bild beim Senden bereit ist. Wie kann ich dafür testen? Ich fehlt entweder etwas darüber, wie die Daten gespeichert werden, oder über den Marker in der JPEG -Datei, aber jede Hilfe beim Testen dafür wäre sehr geschätzt!

James

War es hilfreich?

Lösung

Sie wollen den Stream offensichtlich nicht schließen, weil dies die Leistung abtöten würde.

Da Sie die Client -Server -Verbindung steuern, senden Sie die Anzahl der Bytes im Bild, bevor Sie die Bilddaten senden. Besser noch, senden Sie die Anzahl der Bytes im Bild, die Bilddaten und eine leicht identifizierte Seriennummer am Ende, damit Sie schnell überprüfen können, ob die Daten tatsächlich eingetroffen sind.

Viel einfacher und effizienter als tatsächlich nach dem Ende des Dateimarkers zu überprüfen. Natürlich können Sie auch nach der Anzahl der Bytes auch darauf suchen. Leicht genug.

Natürlich wird all dies für Screensharing -Stile in allen ungewöhnlichen Fällen für Screensharing -Stile grob ineffizient sein. In den meisten Fällen ändert sich nur ein kleiner Teil des Bildschirms, der gespiegelt werden soll, mit jedem Rahmen tatsächlich. Wenn Sie versuchen, den gesamten Bildschirm mit jedem Frame zu senden, sättigen Sie schnell Ihre Verbindung und die Client -Seite wird schrecklich verzögert und reagieren nicht.

Angesichts der Tatsache, dass dies ein äußerst ausgereifter Markt ist, gibt es unzählige Lösungen und einige Open -Source -Bits, aus denen Sie eine Lösung abgeben können, um Ihren Anforderungen zu entsprechen (z. B. VNC siehe).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top