tôi đã tạo thành công video từ hình ảnh bằng cách sử dụng đoạn mã sauLàm thế nào để sử dụng CVPixelBufferPool kết hợp với AVAssetWriterInputPixelBufferAdaptor trong iPhone?
-(void)writeImageAsMovie:(NSArray *)array toPath:(NSString*)path size:(CGSize)size duration:(int)duration
{
NSError *error = nil;
AVAssetWriter *videoWriter = [[AVAssetWriter alloc] initWithURL:
[NSURL fileURLWithPath:path] fileType:AVFileTypeQuickTimeMovie
error:&error];
NSParameterAssert(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] retain];
AVAssetWriterInputPixelBufferAdaptor *adaptor = [AVAssetWriterInputPixelBufferAdaptor
assetWriterInputPixelBufferAdaptorWithAssetWriterInput:writerInput
sourcePixelBufferAttributes:nil];
NSParameterAssert(writerInput);
NSParameterAssert([videoWriter canAddInput:writerInput]);
[videoWriter addInput:writerInput];
//Start a session:
[videoWriter startWriting];
[videoWriter startSessionAtSourceTime:kCMTimeZero];
CVPixelBufferRef buffer = NULL;
buffer = [self pixelBufferFromCGImage:[[array objectAtIndex:0] CGImage]];
[adaptor appendPixelBuffer:buffer withPresentationTime:kCMTimeZero];
//Write samples:
for (int i = 0;i<[array count]; i++)
{
if([writerInput isReadyForMoreMediaData])
{
NSLog(@"inside for loop %d",i);
CMTime frameTime = CMTimeMake(1, 20);
CMTime lastTime=CMTimeMake(i, 20); //i is from 0 to 24 of the loop above
CMTime presentTime=CMTimeAdd(lastTime, frameTime);
buffer = [self pixelBufferFromCGImage:[[array objectAtIndex:i] CGImage]];
[adaptor appendPixelBuffer:buffer withPresentationTime:presentTime];
}
else
{
NSLog(@"error");
i--;
}
}
NSLog(@"outside for loop");
//Finish the session:
[writerInput markAsFinished];
[videoWriter finishWriting];
}
Ở đây tôi đã sử dụng CVPixelBufferRef
. Thay vào đó, tôi muốn sử dụng CVPixelBufferPoolRef
kết hợp với AVAssetWriterInputPixelBufferAdaptor
.
Ai cũng có thể cung cấp ví dụ mà tôi có thể gỡ lỗi và sử dụng?
Thanx bạn đã trả lời nhưng tôi đã giải quyết vấn đề này theo cách tương tự mà bạn đã nói ... –
Hiệu suất có đáng chú ý (hoặc đo được) tốt hơn khi sử dụng vùng đệm và bộ điều hợp không? – kevlar
@kevlar nói từ kinh nghiệm cá nhân, sử dụng hồ bơi là sự khác biệt về đêm và ngày. Nghĩa là 1 LOC cố định rò rỉ bộ nhớ: D – jakenberg