将视频播放到UITableView中

时间:2015-12-30 09:06:05

标签: ios objective-c uitableview video-streaming mpmovieplayercontroller

我在这里看过几篇关于直播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应用

3 个答案:

答案 0 :(得分:9)

请勿使用MPMoviePlayerController,使用AVFoundation' AVPlayer

此外,不要将资产下载到UITableViewCell子类。使用其他数据源下载和管理视频资产。

有几种方法可以做到这一点。

  1. 保留由URL初始化的AVPlayerItem个对象的数据源数组。每次滚动到单元格时都不会加载资源,只需将AVPlayerItem加载到单元格的播放器中,然后在滚动时将其删除。

  2. 如果您需要保留视频数据,请考虑将每个视频下载到Documents目录中的临时文件。文件下载完成后,使用AVAsset方法将该数据加载到initWithURL:,并将URL指向本地文件。准备好后,您可以使用AVPlayerItem将资源加载到initWithAsset:并播放视频。

答案 1 :(得分:7)

滚动表视图时会触发方法-tableView:cellForRowAtIndexPath:(实际上每次调用此方法时单元格都可见)。我相信您正在使用此方法分配和初始化您的MediaPlayer,这就是为什么再次下载视频的原因。您可以尝试添加数组并在其中存储已创建的单元格(某种缓存)。然后你的-tableView:cellForRowAtIndexPath应检查它是否已缓存实际索引。如果是,则显示缓存的单元格。如果不是那么它应该创建cell,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; 
}

它对我有用。当然,您需要使用自己的数据源等。

答案 2 :(得分:3)

Swift 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
}