从AVAssetImageGenerator生成图像,不同时间得到的是相同的重复图像

6

我正在尝试使用以下代码从视频生成缩略图图像。它确实生成了UIImage,但是图片在不同的时间都是相同的。例如,对于持续3秒的视频,它会生成6张图片,但所有的图片都是视频一开始的同一张图片。有什么想法我错在哪里了吗?

let asset = AVAsset(url: videoURL)
                let imageGenerator = AVAssetImageGenerator(asset: asset)

                let scale = 2
                let step = 1
                let duration = Int(CMTimeGetSeconds(asset.duration) * Double(scale))
                var epoches = [NSValue]()
                for i in stride(from: 1, to: duration, by: step) {
                    //let time = CMTimeMake(Int64(i), Int32(scale)) 
                    let time = CMTimeMakeWithSeconds(Double(i)/Double(scale), Int32(scale))
                    let cgImage = try! imageGenerator.copyCGImage(at: time, actualTime: nil)
                    let uiImage = UIImage(cgImage: cgImage)
                    self?.imagePool.append(uiImage)
                    epoches.append(NSValue(time: time))
                }
1个回答

12

默认情况下,AVAssetImageGenerator 在获取给定时间的帧时具有非常宽松的容差。如果您使用copyCGImageactualTime,您会在实践中看到它大约是一两秒钟,尽管在技术上它是kCMTimeFlags_PositiveInfinity,所以在您的短视频中有一半的帧将是重复的。

因此,将容差设置为较小的值,才能查看唯一的帧:

imageGenerator.requestedTimeToleranceBefore = CMTimeMake(1, 15)
imageGenerator.requestedTimeToleranceAfter = CMTimeMake(1, 15)

对我来说改变分母是无用的,但设置较小的分子,如CMTimeMake(0.01,1),就可以解决问题了。 - Varrry
1
奇怪!你所做的应该等同于 CMTimeMake(1, 100) - Rhythmic Fistman
2
谢谢,我刚刚在我的代码的其他区域里瞎折腾了4个小时,没有意识到这个该死的东西是罪魁祸首。 - csch0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接