iOS
이미지로 비디오 만들기
수색…
소개
AVFoundation을 사용하여 이미지에서 비디오 만들기
UIImages에서 비디오 만들기
먼저 AVAssetWriter
를 만들어야 AVAssetWriter
NSError *error = nil;
NSURL *outputURL = <#NSURL object representing the URL where you want to save the video#>;
AVAssetWriter *assetWriter = [AVAssetWriter assetWriterWithURL:outputURL fileType:AVFileTypeQuickTimeMovie error:&error];
if (!assetWriter) {
// handle error
}
AVAssetWriter
에는 적어도 하나의 AVAssetWriter
입력이 필요합니다.
NSDictionary *writerInputParams = [NSDictionary dictionaryWithObjectsAndKeys:
AVVideoCodecH264, AVVideoCodecKey,
[NSNumber numberWithInt:renderSize.width], AVVideoWidthKey,
[NSNumber numberWithInt:renderSize.height], AVVideoHeightKey,
AVVideoScalingModeResizeAspectFill, AVVideoScalingModeKey,
nil];
AVAssetWriterInput *assetWriterInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo outputSettings:writerInputParams];
if ([assetWriter canAddInput:assetWriterInput]) {
[assetWriter addInput:assetWriterInput];
} else {
// show error message
}
추가하려면 CVPixelBufferRef
에의를 AVAssetWriterInput
우리는 만들 필요가 AVAssetWriterInputPixelBufferAdaptor
NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithUnsignedInt:kCVPixelFormatType_32ARGB], (NSString*)kCVPixelBufferPixelFormatTypeKey,
[NSNumber numberWithBool:YES], (NSString *)kCVPixelBufferCGImageCompatibilityKey,
[NSNumber numberWithBool:YES], (NSString *)kCVPixelBufferCGBitmapContextCompatibilityKey,
nil];
AVAssetWriterInputPixelBufferAdaptor *writerAdaptor = [AVAssetWriterInputPixelBufferAdaptor assetWriterInputPixelBufferAdaptorWithAssetWriterInput:assetWriterInput sourcePixelBufferAttributes:attributes];
이제 글쓰기를 시작할 수 있습니다.
[assetWriter startWriting];
[assetWriter startSessionAtSourceTime:kCMTimeZero];
[assetWriterInput requestMediaDataWhenReadyOnQueue:exportingQueue usingBlock:^{
for (int i = 0; i < images.count; ++i) {
while (![assetWriterInput isReadyForMoreMediaData]) {
[NSThread sleepForTimeInterval:0.01];
// can check for attempts not to create an infinite loop
}
UIImage *uIImage = images[i];
CVPixelBufferRef buffer = NULL;
CVReturn err = PixelBufferCreateFromImage(uIImage.CGImage, &buffer);
if (err) {
// handle error
}
// frame duration is duration of single image in seconds
CMTime presentationTime = CMTimeMakeWithSeconds(i * frameDuration, 1000000);
[writerAdaptor appendPixelBuffer:buffer withPresentationTime:presentationTime];
CVPixelBufferRelease(buffer);
}
[assetWriterInput markAsFinished];
[assetWriter finishWritingWithCompletionHandler:^{
if (assetWriter.error) {
// show error message
} else {
// outputURL
}
}];
}];
다음은 CGImageRef
에서 CVPixelBufferRef
를 가져 CVPixelBufferRef
함수입니다.
CVReturn PixelBufferCreateFromImage(CGImageRef imageRef, CVPixelBufferRef *outBuffer) {
CIContext *context = [CIContext context];
CIImage *ciImage = [CIImage imageWithCGImage:imageRef];
NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], (NSString *)kCVPixelBufferCGBitmapContextCompatibilityKey,
[NSNumber numberWithBool:YES], (NSString *)kCVPixelBufferCGImageCompatibilityKey
,nil];
CVReturn err = CVPixelBufferCreate(kCFAllocatorDefault, CGImageGetWidth(imageRef), CGImageGetHeight(imageRef), kCVPixelFormatType_32ARGB, (__bridge CFDictionaryRef _Nullable)(attributes), outBuffer);
if (err) {
return err;
}
if (outBuffer) {
[context render:ciImage toCVPixelBuffer:*outBuffer];
}
return kCVReturnSuccess;
}
Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow