iPhone的图像video问题在video速度

我已经完成了图像到iPhonevideo转换(当然,我从堆栈溢出问题得到的代码)。 但问题是录制video的速度非常快,即使我有2250帧左右,它在2秒内跑掉了。 我知道问题是与帧率。 但是我不知道如何使它正确。 我的代码在下面

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectoryPath = [paths objectAtIndex:0]; NSString *myFilePath = [documentsDirectoryPath stringByAppendingPathComponent:@"test.mov"]; if ([self openVideoFile:myFilePath withSize:CGSizeMake (480.0, 320.0)]) { for (int i=1; i<2226; i++) { NSString *imagename=[NSString stringWithFormat:@"1 (%i).jpg",i]; UIImage *image=[ UIImage imageNamed:imagename]; [self writeImageToMovie:[image CGImage]]; } [videoWriter finishWriting]; } else { NSLog(@"friled to open video file"); } 

这个代码是在调用函数和下面给出的函数的defenitions

 - (BOOL) openVideoFile: (NSString *) path withSize:(CGSize)imageSize { CGSize size = CGSizeMake (480.0, 320.0);//imageSize; NSError *error = nil; videoWriter = [[AVAssetWriter alloc] initWithURL: [NSURL fileURLWithPath:path] fileType:AVFileTypeQuickTimeMovie error:&error]; if (error != nil){ NSLog(@"error>>>> %@",error); return NO; } NSDictionary *videoCleanApertureSettings = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithDouble:size.width], AVVideoCleanApertureWidthKey, [NSNumber numberWithDouble:size.height], AVVideoCleanApertureHeightKey, [NSNumber numberWithInt:10], AVVideoCleanApertureHorizontalOffsetKey, [NSNumber numberWithInt:10], AVVideoCleanApertureVerticalOffsetKey, nil]; NSDictionary *videoAspectRatioSettings = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt:1], AVVideoPixelAspectRatioHorizontalSpacingKey, [NSNumber numberWithInt:1],AVVideoPixelAspectRatioVerticalSpacingKey, nil]; NSDictionary *codecSettings = [NSDictionary dictionaryWithObjectsAndKeys: videoCleanApertureSettings, AVVideoCleanApertureKey, videoAspectRatioSettings, AVVideoPixelAspectRatioKey, nil]; NSDictionary *videoSettings = [NSDictionary dictionaryWithObjectsAndKeys: AVVideoCodecH264, AVVideoCodecKey, codecSettings,AVVideoCompressionPropertiesKey, [NSNumber numberWithDouble:size.width], AVVideoWidthKey, [NSNumber numberWithDouble:size.height], AVVideoHeightKey, nil]; writerInput = [[AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo outputSettings:videoSettings] retain]; NSMutableDictionary * bufferAttributes = [[NSMutableDictionary alloc] init]; [bufferAttributes setObject: [NSNumber numberWithInt: kCVPixelFormatType_32ARGB] forKey: (NSString *) kCVPixelBufferPixelFormatTypeKey]; [bufferAttributes setObject: [NSNumber numberWithInt: 480] forKey: (NSString *) kCVPixelBufferWidthKey]; [bufferAttributes setObject: [NSNumber numberWithInt: 320] forKey: (NSString *) kCVPixelBufferHeightKey]; adaptor = [[AVAssetWriterInputPixelBufferAdaptor assetWriterInputPixelBufferAdaptorWithAssetWriterInput:writerInput sourcePixelBufferAttributes:nil] retain]; NSMutableDictionary* attributes; attributes = [NSMutableDictionary dictionary]; int width = 480; int height = 320; [attributes setObject:[NSNumber numberWithInt:kCVPixelFormatType_32ARGB] forKey:(NSString*)kCVPixelBufferPixelFormatTypeKey]; [attributes setObject:[NSNumber numberWithInt:width] forKey: (NSString*)kCVPixelBufferWidthKey]; [attributes setObject:[NSNumber numberWithInt:height] forKey: (NSString*)kCVPixelBufferHeightKey]; CVReturn theError = CVPixelBufferPoolCreate(kCFAllocatorDefault, NULL, (CFDictionaryRef) attributes, &pixelBufferPool); NSParameterAssert(writerInput); NSParameterAssert([videoWriter canAddInput:writerInput]); [videoWriter addInput:writerInput]; writerInput.expectsMediaDataInRealTime = YES; [videoWriter startWriting]; [videoWriter startSessionAtSourceTime:kCMTimeZero]; buffer = NULL; lastTime = kCMTimeZero; presentTime = kCMTimeZero; return YES; } - (void) writeImageToMovie:(CGImageRef)image { if([writerInput isReadyForMoreMediaData]) { buffer = [self pixelBufferFromCGImage:image]; BOOL success = [adaptor appendPixelBuffer:buffer withPresentationTime:presentTime]; if (!success) NSLog(@"Failed to appendPixelBuffer"); CVPixelBufferRelease(buffer); presentTime = CMTimeAdd(lastTime, CMTimeMake(1, 1000));//I think problem is here but what will be given for correct output lastTime = presentTime; } else { NSLog(@"error - writerInput not ready"); } } - (CVPixelBufferRef)pixelBufferFromCGImage:(CGImageRef)image { CGSize size = CGSizeMake (480.0, 320.0); CVPixelBufferRef pxbuffer; NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:YES], kCVPixelBufferCGImageCompatibilityKey, [NSNumber numberWithBool:YES], kCVPixelBufferCGBitmapContextCompatibilityKey, nil]; if (pixelBufferPool == NULL) NSLog(@"pixelBufferPool is null!"); CVReturn status = CVPixelBufferPoolCreatePixelBuffer (NULL, pixelBufferPool, &pxbuffer); CVPixelBufferLockBaseAddress(pxbuffer, 0); void *pxdata = CVPixelBufferGetBaseAddress(pxbuffer); CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB(); CGContextRef context = CGBitmapContextCreate(pxdata, size.width, size.height, 8, 4*size.width, rgbColorSpace, kCGImageAlphaNoneSkipFirst); CGContextConcatCTM(context, CGAffineTransformMakeRotation(0)); CGContextDrawImage(context, CGRectMake(90, 10, CGImageGetWidth(image), CGImageGetHeight(image)), image); CGColorSpaceRelease(rgbColorSpace); CGContextRelease(context); CVPixelBufferUnlockBaseAddress(pxbuffer, 0); return pxbuffer; } 

如何处理CMTimevariables,我怎样才能正确的做一个更多的帮助如何添加audio与这个video。

你的PTS非常接近。 CMTimeMake(1, 1000) ,为什么不是30FPS: CMTimeMake(1, 30))

我修改了你的代码,并提出了解决scheme,在我的情况下,我在0.1秒内logging在我的视图中的每个图像,所以我的fps是0.1fps。

 presentTime = CMTimeAdd(lastTime, CMTimeMake(1, 10)); 

之所以你的video太快,是因为你的比例是1秒到1000的图像。 你可以使它每秒1张图片。

 presentTime = CMTimeAdd(lastTime, CMTimeMake(1, 1)); 

试试这个,希望它能帮助你。

添加这个库AVFoundation CoreMedia CoreVideo

我能够生成video,但无法获得audio是任何人都使用此代码,并创buildaudiovideo