CADisplayLink заикается при сборке из архива
У меня есть проект, который рендерит воспроизведение видео и применяет к нему CIFilters. Я знаю, что могу использовать композицию видео, чтобы получить видео с фильтрами, но проблема в том, что фильтры должны быть смахиваемыми (с предварительным просмотром следующего фильтра, поэтому мы используем маску для первого просмотра изображения и фильтрацию второго фильтра со следующим фильтром).
func displayLinkDidRefresh(link: CADisplayLink){
let itemTime = videoOutput.itemTime(forHostTime: CACurrentMediaTime())
if videoOutput.hasNewPixelBuffer(forItemTime: itemTime) {
if let pixelBuffer = videoOutput.copyPixelBuffer(forItemTime: itemTime, itemTimeForDisplay: nil){
unfilteredImage = CIImage(cvImageBuffer: pixelBuffer)
displayFilteredImage(unfilteredImage: unfilteredImage)
}
}
}
Этот код используется для создания экземпляра AVPlayer и CADisplayLink:
player = AVPlayer(playerItem: item)
player.isMuted = true
displayLink = CADisplayLink(target: self, selector: #selector(displayLinkDidRefresh(link:)))
displayLink!.preferredFramesPerSecond = 24
displayLink!.add(to: RunLoop.main, forMode: RunLoopMode.commonModes)
NotificationCenter.default.addObserver(self, selector: #selector(self.playerItemDidReachEnd(notification:)), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: self.player.currentItem)
При запуске из отладчика я не испытываю заикания (или он находится на минимальном уровне), но при запуске сборки из архива он сильно заикается. Что я делаю, чтобы протестировать, так это удалить приложение с телефона, а затем установить его на телефоне и протестировать, как и в случае с отладочными сборками, но архив создает проблемы. Любой вклад в это?
РЕДАКТИРОВАТЬ 1:
Удалось заставить его работать лучше, но он все еще заикается после прикрепления композиции видео к элементу плеера, когда статус элемента и игрока готов к воспроизведению.
1 ответ
После некоторого времени игры с этим я обнаружил проблему, с кодом все в порядке. Проблема заключалась в том, что у нас есть аналитика Appsee внутри приложения, и нам нужно было приостановить ее на этих экранах, чтобы они правильно отображались. Причиной, по которой мы не сталкивались с этими проблемами в режиме отладки, было условие AppDelegate if, которое препятствовало работе Appsee в среде отладки.