iPhone SDK: как загрузить видеофайлы в каталог документов, а затем воспроизвести их? - PullRequest
5 голосов
/ 04 апреля 2010

Я целую вечность дурачился с кодом на этом, я был бы очень признателен, если бы кто-то мог предоставить пример кода, который скачал этот файл с сервера http://www.archive.org/download/june_high/june_high_512kb.mp4, (Кстати, это не так файл, это просто идеальный пример для любого, кто пытается помочь мне), а затем воспроизвести его из каталога документов. Я знаю, что мне лень спрашивать об этом, но я пробовал так много разных вариантов NSURLConnection, что это сводит меня с ума. Кроме того, если бы мне удалось загрузить видеофайл, я был бы прав, предполагая, что этот код успешно воспроизведет его:

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

Если приведенный выше код будет работать при воспроизведении видеофайла из каталога документов, то, я думаю, единственное, что мне нужно знать, это как загрузить видеофайл с сервера. Это то, что кажется моей главной проблемой. Любая помощь с благодарностью.

Ответы [ 2 ]

18 голосов
/ 05 апреля 2010

Ваш код будет работать для воспроизведения файла фильма.

Самым простым способом загрузки является синхронно:

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

Но лучше (для отзывчивости приложений и т. Д.) Загружать асинхронно:

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

Это требует реализации неформального протокола 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];
}

и затем сохранение (и воспроизведение) файла фильма в методе movieReceived.

0 голосов
/ 11 августа 2011

Если вы хотите загружать видео асинхронно, я бы предложил использовать библиотеку ASI, чтобы ваше приложение не блокировалось, пока вы ожидаете завершения загрузки.

http://allseeing -i.com / ASIHTTPRequest /

...