Pregunta

He creado un servidor Java, que toma capturas de pantalla, las cambia de tamaño y las envía a través de TCP/IP a la aplicación de mi iPhone. Luego, la aplicación usa NSInputStream para recopilar los datos de la imagen entrantes, crear una instancia de NSMUTABLEDATA con el búfer de bytes y luego crear un objeto UIIMage para mostrar en el iPhone. Captura de pantalla, esencialmente. Mi código de iPhone para recopilar los datos de la imagen es actualmente el siguiente:

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

}
}

Mi problema, como lo indica el comentario en el código, es descubrir cuándo dejar de recopilar datos en el objeto NSMUTABLEDATA y usar los datos para crear una UIIMAGE. Parece tener sentido buscar el marcador de archivo JPEG-END del marcador de imagen (EOI) (FFD9), en los bytes entrantes, ya que la imagen estará lista para visualizar cuando esto se envíe. ¿Cómo puedo probar esto? O me falta algo sobre cómo se almacenan los datos o sobre el marcador dentro del archivo JPEG, ¡pero cualquier ayuda para probar esto sería muy apreciada!

Jaime

¿Fue útil?

Solución

Obviamente no quieres cerrar la corriente porque eso mataría el rendimiento.

Dado que controla la conexión del servidor del cliente, envíe el # de bytes en la imagen antes de enviar los datos de la imagen. Mejor aún, envíe # de bytes en la imagen, los datos de la imagen y un # de serie fácilmente identificado al final para que pueda verificar rápidamente que los datos realmente hayan llegado.

Mucho más fácil y más eficiente que verificar el final del marcador de archivo. Aunque, por supuesto, también podría verificar eso después de que se haya recibido el # de bytes. Suficientemente fácil.

Por supuesto, todo esto será muy ineficiente para fines de estilo de pantallas de pantalla en todos los casos inusuales, excepto en los casos inusuales. En la mayoría de los casos, solo una pequeña parte de la pantalla que se reflejará realmente cambia con cada cuadro. Si intenta enviar toda la pantalla con cada cuadro, saturará rápidamente su conexión y el lado del cliente será horriblemente lento e insensible.

Dado que este es un mercado extremadamente maduro, hay toneladas de soluciones y bastantes bits de código abierto de los cuales puede obtener una solución para satisfacer sus necesidades (ver VNC, por ejemplo).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top