Вопрос по ios, video, avplayer, caching, uitableview – Как кэшировать AVPlayerItem (Video) для повторного использования в UITableview

6

У меня есть несколько видео, которые я показываю в 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. Я'Интересно, есть ли способ загрузки и кэширования или сохранения видео, чтобы его можно было воспроизвести с телефона без повторного подключения. Я пытался нарисовать метод, используемый вLazyTableImages пример, предоставленный Apple, но яя немного застрял.

Вы когда-нибудь выясняли, как это сделать? user3344977

Ваш Ответ

3   ответа
2

Там'Это один из способов сделать это, но это может облагать налогом устаревшие устройства, что впоследствии приведет к тому, что MediaServerD выбросит ваше приложение.

После создания сохраните каждого игрока в NSMutableArray. Каждый индекс в массиве должен соответствовать indexPath.row объекта UITableView.

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

Надеюсь это поможет.

это выглядит как хороший код. Но нужен ли вам NSURLSession для сохранения на локальный диск? Почему бы просто не использовать AVAssetExportSession? joey
5

После того, как я возился с этой неудачной попыткой кэшировать AVPlayerItems, ямы пришли к выводу, что он работает намного лучше, если вы кешируете AVPlayerItem 'базовый AVAsset, который предназначен для повторного использования, тогда как сам AVPlayerItem не предназначен для повторного использования.

Можете ли вы опубликовать пример кода или описать шаги, как сделать кэш с помощью AVAsset? Infaz
"AVPlayerItem не предназначен для повторного использования " часть этого ответа помогла мне. Oscar Swanros

Похожие вопросы