2017-01-24 4 views
1
AVAsset *asset = [AVAsset assetWithUrl:@"myUrl.mp4"]; 
    AVPlayerItem * item = [AVPlayerItem itemWithAsset:asset]; 
    AVPlayer * player = [AVPlayer playerWithItem:item]; 
playerViewController.player = player; 
[player play]; 

どのようにそのアセットやアイテムなどを知っていれば、ビデオを完全にダウンロードできますか? 将来キャッシュするために必要です。キャッシング動画iOS

は今

NSData * videoData = [NSData dataWithUrl:myurl.mp4"]; 
NSCache *cache = [NSCache new]; 
[cache setObject:videoData forKey:myUrl]; 

を使用してIMと私はnscacheからデータを取得するとき、私はそれが

NSData *videoData = [cache objectForKey:myUrl]; 
[videoData writeToFile:MyPath.mp4 atomically:YES]; 

を提出し、再生するために書き込み、

NSURL *url = [NSURL fileUrlWithPath:mypath]; 
AVAsset *asset = =[AVAsset assetWithURL:url]; 

..etcと

を再生します

しかし、それはリットル少し遅いです。 videoDataにAVAssetが含まれている場合は、AVPlayerItemまたはAVPlayerItemを保存することができます。ただし、ダウンロードした時刻を知る必要があります。

キャッシングを別の方法で実装する方法、またはこれをアップグレードする方法はありますか。助けて。

答えて

1

我々はそのデリゲートメソッドを使用してダウンロード完了のイベントとと進行イベントを知ることができ、次のように、あなたがNSURLSessionを使用してダウンロードする機能を実装することができ、進捗状況および完了NSURLSession火災のデリゲートメソッドでダウンロードし、NSURLSessionを使用して、クラウドから任意のデータをダウンロードすることができます上下にスワイプまたはまで、私はビデオ項目の縦コレクションビューでアプリを持っている

https://www.raywenderlich.com/110458/nsurlsession-tutorial-getting-started

0

は、各項目は、継続的に自分自身を繰り返す必要があります。

だから私は以前にダウンロードしたファイルをダウンロードしないで、のファイルをストリームする必要はありません。

私は少し異なるアプローチを思い付いた:

  1. ストリームAVURLAsset、
  2. 、私はディスクにファイルを保存するためにAVAssetExportSessionを使用して終わりに達したときに、私は保存したファイルを使用して、新しいAVAssetで新しいAVPLayerItemを作成、
  3. AVPlayerのreplaceCurrentItem(と:?<#T ## AVPlayerItem#>)

しかしこれは不自由なことだと思います。私はファイルを2回スチームしなければならない。最初の実行時に初めて、次にファイルを保存するとき。現在のアプリケーションセッションでAVAssetをメモリにキャッシュしたいので、ファイルを保持する必要はありません。

関連する問題