Ich arbeite an einer kleinen App für das iPhone auf der Grundlage von Ideen, die für eine Android-App verwendet wurden.
Zum Testen benutze ich natürlich den Simulator, aber der Simulator hat keine Unterstützung für die eingebaute Kamera. Die Android-Idee, dies zu testen, besteht in der Verwendung eines WebCamBroadcaster Java app auf dem Desktop, um Bilder von eingebauten Webcam zu erfassen und übergeben Sie es durch Socket. Dann in der App lesen Sie einfach die Bytes und konvertieren in Bild.
Nun, ich habe versucht, das Gleiche mit dem iPhone Simulator zu tun. Bei der Suche im Web habe ich eine Klasse gefunden, die mit asynchronen Sockets arbeitet ( cocoaasyncsocket ). Aber ich kann es nicht zum Laufen bringen.
Die Java-App sendet die Frames wie folgt:
socket = ss.accept();
BufferedImage image = videoCapture.getNextImage();
if (image != null) {
OutputStream out = socket.getOutputStream();
if (RAW) {
image.getWritableTile(0, 0).getDataElements(0, 0, w$
image.releaseWritableTile(0, 0);
DataOutputStream dout = new DataOutputStream(new Bu$
out));
for (int i = 0; i < data.length; i++) {
dout.writeInt(data[i]);
}
dout.close();
} else {
ImageIO.write(image, "JPEG", out);
}
}
Die Android-Version verwendet C-Code, um den Socket-Lesevorgang wie folgt zu implementieren:
long read_count, total_read = 0;
while (total_read < readBufSize)
{
read_count = read(sockd, &readBuf[total_read], readBufSize);
if (read_count <= 0 || errno != 0)
{
char buffer[100];
sprintf(buffer, "socket read errorno = %d", errno);
LOGV(buffer);
break;
}
total_read += read_count;
}
// If we read all of the data we expected, we will load the frame from the p$
if (total_read == readBufSize){
frame = loadPixels(readBuf, width, height);}
Where readBufsize = width*height*sizeof(int);
readBuf = (char*)malloc(readBufSize);
Also ich versuche, das gleiche für iPhone zu implementieren, aber ich habe einen Fehler in der Verbindung (errno = 2) Dann finde ich cocoaasyncsocket und ich versuche zu verwenden, aber ich habe einen unbekannten Fehler und nichts wird gelesen:
#import <Foundation/Foundation.h>
#import "AsyncSocket.h"
@interface Captura : NSObject {
NSString *ipserver;
UInt16 port;
NSError *errPtr;
AsyncSocket *socket;
NSMutableData *socketData;
}
@property (nonatomic,retain) NSString *ipserver;
@property (retain) AsyncSocket *socket;
@property (retain) NSError *errPtr;
//will contain de data read from socket
@property (retain) NSMutableData *socketData;
-(id)initWithIp:(NSString*)ip puerto:(UInt16)p;
-(BOOL)open;
-(void)close;
-(void)beginRead;
- (UIImage*)getImage;
@end
und die Umsetzung
#import "Captura.h"
@implementation Captura
@synthesize ipserver;
@synthesize socket;
@synthesize errPtr;
@synthesize socketData;
-(id)initWithIp:(NSString*)ip puerto:(UInt16)p{
if (self = [super init]) {
ipserver = ip;
port = p;
socket = [[AsyncSocket alloc] initWithDelegate:self];
socketData = [[NSMutableData alloc] init];
}
return self;
}
//Connect
-(BOOL)open{
return [socket connectToHost:ipserver onPort:port error:&errPtr];
}
-(void)beginRead{
NSLog(@"Begin Read");
NSUInteger offset = [socketData length];
[socket readDataWithTimeout:1
tag:0];
}
- (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port{
NSLog(@"Conectado al servidor");
}
- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag {
NSLog(@"Data leida %u",[data length]);
[socketData appendData:data];
[self beginRead];
}
- (void)onSocketDidDisconnect:(AsyncSocket *)sock{
[socketData release];
[ipserver release];
[socket release];
NSLog(@"MutableData length %u", [socketData length]);
NSLog(@"Socket Desconectado");
}
- (void)onSocket:(AsyncSocket *)sock willDisconnectWithError:(NSError *)err{
NSLog(@"Ocurrió un error desconectando.... %@",err);
}
- (UIImage*)getImage{
NSData *data;
[socketData getBytes:data length:320*480*sizeof(int)];
NSLog(@"Data obtenida %@",[data length]);
if ([socketData length]>320*480*sizeof(int)) {
[socketData replaceBytesInRange:NSMakeRange(0,320*480*sizeof(int)) withBytes:NULL length:0];
}
if (data!=nil && [data length]) {
UIImage *img = [[UIImage alloc] initWithData:data];
[data release];
return img;
}
[data release];
return nil;
}
@end
Nun, dieser Code verbindet sich mit dem Server und initialisiert den Leseprozess und schließt sich dann. Der Socket wird getrennt und die App wird geschlossen.
Ich kann die getImage-Methode noch nicht testen...
Eine Idee?
Vielen Dank im Voraus...