从视频中获取最后一帧

时间:2017-04-21 17:15:10

标签: ios swift avplayer avplayeritem

我试图从视频中获取最后一帧。最后一帧,不是最后一帧(因为我有非常快的视频,一秒钟可以有不同的场景)。

我已经编写了这样的测试代码:

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转换有一些麻烦吗?)

问题:

  1. 为什么在指定零容差时收到错误?如何获得最后一帧?
  2. 为什么拍摄的图像可能会在视频中过亮?例如,如果我写这样的代码:

    self.videoLayer.removeFromSuperlayer()
    self.backgroundImageView.image = getLastFrame(from: playerItem)
    
  3. 我看到"亮度跳跃" (视频较暗,图像较亮)。

    更新1

    我发现了相关问题:AVAssetImageGenerator fails at copying image,但问题没有解决。

0 个答案:

没有答案