J'ai créé un serveur Java, qui prend des captures d'écran, les redimensionne, et les envoie sur TCP/IP à mon application iPhone. L'application utilise ensuite NSInputStream pour collecter les données d'image entrantes, créer une instance NSMutableData avec le tampon d'octets, puis créer un objet UIImage à afficher sur l'iPhone. Screenshare, essentiellement. Mon code iPhone pour recueillir les données d'image est actuellement comme suit:Streaming JPEG, détecter la fin de JPEG
- (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;
}
}
}
}
Mon problème, comme indiqué par le commentaire en code, est de déterminer quand arrêter la collecte de données dans l'objet NSMutableData, et utiliser les données créer un UIImage. Il semble logique de rechercher le marqueur Fin de fichier JPEG (EOI) - dans les octets entrants, car l'image sera prête à être affichée lors de l'envoi. Comment puis-je tester pour cela? Il me manque quelque chose sur la façon dont les données sont stockées, ou sur le marqueur dans le fichier JPEG, mais toute aide pour tester cela serait grandement appréciée!
James
1) 'buffer [len]' est passé la fin du morceau qu'il a lu, qui n'est long que de 'lte' octets (donc le dernier index est' len-1', et 2) ''FFD9'' est pas un octet, c'est 4 octets; vous voulez probablement dire '0xFFD9', qui est de 2 octets, mais vous devrez en quelque sorte lire les 2 derniers octets, au lieu du dernier octet; et puis vous devez tester les octets individuellement, ou avoir à vous soucier de l'endianness – user102008