Вопрос:

Воспроизведение видео в UITableView

ios objective-c uitableview video-streaming mpmovieplayercontroller

5224 просмотра

3 ответа

2995 Репутация автора

Я прочитал несколько постов здесь о прямой трансляции video/audio. К сожалению, похоже, что не существует «хорошего» решения.

Я хочу такую ​​же функциональность для видео, которое предоставляется SDWebImageViewдля изображений.

Прямо сейчас я использую следующий код: -

NSURL *url=[[NSURL alloc] initWithString:@"http://www.ebookfrenzy.com/ios_book/movie/movie.mov"];
MPMoviePlayerController *moviePlayer=[[MPMoviePlayerController alloc] initWithContentURL:url];
moviePlayer.controlStyle=MPMovieControlStyleDefault;
moviePlayer.shouldAutoplay=YES;

Но когда я прокручивал tableview, все видео скачивали снова и снова . Так как я могу остановить эту загрузку?

Есть ли лучшее решение для воспроизведения видео в UITableView? То же самое делают Facebook, Instagram и Vine Apps ?

Автор: Meet Doshi Источник Размещён: 30.12.2015 09:06

Ответы (3)


7 плюса

71 Репутация автора

Когда вы прокручиваете табличное представление, тогда метод -tableView:cellForRowAtIndexPath:запускается (фактически каждый раз, когда ячейка будет видна, этот метод вызывается). Я полагаю, что вы выделяете и инициализируете свой MediaPlayer этим способом, и поэтому видео загружается снова. Вы можете попытаться добавить массив и сохранить в нем уже созданные ячейки (своего рода кеш). Затем вы -tableView:cellForRowAtIndexPathдолжны проверить, что он кешировал для фактического индекса. Если да, то показать ячейку в кэше. Если нет, то он должен создать ячейку, alloc и init player, а затем сохранить ячейку в кеше.

Мой ViewController имеет свойство: NSMutableDictionary *cache;и у ViewDidLoadменя есть: cache = [[NSMutableDictionary alloc] init]; Мой -tableView:cellForRowAtIndexPath:выглядит так:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *cellId = @"myCellId";

    MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];

    if ([cache objectForKey:[NSString stringWithFormat:@"key%lu", indexPath.row]] != nil) {
        cell = [cache objectForKey:[NSString stringWithFormat:@"key%lu", indexPath.row]];
    } else {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"MyTableViewCell" owner:self options:nil];
        cell = [nib objectAtIndex:0];

        AVPlayerViewController *playerViewController = [[AVPlayerViewController alloc] init];
        playerViewController.player = [AVPlayer playerWithURL:[[NSURL alloc] initWithString:@"http://www.ebookfrenzy.com/ios_book/movie/movie.mov"]];
        [cell addSubview:playerViewController.view];
        [cache setValue:cell forKey:[NSString stringWithFormat:@"key%lu", indexPath.row]];
    }

    return cell; 
}

Меня устраивает. Конечно, вам нужно использовать свой собственный источник данных и т. Д.

Автор: owocki Размещён: 02.02.2016 11:03

9 плюса

34665 Репутация автора

Не следует использовать MPMoviePlayerController, использовать AVFoundation«S AVPlayer.

Кроме того, не связывайте загрузку вашего ресурса с вашим UITableViewCellподклассом. Используйте дополнительный источник данных для загрузки и управления видео активами.

Есть несколько способов сделать это.

  1. Сохраняйте массив источников данных AVPlayerItemобъектов, инициализированных по URL. Вместо того, чтобы загружать актив каждый раз, когда вы прокручиваете в ячейку, просто загрузите его AVPlayerItemв проигрыватель ячейки и удалите его, когда вы прокручиваете.

  2. Если вам необходимо сохранить данные видео, рассмотрите возможность загрузки каждого видео во временный файл в каталоге «Документы». Когда файл завершит загрузку, загрузите эти данные, AVAssetиспользуя его initWithURL:метод, и укажите URL-адрес вашего локального файла. Когда вы будете готовы, вы можете загрузить свой ресурс в AVPlayerItemиспользование initWithAsset:и воспроизвести видео.

Автор: JAL Размещён: 02.02.2016 09:40

3 плюса

509 Репутация автора

Свифт 3

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell : UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "Cell")!
    let videoURL = NSURL(string: "http://www.ebookfrenzy.com/ios_book/movie/movie.mov")
    let player = AVPlayer(url: videoURL! as URL)
    let playerLayer = AVPlayerLayer(player: player)
    playerLayer.frame = cell.bounds
    cell.layer.addSublayer(playerLayer)
    player.play()
    return cell
}
Автор: Aayushi Размещён: 08.04.2017 11:19
Вопросы из категории :
32x32