2013-02-04 28 views
2

我写了一个辅助类来记录NSView并将其保存到QuickTime文件中。该视图可以很好地记录到QuickTime电影中,但出于某种原因输出出现偏斜。我班的核心是下方,并且输出是这样的:CGImage录制失真

Skewed .mov file

- (void) captureImage 
{ 
    [self getCGImageFromView]; 
    pixelBuffer = [self getPixelBufferFromCGImage:viewCGImage size:CGRectMake(0, 0, mViewRect.size.width, mViewRect.size.height).size]; 

    if(pixelBuffer) { 
     if(![adapter appendPixelBuffer:pixelBuffer withPresentationTime:CMTimeMake(mCurrentFrame, 20)]) 
      NSLog(@"AVAssetWriterInputPixelBufferAdaptor: Failed to append pixel buffer."); 

     CFRelease(pixelBuffer); 
     mCurrentFrame++; 
    } 
} 

- (void) getCGImageFromView 
{ 
    viewBitmapImageRep = [currentView bitmapImageRepForCachingDisplayInRect:mViewRect]; 
    [currentView cacheDisplayInRect:mViewRect toBitmapImageRep:viewBitmapImageRep]; 

    viewBitmapFormat = [viewBitmapImageRep bitmapFormat]; 
    viewCGImage = [viewBitmapImageRep CGImage]; 
} 

- (CVPixelBufferRef)getPixelBufferFromCGImage:(CGImageRef)image size:(CGSize)size 
{ 
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: 
         [NSNumber numberWithBool:YES], kCVPixelBufferCGImageCompatibilityKey, 
         [NSNumber numberWithBool:YES], kCVPixelBufferCGBitmapContextCompatibilityKey, 
         [NSNumber numberWithBool:YES], kCVPixelBufferOpenGLCompatibilityKey, 
         [NSNumber numberWithInt:size.width], kCVPixelBufferWidthKey, 
         [NSNumber numberWithInt:size.height], kCVPixelBufferHeightKey, 
         nil]; 

    CVPixelBufferRef pxbuffer = NULL; 
    CVReturn status = CVPixelBufferCreate(NULL, 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, kCGImageAlphaPremultipliedFirst); 
    NSParameterAssert(context); 

    [[currentView layer] renderInContext:context]; 

    //CGContextDrawImage(context, CGRectMake(0, 0, CGImageGetWidth(image), CGImageGetHeight(image)), image); 
    CGColorSpaceRelease(rgbColorSpace); 
    CGContextRelease(context); 
    CVPixelBufferUnlockBaseAddress(pxbuffer, 0); 

    return pxbuffer; 
} 

回答

3

的问题,这是此行。

4*size.width, 

的size.width是奇数,不是4传递到CGBitmapContextCreate的值的倍数需要是4

4*ceil(size.width/4) * 4 

即解决了这个问题的倍数。