Ios 在UITableView中播放视频

Ios 在UITableView中播放视频,ios,objective-c,uitableview,video-streaming,mpmovieplayercontroller,Ios,Objective C,Uitableview,Video Streaming,Mpmovieplayercontroller,我在这里读过几篇关于直播视频/音频的帖子。不幸的是,似乎没有任何“好”的解决办法 我希望视频具有与图像相同的功能 现在,我正在使用以下代码:- NSURL *url=[[NSURL alloc] initWithString:@"http://www.ebookfrenzy.com/ios_book/movie/movie.mov"]; MPMoviePlayerController *moviePlayer=[[MPMoviePlayerController alloc] initWithCo

我在这里读过几篇关于直播
视频/音频
的帖子。不幸的是,似乎没有任何“好”的解决办法

我希望视频具有与图像相同的功能

现在,我正在使用以下代码:-

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应用程序也在做

当您滚动表格视图时,方法
-表格视图:cellForRowAtIndexPath:
被激发(实际上每次当单元格可见时,此方法都被调用)。我相信您正在使用这种方法分配和初始化您的MediaPlayer,这就是为什么再次下载视频的原因。您可以尝试添加阵列并将已创建的单元存储在其中(某种缓存)。然后,您的
-tableView:cellForRowAtIndexPath
应该检查它是否缓存了用于实际索引的sth。如果是,则显示缓存的单元格。若否,那个么它应该创建cell、alloc和initplayer,然后将cell存储在缓存中

我的ViewController具有以下属性:
NSMutableDictionary*缓存和在
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; 
}

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

不要使用
MPMoviePlayerController
,使用
AVFoundation
AVPlayer

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

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

  • 保留由URL初始化的
    AVPlayerItem
    对象的数据源数组。不要每次滚动到单元格时都加载资源,只需将
    AVPlayerItem
    加载到单元格的播放器中,并在滚动时将其删除即可

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


    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
    }
    

    自从iOS 9以后,MPMoviePlayerController和MPMoviePlayerServiceWController就不再使用了。你应该使用其他玩家控制器。参考并确定。然后我将使用avplayervewcontroller。但我的问题是,由于tableview的原因,我如何才能一次又一次地停止下载视频。我认为这个答案会有所帮助。iOS 9中不推荐使用MPMoviePlayerController。改用AvPlayServiceController,我知道。我也用过这个。但我的问题是,当我每次滚动手机时,我怎么能停止下载视频呢?我已经试过了。但不是像我想的那样工作。。如果您有此示例代码,请提供。对我来说更好。。查看@Meharoof Najeeb的评论。我想暂停视频,当用户向下滚动并再次播放时,是否可以通过第1点完成。是否有第三方框架,我可以通过它在单元格中自动播放视频。