Принудительно перерисовывать AVPlayerLayer, когда он приостановлен на iOS 13

Я применяю эффекты реального времени с помощью CoreImage к видео, которое воспроизводится с помощью AVPlayer. Проблема в том, что когда проигрыватель стоит на паузе, фильтры не применяются, если вы настраиваете параметры фильтра с помощью ползунка.

  let videoComposition = AVMutableVideoComposition(asset: asset, applyingCIFiltersWithHandler: {[weak self] request in

        // Clamp to avoid blurring transparent pixels at the image edges
        let source = request.sourceImage.clampedToExtent()
        let output:CIImage

        if let filteredOutput = self?.runFilters(source, filters: array)?.cropped(to: request.sourceImage.extent) {
             output = filteredOutput
         } else {
             output = source
         }


        // Provide the filter output to the composition
        request.finish(with: output, context: nil)
    })

В качестве обходного пути я использовал этот ответ, который работал до iOS 12.4, но больше не работает в iOS 13 beta 6. Поиск решений, которые работают на iOS 13.


person Deepak Sharma    schedule 12.08.2019    source источник
comment
Вы пробовали player.seek(to: player.currentTime())?   -  person Frank Schlegel    schedule 12.08.2019
comment
да. Тоже не работает.   -  person Deepak Sharma    schedule 12.08.2019
comment
Хм, сложно… Вы пробовали сбросить и снова установить playerItem?   -  person Frank Schlegel    schedule 12.08.2019


Ответы (1)


После того, как я сообщил об этом как об ошибке в Apple и получил несколько полезных отзывов, у меня есть исправление:

player.currentItem?.videoComposition = player.currentItem?.videoComposition?.mutableCopy() as? AVVideoComposition

Объяснение, которое я получил, было:

AVPlayer перерисовывает кадр, когда свойство videoComposition объекта AVPlayerItem получает новый экземпляр или, даже если это тот же самый экземпляр, свойство экземпляра было изменено.

Как результат; форсировать перерисовку можно путем создания «нового» экземпляра, просто скопировав существующий экземпляр.

person alexkent    schedule 20.08.2019