我试图从视频中获取最后一帧。最后一帧,不是最后一帧(因为我有非常快的视频,一秒钟可以有不同的场景)。
我已经编写了这样的测试代码:
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
}
}
但是当我尝试执行它时,我总是收到这样的错误:
Domain = AVFoundationErrorDomain Code = -11832"无法打开" UserInfo = {NSUnderlyingError = 0x170240180 {错误 Domain = NSOSStatusErrorDomain Code = -12431"(null)"}, NSLocalizedFailureReason =此媒体无法使用。, NSLocalizedDescription =无法打开}
如果我删除requestedTimeTolerance
(因此它将默认为无限值)一切正常,但我总是收到比我在视频中更亮的图像(可能是因为没有捕获最新帧?或CGImage→ UIImage转换有一些麻烦吗?)
问题:
为什么拍摄的图像可能会在视频中过亮?例如,如果我写这样的代码:
self.videoLayer.removeFromSuperlayer()
self.backgroundImageView.image = getLastFrame(from: playerItem)
我看到"亮度跳跃" (视频较暗,图像较亮)。
我发现了相关问题:AVAssetImageGenerator fails at copying image,但问题没有解决。