Domanda

Ho creato un server Java, che prende schermate, li ridimensiona e li invia su TCP/IP alla mia applicazione iPhone. L'applicazione utilizza quindi NSInputStream per raccogliere i dati dell'immagine in arrivo, creare un'istanza NSMutabletata con il buffer byte, quindi creare un oggetto UIImage da visualizzare su iPhone. Screenshare, essenzialmente. Il mio codice iPhone per raccogliere i dati dell'immagine è attualmente il seguente:

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

}
}

Il mio problema, come indicato dal commento in codice, è capire quando interrompere la raccolta di dati nell'oggetto NSMUTABLABATATA e utilizzare i dati per creare un uiImage. Sembra avere senso cercare la fine JPEG del marcatore di marcatore di file-End of Image (EOI) Marker (FFD9)-nei byte in arrivo, poiché l'immagine sarà pronta per la visualizzazione quando viene inviata. Come posso testare questo? O mi manca qualcosa su come vengono archiviati i dati o sul marcatore all'interno del file JPEG, ma qualsiasi aiuto nei test per questo sarebbe molto apprezzato!

Giacomo

È stato utile?

Soluzione

Ovviamente non vuoi chiudere il flusso perché ucciderebbe le prestazioni.

Poiché si controlla la connessione del server client, invia il numero di byte nell'immagine prima di inviare i dati dell'immagine. Meglio ancora, invia il numero di byte nell'immagine, i dati dell'immagine e un # seriale facilmente identificato alla fine in modo da poter verificare rapidamente che i dati siano effettivamente arrivati.

Molto più semplice ed efficiente del controllo effettiva per la fine del marcatore di file. Tuttavia, ovviamente, potresti anche verificarlo dopo che il numero di byte è stato ricevuto anche. Abbastanza facile.

Naturalmente, tutto ciò sarà gravemente inefficiente ai fini dello stile di screensharing in tutti tranne i casi insoliti. Nella maggior parte dei casi, solo una piccola parte dello schermo da specchio cambia effettivamente con ogni frame. Se provi a inviare l'intero schermo con ogni frame, saturerai rapidamente la tua connessione e il lato client sarà orribilmente lento e non rispondente.

Dato che si tratta di un mercato estremamente maturo, ci sono tonnellate di soluzioni e parecchi bit open source da cui puoi derivare una soluzione per soddisfare le tue esigenze (vedi VNC, ad esempio).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top