2015-10-13 125 views
2

我正在尝试使用AVAssetWriterInput创建一个视频,并使用AVAssetWriterInput为其创建一个映像的像素缓冲区。创建映像的像素缓冲区时发生内存泄漏

为此我称之为功能如下,但创建几个视频后,应用程序收到内存警告并崩溃。我使用仪器进行了调试,看起来我有内存泄漏here

我试图把变量pixelBufferPointer和pxData作为类变量,并销毁/ dealloc一旦创建视频,但这似乎没有任何区别。有什么我应该做的,以释放这种记忆?

func createPixelBufferFromCGImage(image: CGImageRef) -> CVPixelBufferRef { 
    let options = [ 
     "kCVPixelBufferCGImageCompatibilityKey": true, 
     "kCVPixelBufferCGBitmapContextCompatibilityKey": true 
    ] 

    var videoWidth = 496 
    var videoHeight = 668 

    let frameSize = CGSizeMake(CGFloat(videoWidth), CGFloat(videoHeight)) 

    var pixelBufferPointer = UnsafeMutablePointer<Unmanaged<CVPixelBuffer>?>.alloc(1) 

    var status:CVReturn = CVPixelBufferCreate(
     kCFAllocatorDefault, 
     Int(frameSize.width), 
     Int(frameSize.height), 
     OSType(kCVPixelFormatType_32ARGB), 
     options, 
     pixelBufferPointer 
    ) 

    var lockStatus:CVReturn = CVPixelBufferLockBaseAddress(pixelBufferPointer.memory?.takeUnretainedValue(), 0) 

    var pxData:UnsafeMutablePointer<(Void)> = CVPixelBufferGetBaseAddress(pixelBufferPointer.memory?.takeUnretainedValue()) 

    let bitmapinfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.NoneSkipFirst.rawValue) 
    let rgbColorSpace:CGColorSpace = CGColorSpaceCreateDeviceRGB() 

    var context:CGContextRef = CGBitmapContextCreate(
     pxData, 
     Int(frameSize.width), 
     Int(frameSize.height), 
     8, 
     //4 * CGImageGetWidth(image), 
     4 * Int(frameSize.width), 
     rgbColorSpace, 
     bitmapinfo 
    ) 

    CGContextDrawImage(context, CGRectMake(0, 0, frameSize.width, frameSize.height), image) 

    CVPixelBufferUnlockBaseAddress(pixelBufferPointer.memory?.takeUnretainedValue(), 0) 

    UIGraphicsEndImageContext() 

    return pixelBufferPointer.memory!.takeUnretainedValue() 
} 

回答

0

Unmanaged<CVPixelBuffer>泄漏。

我宁愿罗素奥斯汀的答案,但我不知道如何通过pixelBufferPointerCVPixelBufferCreate没有语法错误(swift noob)。如果做不到这一点,改变线

return pixelBufferPointer.memory!.takeUnretainedValue() 

return pixelBufferPointer.memory!.takeRetainedValue() 

修复泄漏

0

看看Memory leak on CIContext createCGImage at iOS 9?

我有一个类似的问题,泄漏是由于下面的代码

CGImageRef processedCGImage = [_context createCGImage:ciImage 
                  fromRect:[ciImage extent]]; 

这里更多背景信息:Memory Leak in CMSampleBufferGetImageBuffer

+0

感谢您的快速回复。我不知道是否它是相同的错误,因为我在iOS 8.3上运行此代码,并且我也没有使用createCGImage – carlosb

+0

这是正确的,但我有一些嫌疑人,事实上,那些原语CVPixelBufferGetBaseAddress,CGBitmapContextCreate,CGContextDrawImage是相同的时使用使用CIContext处理createCGImage。我相信他们是相关的。 – loretoparisi

0

您不必使用UnsafeMutablePointer类型。你可能试图从一些Objective-C例子转换而来。我在做同样的事情,但最终发现没有做到这一点。尝试

var pixelBufferPointer: CVPixelBuffer? 
... 
var status:CVReturn = CVPixelBufferCreate(
    kCFAllocatorDefault, 
    Int(frameSize.width), 
    Int(frameSize.height), 
    OSType(kCVPixelFormatType_32ARGB), 
    options, 
    &pixelBufferPointer 
) 

var pxData = CVPixelBufferGetBaseAddress(pixelBufferPointer) 

然后,你不必做takeUnRetainedValue等

您也可以尝试使用AVAssetWriterInputPixelBufferAdaptor和像素缓冲池。这应该是更有效的。 See this example

0

当使用CVPixelBufferCreateUnsafeMutablePointer将必须为检索它的memory后销毁

当我创建一个CVPixelBuffer,我不喜欢这样写道:

func allocPixelBuffer() -> CVPixelBuffer { 
    let pixelBufferAttributes : CFDictionary = [...] 
    let pixelBufferOut = UnsafeMutablePointer<CVPixelBuffer?>.alloc(1) 
    _ = CVPixelBufferCreate(kCFAllocatorDefault, 
          Int(Width), 
          Int(Height), 
          OSType(kCVPixelFormatType_32ARGB), 
          pixelBufferAttributes, 
          pixelBufferOut) 

    let pixelBuffer = pixelBufferOut.memory! 
    pixelBufferOut.destroy() 
    return pixelBuffer 
}