【发布时间】:2018-07-22 06:10:31
【问题描述】:
我想创建类似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)
}
代码运行良好。我得到了我想要的结果。
现在的问题是 - 如果视频大小超过 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)
}
【问题讨论】:
-
我认为这里的问题是生成的图像质量非常高,并且占用了大量的内存空间。我建议使用低/缩略图质量的图像进行预览(在上面的屏幕截图中)。
-
除了缩略图帧的大小之外,您还应该在 for 循环中使用 autoreleasepool 闭包
-
顺便说一句,您可以从访问 seconds 属性的持续时间中获得 Double。
video.duration.seconds -
提供
generateFrames方法的定义。还有生成的图片大小是多少? -
@InderKumarRathore 请检查我编辑的问题。我的视频是垂直和水平的。所以不能确定大小。
标签: swift memory-leaks uiimage cgimage avasset