iPhone SDK:如何将视频文件下载到文档目录,然后播放它们?

5

我已经在这个问题上玩了很长时间的代码,如果有人能提供一个下载来自服务器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

您的代码可以播放电影文件。

最简单的同步下载方式如下:

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方法中保存(和播放)电影文件。


谢谢,好答案,真的帮了我很多。不过我对你的代码进行了一些小改动,我使用writeData而不是appendData,因为在下载大文件时,使用appendData会导致应用程序崩溃。但是你提供的代码示例仍然非常优秀。 - Sam
是的,我的(简单)示例将比使用NSFileHandle/writeData:消耗更多的内存,这对于大文件来说会有所不同。很高兴它能帮到你。 - Paul Lynch
你也可以直接使用文件而不是NSData。提示:考虑到大文件。 - fyasar

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接