2010-04-03 13 views
5

He estado jugando con el código durante años en este caso, estaría muy agradecido si alguien pudiera proporcionar un ejemplo de código que descargó este archivo de un servidor http://www.archive.org/download/june_high/june_high_512kb.mp4, (Por cierto, no es este archivo, es solo un ejemplo perfecto para cualquiera que intente ayudarme) y luego reprodúzcalo desde el directorio de documentos. Sé que me da pereza preguntar esto, pero he intentado tantas variaciones diferentes de NSURLConnection que me está volviendo loco. Además, si me las arreglé para obtener el archivo de vídeo descargado iba a ser correcto en asumir este código ya que entonces el juego con éxito:iPhone SDK: ¿Cómo se descargan los archivos de video al Directorio de documentos y luego se reproducen?

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"june_high_512kb.mp4"]; 
NSURL *movieURL = [NSURL fileURLWithPath:path]; 
self.theMovie = [[MPMoviePlayerController alloc] initWithContentURL:movieURL]; 
[_theMovie play]; 

Si el código anterior podría trabajar en la reproducción de un archivo de vídeo desde el directorio de documentos, entonces supongo que lo único que necesitaría saber es cómo descargar un archivo de video de un servidor. Que es lo que parece ser mi mayor problema. Cualquier ayuda es muy apreciada.

Respuesta

18

Su código funcionará para reproducir un archivo de película.

La forma más sencilla de descarga es de forma sincrónica:

NSData *data = [NSData dataWithContentsOfURL:movieUrl]; 
[data writeToURL:movieUrl atomically:YES]; 

Pero es mejor (para la capacidad de respuesta de aplicaciones, etc) para descargar de forma asíncrona:

NSURLRequest *theRequest = [NSURLRequest requestWithURL:movieUrl cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60]; 
    receivedData = [[NSMutableData alloc] initWithLength:0]; 
     NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self startImmediately:YES]; 

Esto requiere la implementación del protocolo NSURLConnection informal:

- (void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; 
    [receivedData setLength:0]; 
} 

- (void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    [receivedData appendData:data]; 
} 

- (void) connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { 
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 
    [connection release]; 
} 

- (NSCachedURLResponse *) connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse { 
    return nil; 
} 

- (void) connectionDidFinishLoading:(NSURLConnection *)connection { 
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 
    [connection release]; 
    [self movieReceived]; 
} 

y luego guardar (y reproducir) la película archivo en el método movieReceived.

+0

Gracias, buena respuesta, realmente me ha ayudado mucho. Sin embargo, realicé un cambio menor en tu código, en lugar de appendData utilizo writeData, ya que la aplicación sale volando con appendData al descargar archivos de gran tamaño. Pero aún es un excelente ejemplo de código. – Sam

+0

Sí, mi ejemplo (simple) consumirá más memoria que usar NSFileHandle/writeData: will, lo que hará una diferencia para archivos grandes. Me alegro de que haya ayudado. –

+0

También puede usar directamente el archivo en lugar de NSData. Ps: Considere archivos enormes. – fyasar

Cuestiones relacionadas