2010-04-03 4 views
5

Byłem wygłupiać z kodu na wieki na tym, Byłbym bardzo wdzięczny, gdyby ktoś mógł dostarczyć próbkę kodu, który pobrał ten plik z serwera http://www.archive.org/download/june_high/june_high_512kb.mp4, (Tak przy okazji to nie jest tak naprawdę ten plik, to tylko doskonały przykład dla każdego, kto próbuje mi pomóc), a następnie odtwarzać go z katalogu dokumentów. Wiem, że wydaje mi się leniwy, że o to pytam, ale próbowałem tak wielu różnych odmian NSURLConnection, że doprowadza mnie to do szału. Ponadto, jeśli udało się pobrać plik wideo pobrany byłbym słusznie zakładając, że ten kod będzie wtedy z powodzeniem grać:iPhone SDK: Jak pobierać pliki wideo do katalogu dokumentów, a następnie je odtwarzać?

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]; 

Jeżeli powyższy kod będzie działać w odtwarzania pliku wideo z katalogu dokumentów, wtedy myślę, że jedyną rzeczą, którą powinienem wiedzieć, jest to, jak pobrać plik wideo z serwera. To, co wydaje się moim głównym problemem. Każda pomoc jest bardzo doceniana.

Odpowiedz

18

Twój kod będzie działał, aby odtworzyć plik filmowy.

Najprostszym sposobem na pobranie jest synchronicznie:

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

Ale lepiej (dla aplikacji reagowania, itp), aby pobrać asynchronicznie:

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

Wymaga to wdrożenia nieformalny protokół NSURLConnection:

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

a następnie zapisywanie (i odtwarzanie) filmu plik w metodzie movieReceived.

+0

Dzięki, dobra odpowiedź, bardzo mi pomogło. Wprowadziłem jednak niewielką zmianę do twojego kodu, zamiast appendData używam writeData, ponieważ aplikacja wyrzuca z appendData podczas pobierania dużych plików. Ale wciąż doskonały przykład kodu. – Sam

+0

Tak, mój (prosty) przykład zużyje więcej pamięci niż przy użyciu NSFileHandle/writeData: will, co zrobi różnicę dla dużych plików. Cieszę się, że to pomogło. –

+0

Możesz także użyć bezpośrednio pliku zamiast NSData. Ps: Rozważ ogromne pliki. – fyasar