Мне нужно воспроизвести видео в моем приложении внутри ячейки tableView. В зависимости от размера экрана в моей таблице может отображаться 2 ячейки в устройстве с небольшим экраном и 3 ячейки в устройстве с большим экраном, например iPhone XSMax или Xr
Поток
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)
}
}
}
Как показано в приведенном выше коде, я перебираю Video Array и добавляю его подпредставление в scrollView
Выпуск -
оно начинает лагать, когда на экране несколько ячеек с видео
или следующая загружаемая ячейка с видео
Я использую prepareForReuse
, чтобы избежать высокого использования памяти.
Время работы приложения составляет до 40 МБ в течение 4 минут, включая и другие функции
Что я могу сделать?
Испытанные вещи
Проверка IndexPathForVisibleCell
включает три ячейки, которые отображаются, как только моя ячейка выходит за пределы экрана. Я удаляю подпредставления scrollView и экземпляр AVPLayer.
Использование Global AVPLayer
Экземпляр, но не сработал. Не воспроизводит видео
Причина - когда на экране отображаются три ячейки, они не удаляются снова, поэтому видео не будет загружено, поскольку глобальный экземпляр будет добавлен только в одну, а prepareForReuse не будет воспроизводить видео