【问题标题】:AVPlayer cause TableView To LagAVPlayer 导致 TableView 滞后
【发布时间】:2019-09-20 00:49:28
【问题描述】:

我必须在我的应用程序中的 tableView 单元格中播放视频。根据视图屏幕大小,我的表格可以在小屏幕设备中显示 2 个单元格,在 iPhone XSMax 或 Xr 等大屏幕设备中显示 3 个单元格

流程 AVPlayerController 类已创建

class CustomAVPlayerViewController: AVPlayerViewController {
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        print("touchesBegan")
    }
}

在单元类中创建的实例

var myImgArray=[String]()
    var myVideoArray=[String]()
    var myVideoPlayer : AVPlayer?
    var videoPlayerController : CustomAVPlayerViewController?
    var myPlayerItems=[AVPlayerItem]()

准备重用函数

override func prepareForReuse() {
        myVideoPlayer?.replaceCurrentItem(with: nil)
        videoPlayerController=nil
        myVideoPlayer=nil
        self.count=0
        myPlayerItems.removeAll()
        myImgArray.removeAll()
        myVideoArray.removeAll()
        NotificationCenter.default.removeObserver(NSNotification.Name.AVPlayerItemDidPlayToEndTime)
        for vieww in myScrollView.subviews {
            vieww.removeFromSuperview()
        }

    }

我正在为单元格使用AVPLayer 实例一。一个单元格可以包含多个视频,因此为此使用了滚动视图

if !videoArray.isEmpty {
            /// We've Videos
            for i in 0..<videoArray.count {
                ///Get Origin
                let xOrigin : CGFloat = CGFloat(i) * myScrollView.frame.size.width + (CGFloat(imgArray.count)*myScrollView.frame.size.width)
                let newPlayerItem = AVPlayerItem(url: URL(string: videoArray[i])!)
                myPlayerItems.append(newPlayerItem)
                if i == 0 {
                    self.myVideoPlayer=AVPlayer(playerItem: newPlayerItem)
                    self.videoPlayerController = CustomAVPlayerViewController()
                    NotificationCenter.default.removeObserver(NSNotification.Name.AVPlayerItemDidPlayToEndTime)
                    NotificationCenter.default.addObserver(self, selector: #selector(self.playerDidFinishPlaying(note:)), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: self.myVideoPlayer!.currentItem)
                    self.videoPlayerController?.player = self.myVideoPlayer!
                    self.videoPlayerController?.view.frame = CGRect(x: xOrigin+10, y: 10, width: self.myScrollView.frame.size.width-20, height: self.myScrollView.frame.size.height-20)
                    self.myVideoPlayer?.play()
                    myScrollView.addSubview(self.videoPlayerController!.view)
                    myScrollView.bringSubviewToFront(self.videoPlayerController!.view)
                }
            }
        }

如上面的代码所示,我正在循环播放视频数组并将其子视图添加到滚动视图中

问题 -

当屏幕上有多个单元格有视频时,它开始滞后 或下一个要加载的有视频的单元格

我使用prepareForReuse 来避免高内存使用。 应用程序在 4 分钟内循环到 40 MB,其中还包括其他功能

我能做什么?

尝试过的东西

  1. 检查 IndexPathForVisibleCell 它包括三个单元格,一旦我的单元格离开屏幕就会显示我删除 scrollView 子视图和 AVPLayer 实例。

  2. 使用全局 AVPLayer 实例但没有用。它不播放视频 原因 - 当三个单元格在屏幕上时,它不会再次出列,因此不会加载视频,因为全局实例将仅添加到一个中,并且 prepareForReuse 导致没有视频播放

【问题讨论】:

标签: ios swift uitableview tableview avplayer


【解决方案1】:

它可能会因为您添加和删除 AVPlayer 视图而滞后。 您可以重复使用它们,而不是删除它们,以便在单元格在屏幕上可见时更新链接。 你可以参考任何这样的文章:Best way to check if UITableViewCell is completely visible

【讨论】:

  • 我应该在哪里打电话? cellForRow 不是一个好的选择。你能建议吗
  • 你可以看看tableView:willDisplayCell:forRowAtIndexPath:
  • 请提一个小建议。我一写 myPlayer?.play() 它就会导致 tableview 现在几乎没有滞后。像闪烁一样。知道我该怎么做吗?
  • 您可以设置一个延迟,例如当单元格出现在屏幕上超过一秒后,您将开始播放。否则,什么都不做。
  • 就像使用 DispatchQueue.asyncAfter() 一样?并再次检查可见索引?
猜你喜欢
  • 1970-01-01
  • 2015-12-03
  • 1970-01-01
  • 2017-10-08
  • 2016-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多