【问题标题】:Generate images from AVAssetImageGenerator gives same image duplicates for different times从 AVAssetImageGenerator 生成图像在不同时间提供相同的图像重复
【发布时间】:2018-10-23 22:53:08
【问题描述】:

我正在尝试使用以下代码从视频中生成缩略图。它确实生成 UIImages 但图像在不同时间都是相同的。例如,对于持续 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))
                }

【问题讨论】:

    标签: ios avfoundation


    【解决方案1】:

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

    所以将容差设置为更小的值以查看独特的帧:

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

    【讨论】:

    • 对我来说,改变分母是没有用的,但是像 CMTimeMake(0.01, 1) 这样设置更小的分子就可以了。
    • 奇怪!你所做的应该等同于CMTimeMake(1, 100)!
    • 谢谢,我刚刚浪费了 4 个小时在代码的其他区域寻找,没有意识到这个该死的东西是罪魁祸首。
    猜你喜欢
    • 2013-02-27
    • 2017-01-24
    • 2019-03-29
    • 1970-01-01
    • 2017-02-17
    • 2018-09-22
    • 2014-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多