2012-04-02 3 views
1

Ich versuche, einen Film aus einem einzigen Bild zu exportieren. etwas in Richtung der How do I export UIImage array as a movie?.iphone: Wenn Sie versuchen, ein Bild als Film zu exportieren, ist der Film beschädigt

Ich habe viele Variablen versucht, aber ich bekomme immer wieder beschädigte Videos. (Farbe und Bild sind alle falsch). irgendeine idee jemand? dank

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; 

}

Antwort

0

Gerade FYI hier ein, aber ich sehe den gleichen Fehler im Simulator, wenn die Breite des Videos zu sein codiert ist ungerade. Bei einem 16x16-Bild tritt beispielsweise kein Fehler auf, aber der Fehler tritt bei einem 17x16-Film auf. Es erscheint nicht für einen 18x18-Film, also denke ich, dass es etwas mit dem Prozess der H264-Kodierung zu tun hat, die erwartet, dass Input ein Vielfaches von 4 ist. Außerdem scheint es nur ein Problem im Simulator zu sein.

Verwandte Themen