AVPlayer 导致 TableView 滞后
AVPlayer cause TableView To Lag
我必须在我的应用程序中的 tableView 单元格中播放视频。根据视图屏幕大小,我的 Table 可以在小屏幕设备中显示 2 个单元格,在大屏幕设备中显示 3 个单元格,例如 iPhone XSMax 或 Xr
流量
AVPlayerController
Class 已创建
class CustomAVPlayerViewController: AVPlayerViewController {
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
print("touchesBegan")
}
}
在单元格 class
中创建的实例
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)
}
}
}
如上面的代码所示,我正在遍历视频数组并将其子视图添加到 scrollView
问题 -
当屏幕上有多个有视频的单元格时,它开始延迟
或下一个要加载的包含视频的单元格
我正在使用 prepareForReuse
来避免高内存使用率。
应用程序在 运行 的 4 分钟内循环到 40 MB,其中还包括其他功能
我能做什么?
尝试过的东西
检查 IndexPathForVisibleCell
它包括三个单元格,一旦我的单元格离开屏幕就会显示我删除了 scrollView 子视图和 AVPLayer 实例。
使用全局 AVPLayer
实例但没有用。它不播放视频
原因 - 当三个单元格在屏幕上时,它不会再次出队,因此不会加载视频,因为全局实例将仅添加到一个中,prepareForReuse 导致没有视频播放
它可能会延迟,因为您添加和删除了 AVPlayer 视图。
您可以重复使用它们,而不是删除它们,这样您就可以在单元格在屏幕上可见时更新 link。
您可以像这样参考任何文章:Best way to check if UITableViewCell is completely visible
我必须在我的应用程序中的 tableView 单元格中播放视频。根据视图屏幕大小,我的 Table 可以在小屏幕设备中显示 2 个单元格,在大屏幕设备中显示 3 个单元格,例如 iPhone XSMax 或 Xr
流量
AVPlayerController
Class 已创建
class CustomAVPlayerViewController: AVPlayerViewController {
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
print("touchesBegan")
}
}
在单元格 class
中创建的实例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)
}
}
}
如上面的代码所示,我正在遍历视频数组并将其子视图添加到 scrollView
问题 -
当屏幕上有多个有视频的单元格时,它开始延迟 或下一个要加载的包含视频的单元格
我正在使用 prepareForReuse
来避免高内存使用率。
应用程序在 运行 的 4 分钟内循环到 40 MB,其中还包括其他功能
我能做什么?
尝试过的东西
检查
IndexPathForVisibleCell
它包括三个单元格,一旦我的单元格离开屏幕就会显示我删除了 scrollView 子视图和 AVPLayer 实例。使用全局
AVPLayer
实例但没有用。它不播放视频 原因 - 当三个单元格在屏幕上时,它不会再次出队,因此不会加载视频,因为全局实例将仅添加到一个中,prepareForReuse 导致没有视频播放
它可能会延迟,因为您添加和删除了 AVPlayer 视图。 您可以重复使用它们,而不是删除它们,这样您就可以在单元格在屏幕上可见时更新 link。 您可以像这样参考任何文章:Best way to check if UITableViewCell is completely visible