Расширение CMSampleBuffer для преобразования в UIImage: слишком дорого по памяти

Я пытаюсь преобразовать CMSampleBuffer для UIImage с Swift 3.0. Популярное решение - написать расширение для CMSampleBuffer Класс и добавить геттер для преобразования буфера в изображение. Вот как это выглядит:

import Foundation
import AVFoundation

extension CMSampleBuffer {
    @available(iOS 9.0, *)
    var uiImage: UIImage? {
    guard let imageBuffer = CMSampleBufferGetImageBuffer(self) else { return nil }

    let ciimage: CIImage = CIImage(cvImageBuffer: imageBuffer)


    let image:UIImage = UIImage(ciImage: ciimage)


    return image
    }

}

Он отлично работает, но занимает много памяти, 40% от общей памяти приложения. Есть ли более эффективное решение для памяти?

РЕДАКТИРОВАТЬ:

Я изменил свой код, и это выглядит так:

var uiImage: UIImage? {
    guard let imageBuffer = CMSampleBufferGetImageBuffer(self) else { return nil }

    CVPixelBufferLockBaseAddress(imageBuffer, CVPixelBufferLockFlags(rawValue: 0))
    let baseAddress = CVPixelBufferGetBaseAddress(imageBuffer)
    let bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer)
    let width = CVPixelBufferGetWidth(imageBuffer)
    let height = CVPixelBufferGetHeight(imageBuffer)
    let colorSpace = CGColorSpaceCreateDeviceRGB()
    let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.noneSkipFirst.rawValue | CGBitmapInfo.byteOrder32Little.rawValue)


    var image: UIImage?
    autoreleasepool(invoking: {() -> () in
        guard let context = CGContext(data: baseAddress,
        width: width,
        height: height,
        bitsPerComponent: 8,
        bytesPerRow: bytesPerRow,
        space: colorSpace,
        bitmapInfo: bitmapInfo.rawValue) else { return }
        guard let cgImage = context.makeImage() else { return }
        image = UIImage(cgImage: cgImage)
    })    
    CVPixelBufferUnlockBaseAddress(imageBuffer,CVPixelBufferLockFlags(rawValue: 0));



    return image
}

Утечка памяти имеет отношение к CGContext. Есть ли еще какой-нибудь способ, которым я могу освободить / освободить / освободить его, кроме использования автозапуска?

0 ответов

Другие вопросы по тегам