2012-04-02 3 views
1

하나의 이미지에서 동영상을 내보내려고합니다. 행을 따라 무언가가 How do I export UIImage array as a movie?입니다.iphone : 이미지를 동영상으로 내보낼 때 동영상이 손상됩니다.

나는 많은 변화를 시도했지만 손상된 비디오가 계속 나타납니다. (색상 및 이미지 모두 잘못되었습니다). 어떤 아이디어라도 누구든지 ? 감사

CODE :

- (void)writeImageAsMovie:(UIImage*)image toPath:(NSString*)path size:(CGSize)size duration:(int)duration 
{ 
NSFileManager *localFileManager=[[NSFileManager alloc] init]; 
NSError *error = nil; 
[localFileManager removeItemAtPath:path error:&error]; 
NSLog(@"Write Started"); 

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]; 

AVAssetWriterInputPixelBufferAdaptor *adaptor = [AVAssetWriterInputPixelBufferAdaptor 
               assetWriterInputPixelBufferAdaptorWithAssetWriterInput:writerInput 
               sourcePixelBufferAttributes:nil]; 
NSParameterAssert(writerInput); 
NSParameterAssert([videoWriter canAddInput:writerInput]); 
[videoWriter addInput:writerInput]; 

//Start a session: 
[videoWriter startWriting]; 
[videoWriter startSessionAtSourceTime:kCMTimeZero]; 

//Write samples: 
CVPixelBufferRef buffer = [self newPixelBufferFromCGImage:image.CGImage andSize:image.size]; 
[adaptor appendPixelBuffer:buffer withPresentationTime:kCMTimeZero]; 
[adaptor appendPixelBuffer:buffer withPresentationTime:CMTimeMake(duration-1, 2)]; 

//Finish the session: 
[writerInput markAsFinished]; 
[videoWriter endSessionAtSourceTime:CMTimeMake(duration, 2)]; 
[videoWriter finishWriting]; 

}

- (CVPixelBufferRef) newPixelBufferFromCGImage: (CGImageRef) image andSize:(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); 
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); 
//CGContextConcatCTM(context, frameTransform); 
CGContextDrawImage(context, CGRectMake(0, 0, CGImageGetWidth(image), 
             CGImageGetHeight(image)), image); 
CGColorSpaceRelease(rgbColorSpace); 
CGContextRelease(context); 

CVPixelBufferUnlockBaseAddress(pxbuffer, 0); 

return pxbuffer; 

}

답변

0
참고로 여기 그냥

하지만, 영상의 폭이되는 때 시뮬레이터에서이 같은 오류를보고하고 인코딩 된 것은 홀수입니다. 예를 들어, 16x16 이미지에는 오류가 없지만 17x16 무비에 오류가 표시됩니다. 그것은 18x18 영화를 위해 나타나지 않는다. 그래서 나는 그것이 4의 배수 인 입력을 기대하는 H264 인코딩의 과정과 관련이 있다고 생각한다. 또한 그것은 단지 시뮬레이터의 문제로 보인다.

관련 문제