视频生成图像时的内存消耗问题 - AVAsset

Bin*_*ndi 1 memory-leaks uiimage cgimage avasset swift

我想创建Photos类似的视频视图,在页脚中将有一秒的视频帧。

在此输入图像描述

为此我正在使用这段代码

var imgs : [UIImage] = []
let assetImgGenerate : AVAssetImageGenerator = AVAssetImageGenerator(asset: video)
assetImgGenerate.appliesPreferredTrackTransform = true

let duration = Int(CMTimeGetSeconds(video.duration))
    for i in 0 ... duration   {
        if let img = generateFrames(assetImgGenerate : assetImgGenerate , fromTime: Float64(i))
        {
            imgs.append(img)

        }
Run Code Online (Sandbox Code Playgroud)

该代码运行良好。我得到了与我想要的相同的结果。

现在的问题是 -如果视频大小超过 50 秒并且我正在提取 uiimage,那么当内存超出设备的可用空间时,我的应用程序会崩溃。

我的视频时长为 120 到 200 秒。在内存管理方面有什么更好的方法呢?(我无法延迟加载图像,因为我希望将图像预加载到屏幕中。)

编辑

 func generateFrames(assetImgGenerate : AVAssetImageGenerator,   fromTime:Float64) -> UIImage? {

    let time : CMTime = CMTimeMakeWithSeconds(fromTime, 1)
    var img: CGImage?

  img = try? assetImgGenerate.copyCGImage(at:time, actualTime: nil)

}
Run Code Online (Sandbox Code Playgroud)

Ind*_*ore 6

尝试指定maximumSize缩略图的类型。例如

let assetImgGenerate : AVAssetImageGenerator = AVAssetImageGenerator(asset: video)
assetImgGenerate.appliesPreferredTrackTransform = true
// Here specify the size in which you want to fit the image.
assetImgGenerate.maximumSize = CGSize(width: 100, height: 100)
Run Code Online (Sandbox Code Playgroud)

如果图像尺寸很大,则图像数组会消耗大量内存。