Я пытаюсь получить последний кадр из видео. Последний кадр, а не последняя секунда (потому что у меня очень быстрые видео, в одной секунде могут быть разные сцены).
Я написал такой код для тестирования:
private func getLastFrame(from item: AVPlayerItem) -> UIImage? {
let imageGenerator = AVAssetImageGenerator(asset: item.asset)
imageGenerator.requestedTimeToleranceAfter = kCMTimeZero
imageGenerator.requestedTimeToleranceBefore = kCMTimeZero
let composition = AVVideoComposition(propertiesOf: item.asset)
let time = CMTimeMakeWithSeconds(item.asset.duration.seconds, composition.frameDuration.timescale)
do {
let cgImage = try imageGenerator.copyCGImage(at: time, actualTime: nil)
return UIImage(cgImage: cgImage)
} catch {
print("\(error)")
return nil
}
}
Но я всегда получаю такую ошибку, когда пытаюсь ее выполнить:
Домен=AVFoundationErrorDomain Code=-11832 "Cannot Open" UserInfo={NSUnderlyingError=0x170240180 {Error Domain=NSOSStatusErrorDomain Code=-12431 "(null)"}, NSLocalizedFailureReason=Этот носитель нельзя использовать., NSLocalizedDescription=Не удается открыть}
Если я уберу requestedTimeTolerance
(так что по умолчанию это будет бесконечное значение), все в порядке, но я всегда получаю более яркое изображение, чем в видео (может быть, это потому, что был захвачен не последний кадр? Или у преобразования CGImage → UIImage есть проблемы?)
Вопросы:
- Почему я получаю сообщение об ошибке, когда указан нулевой допуск? Как получить именно последний кадр?
Почему захваченные изображения могут быть слишком яркими, чем в видео? Например, если я пишу такой код:
self.videoLayer.removeFromSuperlayer() self.backgroundImageView.image = getLastFrame(from: playerItem)
Вижу "скачок яркости" (видео было темнее, изображение ярче).
Обновление 1
Я обнаружил связанную проблему: AVAssetImageGenerator не копирует изображение, но этот вопрос не решен.