10

我已经阅读了几个关于直播video/audio的帖子。不幸的是,似乎没有任何“好”的解决方案。将视频播放到UITableView中

我想为图像提供相同的功能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

+3

因为iOS的9起的MPMoviePlayerController和MPMoviePlayerViewController被弃用。你应该使用其他玩家控制器。 参考https://developer.apple.com/library/ios/documentation/MediaPlayer/Reference/MPMoviePlayerController_Class/和https://developer.apple.com/library/ios/documentation/MediaPlayer/Reference/MPMoviePlayerViewController_class/index.html #// apple_ref/occ/cl/MPMoviePlayerViewController – Skywalker

+0

好的。然后我将使用AVPlayerViewController。但我的问题是,我怎么能停止一再下载该视频由于实现代码如下.. –

+1

我想这个答案将help..http://stackoverflow.com/a/14961854/5316422 – Skywalker

回答

7

当您滚动表格视图时,将触发方法-tableView:cellForRowAtIndexPath:(实际上每次单元格可见时调用此方法)。我相信你正在用这种方法分配和初始化你的MediaPlayer,这就是为什么视频再次下载的原因。你可以尝试添加数组并存储已经创建的单元格(某种缓存)。那么你的-tableView:cellForRowAtIndexPath应该检查它是否有缓存的实际索引。如果是,则显示缓存的单元格。如果没有,那么它应该创建单元格,alloc和init播放器,然后将单元存储在缓存中。

我的视图控制器具有属性: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; 
} 

这对我的作品。当然,您需要使用自己的数据源等。

+1

我已经试过这个。但不能像我想要的那样工作。如果您有示例代码,则请提供。它对我更好..检查评论@Meharoof Najeeb下的问题.. –

+0

@MeetDoshi我已经添加了示例代码广告,你希望 – owocki

+0

谢谢.. !!这听起来不错。老实说它是一个伟大的逻辑。 –

9

请勿使用MPMoviePlayerController,请使用AVFoundationAVPlayer

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

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

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

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

+0

我想暂停视频,当用户滚动下来,再次发挥它,可以将其逐点进行无1 –

+0

你能下载视频提供了一个代码。 –

+0

是否有任何第三方框架,我可以自动播放单元格中的视频。 –

2

夫特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 
}