滚动 tableView 后,视频在 AVPlayerController 的 UITableView 单元格中停止加载

Posted

技术标签:

【中文标题】滚动 tableView 后,视频在 AVPlayerController 的 UITableView 单元格中停止加载【英文标题】:Videos stop loading in UITableView cell in AVPlayerController after scrolling through the tableView 【发布时间】:2017-03-14 10:05:03 【问题描述】:

我有一个表格视图,我正在尝试加载视频并在 viewdidLoad() 上播放它们

以下是在 Viewdidload 上加载视频的代码

 func playVideo(viewController:UIViewController,videoPath:String!, view: UIView) 

        guard let path = videoPath else 
            debugPrint("video.m4v not found")
            return
        

        let url = NSURL.fileURL(withPath: path)
        let item = AVPlayerItem(url: url)
        self.player = AVPlayer(playerItem: item)
        self.videoPlayerController = AVPlayerViewController()
        self.videoPlayerController.player = self.player
        videoPlayerController.view.frame = view.bounds
        viewController.addChildViewController(videoPlayerController)
        view.addSubview(videoPlayerController.view)

    

在 cellForRowAtIndexPath 内部我正在做以下事情

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
    
        cell = tableView.dequeueReusableCell(withIdentifier: "trendViewControllerCell", for: indexPath) as! TrendViewTableCell
        cell.videoName.text = feeds[indexPath.row].videoTitle
        cell.artistName.text = feeds[indexPath.row].artistName
        player.playVideo(viewController: self, videoPath: Bundle.main.path(forResource: feeds[indexPath.row].videoUrl, ofType:"mp4")!, view: cell.videoView)

        return cell
    

我正在尝试将 AVPlayerController 调整为 tableView 单元格中的视图。

在 viewDidLoad 上,我可以看到单元格中所有视图的 AVPlayer 控制器。

大约有 15 个视频

当我进一步向下滚动时,我看到一个取消的按钮,并且没有加载任何视频。有时会加载所有视频,有时则不会。

但是我在模拟器中没有看到这个问题。

我该如何解决这个问题?任何帮助将不胜感激

【问题讨论】:

【参考方案1】:

抱歉,您的方法不是一个好主意:为每个单元格设置一个 AVPlayer 非常繁重,您可能会遇到很多相关问题,例如每次单元格出现时重新加载视频、滚动不顺畅、性能不佳等。

另外请记住,AVPlayer 总是在主线程中实例化,因此在滚动时您不应实例化任何其他播放器视频,否则您会忙于主线程(与用户界面更新!)。

像 Instagram 和 Facebook 一样,这里的常用方法是有一个 AVPlayer 视频的通用实例以及每个视频的第一帧或最后一帧的图像:当您的单元格完全可见时,将图像覆盖您的视频播放器视图使用replaceCurrentItemWithPlayerItem 传递视频网址。

这不是一件容易和快速的事情,所以慢慢来,耐心等待,随着时间的推移,您将构建您的解决方案;您可以找到有关这些问题的更多信息:

AVPlayerItem replaceCurrentItemWithPlayerItem Blocking Maintaining good scroll performance when using AVPlayer

【讨论】:

我希望表格视图单元格通过播放和暂停选项可见。所以我使用的是 AVPlayerController。我应该使用 AVlayer 吗?您还可以提供一个示例,当用户单击表格视图内的视频视图时,我可以播放视频,并且这些视频会在用户滚动屏幕时暂停 AVPlayerController 是一个 UIViewController 包含一个 AVPlayer ;)

以上是关于滚动 tableView 后,视频在 AVPlayerController 的 UITableView 单元格中停止加载的主要内容,如果未能解决你的问题,请参考以下文章

升级到 iPhone OS 4 后,我的 TableView 在调用 reloadData 后滚动到顶部

Swift - tableView 行高仅在滚动或切换展开/折叠后更新

iOS tableView 滚动后回到顶部

分组 TableView,使用自定大小的部分标题,重新加载后,如果我向上滚动,tableview 会跳转

分配代理以检测滚动后,TableView单元格重叠

滚动 UITableView 停止视频播放