从Video-AVAsset生成图像时的内存消耗问题

时间:2018-02-12 05:53:28

标签: swift memory-leaks uiimage cgimage avasset

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

enter image description here

为此我使用此代码

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)

        }

代码运行正常。我得到了我想要的相同结果。

现在问题是 - 如果视频大小超过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)

}

1 个答案:

答案 0 :(得分:1)

尝试指定缩略图图像的maximumSize。 e.g。

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)

如果图像尺寸很大,那就是耗费大量内存的图像数组。