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)
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 
2 