2010-04-03 45 views
5

我一直在这个代码上玩弄年龄段的代码,如果有人能够提供从服务器上下载这个文件的代码示例http://www.archive.org/download/june_high/june_high_512kb.mp4(顺便说它实际上不是这个文件,它只是一个任何人试图帮助我的完美例子),然后从文档目录中播放它。我知道这似乎懒我问这个,但我已经尝试了NSURLConnection的这么多不同的变种,它让我疯狂。 另外,如果我没有设法让下载的,我会在假设该代码会那么成功发挥它正确的视频文件:iPhone SDK:如何将视频文件下载到文档目录然后播放它们?

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

如果上面的代码将在从文件目录播放视频文件时,那么我想我唯一需要知道的是,如何从服务器下载视频文件。这似乎是我的主要问题。任何帮助是极大的赞赏。

回答

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方法中的文件。

+0

谢谢,很好的答案,真的帮了我很多。虽然我对代码进行了一些小改动,但appendData使用了writeData,因为应用程序在下载大文件时会用appendData炸弹。但仍然是优秀的代码示例。 – Sam 2010-04-07 00:20:46

+0

是的,我的(简单)例子会比使用NSFileHandle/writeData:will消耗更多的内存,这将对大文件产生影响。很高兴帮助。 – 2010-04-07 07:37:50

+0

您也可以直接使用文件而不是NSData。 Ps:考虑大文件。 – fyasar 2012-05-28 13:55:17

相关问题