7

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の例で使用されているテクニックを使用して描画しようとしていましたが、少し行き詰まりました。

4

3 に答える 3

5

AVPlayerItems をキャッシュしようとして失敗した後、AVPlayerItem の基になる AVAsset をキャッシュする方がはるかにうまく機能するという結論に達しました。

于 2014-02-05T02:05:49.260 に答える
2

これを行う方法は 1 つありますが、古いデバイスに負担がかかり、アプリが MediaServerD によって放棄される可能性があります。

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

于 2013-02-27T19:22:30.563 に答える
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];

次に、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

お役に立てれば。

于 2016-02-12T19:59:34.987 に答える