У меня есть массив UIImage из 10 кадров. Я хочу экспортировать это как фильм продолжительностью 15 секунд. поэтому ему пришлось бы зацикливать эти 10 кадров в течение 15 секунд. между каждым кадром мне нужен интервал 0,2 секунды.
Мне удалось создать фильм из моего массива, но я не понимаю, как работает CMTime. Я пытался возиться с числами, но я не могу получить результат, который хочу. либо мой фильм слишком короткий, он воспроизводится слишком быстро и т. д.
Я прочитал это: Попытка понять CMTime и CMTimeMake но для меня это все равно не имеет смысла...
Мне нужно понять, как эти 3 переменные CMTime связаны друг с другом
CMTime frameTime = CMTimeMake(1, 5);
CMTime lastTime = CMTimeMake(i, 5);
CMTime presentTime = CMTimeAdd(lastTime, frameTime);
это код, который я использую
- (void)writeImageAsMovie:(NSArray *)array toPath:(NSURL*)path size:(CGSize)size {
NSError *error = nil;
self.videoWriter = [[AVAssetWriter alloc] initWithURL:path
fileType:AVFileTypeMPEG4
error:&error];
NSParameterAssert(self.videoWriter);
NSDictionary *videoSettings = [NSDictionary dictionaryWithObjectsAndKeys:
AVVideoCodecH264, AVVideoCodecKey,
[NSNumber numberWithInt:size.width], AVVideoWidthKey,
[NSNumber numberWithInt:size.height], AVVideoHeightKey,
nil];
AVAssetWriterInput* writerInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo
outputSettings:videoSettings];
NSMutableDictionary *attributes = [[NSMutableDictionary alloc] init];
[attributes setObject:[NSNumber numberWithUnsignedInt:kCVPixelFormatType_32ARGB] forKey:(NSString*)kCVPixelBufferPixelFormatTypeKey];
[attributes setObject:[NSNumber numberWithUnsignedInt:size.width] forKey:(NSString*)kCVPixelBufferWidthKey];
[attributes setObject:[NSNumber numberWithUnsignedInt:size.height] forKey:(NSString*)kCVPixelBufferHeightKey];
AVAssetWriterInputPixelBufferAdaptor *adaptor = [AVAssetWriterInputPixelBufferAdaptor assetWriterInputPixelBufferAdaptorWithAssetWriterInput:writerInput sourcePixelBufferAttributes:attributes];
NSParameterAssert(writerInput);
NSParameterAssert([self.videoWriter canAddInput:writerInput]);
[self.videoWriter addInput:writerInput];
writerInput.expectsMediaDataInRealTime = YES;
//Start a session:
[self.videoWriter startWriting];
[self.videoWriter startSessionAtSourceTime:kCMTimeZero];
CVPixelBufferRef buffer = NULL;
buffer = ([self pixelBufferFromCGImage:[[array objectAtIndex:0] CGImage] size:CGSizeMake(size.width, size.height)]);
CVPixelBufferPoolCreatePixelBuffer (NULL, adaptor.pixelBufferPool, &buffer);
[adaptor appendPixelBuffer:buffer withPresentationTime:kCMTimeZero];
int i = 1;
while (writerInput.readyForMoreMediaData)
{
CMTime frameTime = CMTimeMake(1, 15);
CMTime lastTime= CMTimeMake(i, 15);
CMTime presentTime= CMTimeAdd(lastTime, frameTime);
if (i >= [array count]) {
buffer = NULL;
}
else {
buffer = [self pixelBufferFromCGImage:[[array objectAtIndex:i] CGImage] size:size];
}
if (buffer) {
[adaptor appendPixelBuffer:buffer withPresentationTime:presentTime];
i++;
} else {
[writerInput markAsFinished];
[self.videoWriter finishWritingWithCompletionHandler:^{
NSLog (@"Done");
}];
CVPixelBufferPoolRelease(adaptor.pixelBufferPool);
break;
}
}
}