2016-04-28 6 views
1

ich diesen Code verwenden CVPixelBufferRef zu erstellen:UIImage CVPixelBufferRef leer

NSDictionary *videoSettings = @{AVVideoCodecKey: AVVideoCodecH264, 
            AVVideoWidthKey: [NSNumber numberWithInt:size.width], 
            AVVideoHeightKey: [NSNumber numberWithInt:size.height]}; 

self.writerInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo 
                     outputSettings:videoSettings]; 

self.adaptor = [AVAssetWriterInputPixelBufferAdaptor assetWriterInputPixelBufferAdaptorWithAssetWriterInput:self.writerInput sourcePixelBufferAttributes:nil]; 

CVPixelBufferRef buffer; 
CVPixelBufferPoolCreatePixelBuffer(NULL, self.adaptor.pixelBufferPool, &buffer); 
buffer = [self pixelBufferFromCGImage:[frame CGImage] size:self.videoSize]; 

ist dies die pixelBufferFromCGImage Funktion:

+ (CVPixelBufferRef)pixelBufferFromCGImage:(CGImageRef)image 
            size:(CGSize)imageSize 
{ 
    NSDictionary *options = @{(id)kCVPixelBufferCGImageCompatibilityKey: @YES, 
           (id)kCVPixelBufferCGBitmapContextCompatibilityKey: @YES}; 
    CVPixelBufferRef pxbuffer = NULL; 
    CVReturn status = CVPixelBufferCreate(kCFAllocatorDefault, imageSize.width, 
              imageSize.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, imageSize.width, 
              imageSize.height, 8, 4*imageSize.width, rgbColorSpace, 
              kCGImageAlphaNoneSkipFirst); 
    NSParameterAssert(context); 

    CGContextDrawImage(context, CGRectMake(0 + (imageSize.width-CGImageGetWidth(image))/2, 
             (imageSize.height-CGImageGetHeight(image))/2, 
             CGImageGetWidth(image), 
             CGImageGetHeight(image)), image); 
    CGColorSpaceRelease(rgbColorSpace); 
    CGContextRelease(context); 

    CVPixelBufferUnlockBaseAddress(pxbuffer, 0); 

    return pxbuffer; 
} 

Das Problem ist, dass die buffer Allways leer ist, eine Idee, warum sein geschehen?

Antwort

2

Ich denke, dass der Puffer immer Null ist, weil die "videoSize" nicht gültig ist. Ich habe Ihren Code in 3 Szenarien getestet und hier sind die Ergebnisse

Die erste, die ich gültige Parameter mit einem Bild und einer Größe 200x200 übergeben. Der Puffer war nicht Null.

Die zweite habe ich eine Null für Bild und Videogröße 200x200 übergeben. Der Puffer war nicht Null.

Die letzte, die ich ein gültiges Bild, aber ungültige Videogröße 0x0 übergeben und der Puffer war Null. Der Rückkehrstatus ist

kCVReturnInvalidArgument 
Invalid function parameter. For example, out of range or the wrong type. 

Value 
-6661 

Description 
Invalid function parameter. For example, out of range or the wrong type. 

Hoffe, dass dies Ihnen helfen wird.

Dies ist der Code, den ich getestet habe.

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    UIImage *image = [UIImage imageNamed:@"Doge-Meme.jpg"]; 
    CVPixelBufferRef bufferRef = [[self class] pixelBufferFromCGImage:image.CGImage size:CGSizeMake(200, 200)]; 
    NSLog(@"## %@", bufferRef);//not nil 

    CVPixelBufferRef bufferRef1 = [[self class] pixelBufferFromCGImage:nil size:CGSizeMake(200, 200)]; 
    NSLog(@"## %@", bufferRef1);//not nil 

    CVPixelBufferRef bufferRef2 = [[self class] pixelBufferFromCGImage:image.CGImage size:CGSizeMake(0, 0)]; 
    NSLog(@"## %@", bufferRef2);//nil 
} 

+ (CVPixelBufferRef)pixelBufferFromCGImage:(CGImageRef)image 
             size:(CGSize)imageSize 
{ 
    NSDictionary *options = @{(id)kCVPixelBufferCGImageCompatibilityKey: @YES, 
           (id)kCVPixelBufferCGBitmapContextCompatibilityKey: @YES}; 
    CVPixelBufferRef pxbuffer = NULL; 
    CVReturn status = CVPixelBufferCreate(kCFAllocatorDefault, imageSize.width, 
              imageSize.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, imageSize.width, 
               imageSize.height, 8, 4*imageSize.width, rgbColorSpace, 
               kCGImageAlphaNoneSkipFirst); 
    NSParameterAssert(context); 

    CGContextDrawImage(context, CGRectMake(0 + (imageSize.width-CGImageGetWidth(image))/2, 
              (imageSize.height-CGImageGetHeight(image))/2, 
              CGImageGetWidth(image), 
              CGImageGetHeight(image)), image); 
    CGColorSpaceRelease(rgbColorSpace); 
    CGContextRelease(context); 

    CVPixelBufferUnlockBaseAddress(pxbuffer, 0); 

    return pxbuffer; 
}