Pergunta

Eu criei um servidor Java, que leva as capturas de tela, as redimensiona e as envia pelo TCP/IP para o meu aplicativo para iPhone. O aplicativo usa o NSInputStream para coletar os dados da imagem recebida, criar uma instância NSMutableData com o buffer de byte e, em seguida, crie um objeto UIImage a ser exibido no iPhone. Screenshare, essencialmente. Meu código do meu iPhone para coletar os dados da imagem é o seguinte:

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

}
}

Meu problema, conforme indicado pelo comentário no código, é descobrir quando parar de coletar dados no objeto NSMutableData e usar os dados para criar uma UIImage. Parece fazer sentido procurar o final do marcador do JPEG End do marcador de arquivos-da imagem (EOI) (FFD9)-nos bytes recebidos, pois a imagem estará pronta para exibição quando for enviada. Como posso testar isso? Estou perdendo algo sobre como os dados são armazenados ou sobre o marcador dentro do arquivo JPEG, mas qualquer ajuda para testar isso seria muito apreciada!

James

Foi útil?

Solução

Você obviamente não quer fechar o fluxo porque isso mataria o desempenho.

Como você controla a conexão do servidor do cliente, envie o número de bytes na imagem antes de enviar os dados da imagem. Melhor ainda, envie o número de bytes na imagem, os dados da imagem e um número de série facilmente identificado no final, para que você possa verificar rapidamente se os dados realmente chegaram.

Muito mais fácil e mais eficiente do que realmente verificar o final do marcador de arquivos. Embora, é claro, você também pode verificar isso depois que o número de bytes também foi recebido. Bastante fácil.

Obviamente, tudo isso será grosseiramente ineficiente para fins de estilo de compartimento de tela em todos os casos, exceto os incomuns. Na maioria dos casos, apenas uma pequena parte da tela a ser espelhada é realmente muda com cada quadro. Se você tentar enviar a tela inteira com cada quadro, saturará rapidamente sua conexão e o lado do cliente ficará terrivelmente atrasado e sem resposta.

Dado que este é um mercado extremamente maduro, existem toneladas de soluções e alguns bits de código aberto dos quais você pode derivar uma solução para atender às suas necessidades (consulte o VNC, por exemplo).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top