我正在尝试使用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()
}
感谢您的快速回复。我不知道是否它是相同的错误,因为我在iOS 8.3上运行此代码,并且我也没有使用createCGImage – carlosb
这是正确的,但我有一些嫌疑人,事实上,那些原语CVPixelBufferGetBaseAddress,CGBitmapContextCreate,CGContextDrawImage是相同的时使用使用CIContext处理createCGImage。我相信他们是相关的。 – loretoparisi