I cannot answer your question exactly, unfortunately, but I am working on code that does almost the same thing. And, it seems to me, I have more than the error you received; it gets to the point where it tries to add images to the movie, and then just fails, never getting a successful result from appendPixelBuffer () - and I'm not sure how to understand why. I post this in the hope that it will help you in the future.
(My code is adapted from AVFoundation + AssetWriter: generate a movie with images and audio , and I used your post to help switch to the cellular type interhen shenanigans ...)
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)
Where pixelBufferFromCGImage is defined like this:
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() }