2010-04-03 25 views
5

Tôi đã lừa xung quanh với mã cho các lứa tuổi trên này, tôi sẽ rất biết ơn nếu ai đó có thể cung cấp một mẫu mã tải về tập tin này từ một máy chủ http://www.archive.org/download/june_high/june_high_512kb.mp4, (Bằng cách này nó không thực sự tập tin này, nó chỉ là một ví dụ hoàn hảo cho bất kỳ ai cố gắng giúp tôi) và sau đó chơi nó từ thư mục tài liệu. Tôi biết nó có vẻ lười biếng của tôi để hỏi điều này nhưng tôi đã thử rất nhiều biến thể khác nhau của NSURLConnection mà nó làm tôi phát điên. Ngoài ra, nếu tôi đã quản lý để có được các tập tin video tải về Tôi sẽ đúng trong giả mã này sau đó sẽ chơi thành công nó:iPhone SDK: Làm cách nào để bạn tải xuống các tệp video vào Thư mục tài liệu và sau đó phát chúng?

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

Nếu mã trên sẽ làm việc trong chơi một tập tin video từ thư mục tài liệu, sau đó tôi đoán điều duy nhất tôi cần biết là cách tải xuống tệp video từ máy chủ. Đó là những gì có vẻ là vấn đề lớn của tôi. Bất kỳ trợ giúp nào cũng được đánh giá rất cao.

Trả lời

18

Mã của bạn sẽ hoạt động để phát tệp phim.

Cách đơn giản nhất để tải về là đồng bộ:

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

Nhưng nó là tốt hơn (ví đáp ứng ứng dụng, vv) để tải không đồng bộ:

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

Điều này đòi hỏi thực hiện các giao thức NSURLConnection không chính thức:

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

và sau đó lưu (và phát) phim tệp trong phương thức movieReceived.

+0

Cảm ơn, câu trả lời hay, thực sự đã giúp tôi rất nhiều. Mặc dù vậy, tôi đã thực hiện một thay đổi nhỏ đối với mã của bạn, thay vì appendData tôi sử dụng writeData, vì ứng dụng sẽ phát hành với appendData khi tải xuống các tệp lớn. Nhưng vẫn còn ví dụ mã tuyệt vời. – Sam

+0

Vâng, ví dụ đơn giản của tôi sẽ tiêu thụ nhiều bộ nhớ hơn là sử dụng NSFileHandle/writeData: sẽ tạo ra sự khác biệt cho các tệp lớn. Vui mừng nó đã giúp. –

+0

Bạn cũng có thể sử dụng tệp trực tiếp thay cho NSData. Ps: Xem xét các tệp lớn. – fyasar

0

Nếu bạn muốn tải xuống video không đồng bộ, tôi khuyên bạn nên sử dụng thư viện ASI, vì vậy ứng dụng của bạn không bị khóa trong khi bạn đợi tải xuống hoàn tất.

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

Các vấn đề liên quan