I want to release CVPixelBufferRef in fast

I want to create a video from an image. So, I was the source of the link to the link.
Ref: CVPixelBufferPool Error (kCVReturnInvalidArgument / -6661)

func writeAnimationToMovie(path: String, size: CGSize, animation: Animation) -> Bool { var error: NSError? let writer = AVAssetWriter(URL: NSURL(fileURLWithPath: path), fileType: AVFileTypeQuickTimeMovie, error: &error) let videoSettings = [AVVideoCodecKey: AVVideoCodecH264, AVVideoWidthKey: size.width, AVVideoHeightKey: size.height] let input = AVAssetWriterInput(mediaType: AVMediaTypeVideo, outputSettings: videoSettings) let pixelBufferAdaptor = AVAssetWriterInputPixelBufferAdaptor(assetWriterInput: input, sourcePixelBufferAttributes: nil) input.expectsMediaDataInRealTime = true writer.addInput(input) writer.startWriting() writer.startSessionAtSourceTime(kCMTimeZero) var buffer: CVPixelBufferRef var frameCount = 0 for frame in animation.frames { let rect = CGRectMake(0, 0, size.width, size.height) let rectPtr = UnsafeMutablePointer<CGRect>.alloc(1) rectPtr.memory = rect buffer = pixelBufferFromCGImage(frame.image.CGImageForProposedRect(rectPtr, context: nil, hints: nil).takeUnretainedValue(), size) var appendOk = false var j = 0 while (!appendOk && j < 30) { if pixelBufferAdaptor.assetWriterInput.readyForMoreMediaData { let frameTime = CMTimeMake(Int64(frameCount), 10) appendOk = pixelBufferAdaptor.appendPixelBuffer(buffer, withPresentationTime: frameTime) // appendOk will always be false NSThread.sleepForTimeInterval(0.05) } else { NSThread.sleepForTimeInterval(0.1) } j++ } if (!appendOk) { println("Doh, frame \(frame) at offset \(frameCount) failed to append") } } input.markAsFinished() writer.finishWritingWithCompletionHandler({ if writer.status == AVAssetWriterStatus.Failed { println("oh noes, an error: \(writer.error.description)") } else { println("hrmmm, there should be a movie?") } }) return true; } 


 func pixelBufferFromCGImage(image: CGImageRef, size: CGSize) -> CVPixelBufferRef { let options = [ kCVPixelBufferCGImageCompatibilityKey: true, kCVPixelBufferCGBitmapContextCompatibilityKey: true] var pixBufferPointer = UnsafeMutablePointer<Unmanaged<CVPixelBuffer>?>.alloc(1) let status = CVPixelBufferCreate( nil, UInt(size.width), UInt(size.height), OSType(kCVPixelFormatType_32ARGB), options, pixBufferPointer) CVPixelBufferLockBaseAddress(pixBufferPointer.memory?.takeUnretainedValue(), 0) let rgbColorSpace = CGColorSpaceCreateDeviceRGB() let bitmapinfo = CGBitmapInfo.fromRaw(CGImageAlphaInfo.NoneSkipFirst.toRaw()) var pixBufferData:UnsafeMutablePointer<(Void)> = CVPixelBufferGetBaseAddress(pixBufferPointer.memory?.takeUnretainedValue()) let context = CGBitmapContextCreate( pixBufferData, UInt(size.width), UInt(size.height), 8, UInt(4 * size.width), rgbColorSpace, bitmapinfo!) CGContextConcatCTM(context, CGAffineTransformMakeRotation(0)) CGContextDrawImage( context, CGRectMake(0, 0, CGFloat(CGImageGetWidth(image)), CGFloat(CGImageGetHeight(image))), image) CVPixelBufferUnlockBaseAddress(pixBufferPointer.memory?.takeUnretainedValue(), 0) return pixBufferPointer.memory!.takeUnretainedValue() 

}

Something, even after the films may be like under the image, remains in memory. I believe or not what PixcelBuffer left.

I had a CVPixelBufferRelease (buffer) method to free PixcelBuffer when Objective-c, I can no longer use this in Swift. How to free PixcelBuffer?

If anyone could help, I would really appreciate it.

1 enter image description here

2 enter image description here

+6
source share
3 answers

When using CVPixelBufferCreate UnsafeMutablePointer must be destroyed after memory extracted from it.

When I create a CVPixelBuffer , I do it like this:

 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 } 
+2
source

I had the same problem, but I solved it.

Use this: autoreleasepool

  var boolWhile = true while (boolWhile) { autoreleasepool({() -> () in if(input.readyForMoreMediaData) { presentTime = CMTimeMake(Int64(ii), fps) if(ii >= arrayImages.count){ ... 
+2
source

Try to change

  return pixBufferPointer.memory!.takeUnretainedValue() 

to

 return pixBufferPointer.memory!.takeRetainedValue() 

to avoid CVPixelBuffer s leakage

0
source

Source: https://habr.com/ru/post/983791/


All Articles