【问题标题】:iPhone SDK: How do you download video files to the Document Directory and then play them?iPhone SDK:如何将视频文件下载到文档目录然后播放?
【发布时间】:2010-04-03 20:15:16
【问题描述】:

我多年来一直在玩弄这个代码,如果有人能提供一个从服务器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];

如果上面的代码可以从文档目录播放视频文件,那么我想我唯一需要知道的是,如何从服务器下载视频文件。这似乎是我的主要问题。非常感谢任何帮助。

【问题讨论】:

    标签: iphone nsurlconnection download


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢,很好的回答,真的帮了我很多。不过,我对您的代码做了一个小的更改,而不是 appendData,我使用 writeData,因为下载大文件时应用程序会使用 appendData 炸毁。但仍然是优秀的代码示例。
    • 是的,我的(简单)示例将比使用 NSFileHandle/writeData: 消耗更多内存,这对于大文件会有所不同。很高兴它有帮助。
    • 你也可以直接使用文件而不是NSData。 Ps:考虑大文件。
    【解决方案2】:

    如果您想异步下载视频,我建议您使用 ASI 库,这样您的应用就不会在您等待下载完成时锁定。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-27
      • 2016-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-15
      相关资源
      最近更新 更多