如何在使用图像创buildvideo的同时在图像更改上添加animation

我有一个图像arrays,我想通过连续播放这些图像来创buildvideo。我想在图像变化时添加不同types的animation。 build议我使用Cocoa框架在Objective-C中实现此function的一些方法或任何解决scheme。

这里是制作图像video的工作代码,但请build议我们如何在制作video的同时制作animation图像:

-(void)createVideoFromImages:(NSString *) path withSize:(CGSize) size { NSError *error = nil; AVAssetWriter *videoWriter = [[AVAssetWriter alloc] initWithURL: [NSURL fileURLWithPath:path] fileType:AVFileTypeMPEG4 error:&error]; NSParameterAssert(videoWriter); NSDictionary *videoSettings = [NSDictionary dictionaryWithObjectsAndKeys: AVVideoCodecH264, AVVideoCodecKey, [NSNumber numberWithInt:size.width], AVVideoWidthKey, [NSNumber numberWithInt:size.height], AVVideoHeightKey, nil]; AVAssetWriterInput* videoWriterInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo outputSettings:videoSettings]; AVAssetWriterInputPixelBufferAdaptor *adaptor = [AVAssetWriterInputPixelBufferAdaptor assetWriterInputPixelBufferAdaptorWithAssetWriterInput:videoWriterInput sourcePixelBufferAttributes:nil]; NSParameterAssert(videoWriterInput); NSParameterAssert([videoWriter canAddInput:videoWriterInput]); videoWriterInput.expectsMediaDataInRealTime = YES; [videoWriter addInput:videoWriterInput]; //Start a session: [videoWriter startWriting]; [videoWriter startSessionAtSourceTime:kCMTimeZero]; //Video encoding CVPixelBufferRef buffer = NULL; //convert uiimage to CGImage. int frameCount = 0; for(int i = 0; i<[arrPicture count]; i++) { buffer = [self bufferImageFromCGImage:[[arrPicture objectAtIndex:i] CGImage] size:size]; __block BOOL append_ok = NO; int j = 0; while (!append_ok && j < 30) { if (adaptor.assetWriterInput.readyForMoreMediaData) { printf("appending %d attemp %d\n", frameCount, j); CMTime frameTime = CMTimeMake(frameCount,(int32_t)1); append_ok = [adaptor appendPixelBuffer:buffer withPresentationTime:frameTime]; // CVPixelBufferPoolRef bufferPool = adaptor.pixelBufferPool; // NSParameterAssert(bufferPool != NULL); [NSThread sleepForTimeInterval:0.05]; } else { printf("adaptor not ready %d, %d\n", frameCount, j); [NSThread sleepForTimeInterval:0.1]; } j++; } if (!append_ok) { printf("error appending image %d times %d\n", frameCount, j); } frameCount++; CVBufferRelease(buffer); } [videoWriterInput markAsFinished]; [videoWriter finishWritingWithCompletionHandler:^{ NSLog(@"Finished writing...checking completion status..."); if (videoWriter.status != AVAssetWriterStatusFailed && videoWriter.status == AVAssetWriterStatusCompleted) { NSLog(@"Video writing succeeded."); // Move video to camera roll // NOTE: You cannot write directly to the camera roll. // You must first write to an iOS directory then move it! NSURL *videoTempURL = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@", path]]; } else { NSLog(@"Video writing failed: %@", videoWriter.error); } }]; } -(CVPixelBufferRef) bufferImageFromCGImage:(CGImageRef)image size:(CGSize)size { NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:YES], kCVPixelBufferCGImageCompatibilityKey, [NSNumber numberWithBool:YES], kCVPixelBufferCGBitmapContextCompatibilityKey, nil]; CVPixelBufferRef pxbuffer = NULL; CVReturn status = CVPixelBufferCreate(kCFAllocatorDefault, size.width, size.height, kCVPixelFormatType_32ARGB, (__bridge CFDictionaryRef) options, &pxbuffer); status=status;//Added to make the stupid compiler not show a stupid warning. NSParameterAssert(status == kCVReturnSuccess && pxbuffer != NULL); CVPixelBufferLockBaseAddress(pxbuffer, 0); void *pxdata = CVPixelBufferGetBaseAddress(pxbuffer); NSParameterAssert(pxdata != NULL); CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB(); CGContextRef context = CGBitmapContextCreate(pxdata, size.width, size.height, 8, 4*size.width, rgbColorSpace, kCGImageAlphaNoneSkipFirst); NSParameterAssert(context); //CGContextTranslateCTM(context, 0, CGImageGetHeight(image)); //CGContextScaleCTM(context, 1.0, -1.0);//Flip vertically to account for different origin long width,height; if (CGImageGetWidth(image) > self.view.frame.size.width) { width = self.view.frame.size.width; }else{ width = self.view.frame.size.width; // CGImageGetWidth(image); } if (CGImageGetHeight(image) > self.view.frame.size.height) { height = self.view.frame.size.height; }else{ height = self.view.frame.size.height -64 ;// CGImageGetHeight(image); } CGContextDrawImage(context, CGRectMake(0, 0, width, height), image); CGColorSpaceRelease(rgbColorSpace); CGContextRelease(context); CVPixelBufferUnlockBaseAddress(pxbuffer, 0); return pxbuffer; } 

通过使用您的代码,在处理video时不可能对图像进行animation处理

但有一个想法,使animation图像的video

您可以在播放animation时录制屏幕,使用此代码logging屏幕
https://github.com/alskipp/ASScreenRecorder