2013-02-13 11 views
6

私は、私がUITableViewで表示しているビデオをいくつか持っています。ビデオはサーバーにリモートで保存されます。次のコードの一部を使用して、ビデオをテーブルビューに読み込むことができます。AVPlayerItem(ビデオ)をUITableviewで再利用するためにキャッシュする方法

NSString *urlString = [NSString stringWithFormat:[row objectForKey:@"video_uri"]]; 
NSURL* url = [NSURL URLWithString:urlString]; 
AVPlayerItem *pItem = [AVPlayerItem playerItemWithURL:url]; 
AVPlayer *player = [AVPlayer playerWithPlayerItem:pItem]; 

テーブルビューがセルをデキューした後、再び再キューに入れられるたびに、ビデオはURLから再度ロードされます。私は、ビデオをダウンロードしてキャッシュまたは保存して、再び接続することなく電話から再生できるようにする方法があるのだろうかと思っています。私は、Appleが提供しているLazyTableImagesの例で使用されていたテクニックをopoinで描画しようとしていましたが、ちょっと固まってしまいました。

+0

あなたはこれを行う方法を理解しましたか? – user3344977

答えて

2

これを行う方法は1つありますが、その後、古いデバイスに課金されている可能性があります。そのため、アプリはMediaServerDによって捨てられます。

作成時に、各プレーヤーをNSMutableArrayに保存します。配列内の各インデックスは、UITableViewのindexPath.rowに対応する必要があります。

4

これでAVPlayerItemsをキャッシュしようとして失敗してしまったので、私は、AVPlayerItemの基礎となるAVAssetをキャッシュすると、AVPlayerItem自体は意味がないのに対し、再利用することができます。再利用される。

+1

サンプルコードを投稿したり、AVAssetを使用してキャッシュを実行する手順を記述できますか? – Infaz

+0

「AVPlayerItemは再利用することを目的としていません」この回答の一部は私に役立ちました。 –

0

昨日友達とこの問題を解決しました。私たちが使ったコードは、基本的にNSURLSessionビルトインキャッシングシステムを使ってビデオデータを保存します。ここにあります:

NSURLSession *session = [[KHURLSessionManager sharedInstance] session]; 
    NSURLRequest *req = [[NSURLRequest alloc] initWithURL:**YOUR_URL**]; 
    [[session dataTaskWithRequest:req completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { 


     // generate a temporary file URL 

     NSString *filename = [[NSUUID UUID] UUIDString]; 

     NSURL *temporaryDirectoryURL = [NSURL fileURLWithPath:NSTemporaryDirectory() isDirectory:YES]; 
     NSURL *fileURL = [[temporaryDirectoryURL URLByAppendingPathComponent:filename] URLByAppendingPathExtension:@"mp4"]; 


     // save the NSData to that URL 
     NSError *fileError; 
     [data writeToURL:fileURL options:0 error:&fileError]; 


     // give player the video with that file URL 
     AVPlayerItem *playerItem = [AVPlayerItem playerItemWithURL:fileURL]; 
     AVPlayer *player = [AVPlayer playerWithPlayerItem:playerItem]; 
     _avMovieViewController.player = player; 
     [_avMovieViewController.player play]; 



    }] resume]; 

第2に、NSURLSessionのキャッシュ設定を設定する必要があります。私KHURLSessionManagerは、次のコードでこれの世話をする:

NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; 
    config.requestCachePolicy = NSURLRequestReturnCacheDataElseLoad; 
    _session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]]; 

最後に、あなたはあなたのキャッシュファイルのために十分な大きさであることを確認する必要があり、私はAppDelegateに次のように置きます。

 [NSURLCache sharedURLCache].diskCapacity = 1000 * 1024 * 1024; // 1000 MB 

これが役に立ちます。

+0

これは良いコードのようです。しかし、あなたは本当にNSURLSessionがローカルディスクに保存する必要がありますか?なぜAVAssetExportSessionを使用しないのですか? – joey

関連する問題