AVAssetWriterInputPixelBufferAdaptor on IOS attempting to write images to a video
AVAssetWriterInputPixelBufferAdaptor on IOS attempting to write images to a video
- Subject: AVAssetWriterInputPixelBufferAdaptor on IOS attempting to write images to a video
- From: Damien Cooke <email@hidden>
- Date: Fri, 13 Apr 2012 08:49:13 +0930
HI All,
I am attempting to write out an image as a movie well, it will be an array of images but to start with I can't even get one in there. Any help diagnosing my problem would be greatly appreciated.
Here is what I am doing:
//here is the image
NSString *path = [NSString stringWithFormat:@"%@/images/0.png",[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]];
NSData *imageData = [[[NSData alloc] initWithContentsOfFile:path] autorelease];
UIImage *uiimage = [UIImage imageWithData:imageData];
//configure the path for the output video
NSString *videoPath = [NSString stringWithFormat:@"%@/videos/currentVideo.mov",[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]];
NSError *error = nil;
//create the writer
AVAssetWriter *videoWriter = [[AVAssetWriter alloc] initWithURL:[NSURL fileURLWithPath:videoPath] fileType:AVFileTypeQuickTimeMovie error:&error];
NSParameterAssert(videoWriter);
//setup the properties for the input
NSDictionary *videoSettings = [NSDictionary dictionaryWithObjectsAndKeys:AVVideoCodecH264, AVVideoCodecKey,[NSNumber numberWithInt:640], AVVideoWidthKey,[NSNumber numberWithInt:960], AVVideoHeightKey,nil];
//create the input
AVAssetWriterInput* writerInput = [[AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo outputSettings:videoSettings] retain];
NSParameterAssert(writerInput);
NSParameterAssert([videoWriter canAddInput:writerInput]);
[videoWriter addInput:writerInput];
//configure the properties for the buffer and create the bufferAdaptor
NSDictionary *bufferAttributes = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithInt:kCVPixelFormatType_32BGRA], kCVPixelBufferPixelFormatTypeKey, nil];
AVAssetWriterInputPixelBufferAdaptor *adaptor = [AVAssetWriterInputPixelBufferAdaptor
assetWriterInputPixelBufferAdaptorWithAssetWriterInput:writerInput
sourcePixelBufferAttributes:bufferAttributes];
//create the pixel buffer
CVPixelBufferRef pixelBuffer = NULL;
CGImageRef cgImage = CGImageCreateCopy([uiimage CGImage]);
CFDataRef image = CGDataProviderCopyData(CGImageGetDataProvider(cgImage));
int status = CVPixelBufferCreateWithBytes(NULL,
960,
640,
kCVPixelFormatType_32BGRA,
(void*)CFDataGetBytePtr(image),
CGImageGetBytesPerRow(cgImage),
NULL,
0,
NULL,
&pixelBuffer);
//write it out
[adaptor appendPixelBuffer:pixelBuffer withPresentationTime:CMTimeMake(2, 60)];
It crashes here reporting
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '*** -[AVAssetWriterInputPixelBufferAdaptor appendPixelBuffer:withPresentationTime:] Cannot call method when status is 0'
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden