Estoy escribiendo una Película personalizada de Grabación de aplicación y han implementado AVAssetWriter y AVAssetWriterInputPixelBufferAdaptor para la escritura de marcos a un archivo. En el DataOutputDelegate de devolución de llamada que yo estoy tratando de aplicar un CIFilter a la sampleBuffer. Primero se obtiene una CVPixelBufferRef y, a continuación, crear un CIImage. Yo, a continuación, aplicar el CIIFilter y agarrar el resultado CIImage:

    CVPixelBufferRef pixelBuffer = (CVPixelBufferRef)CMSampleBufferGetImageBuffer(sampleBuffer);

    CIImage *image = [CIImage imageWithCVPixelBuffer:pixelBuffer];
    CIFilter *hueAdjust = [CIFilter filterWithName:@"CIHueAdjust"];
    [hueAdjust setDefaults];
    [hueAdjust setValue: image forKey: @"inputImage"];
    [hueAdjust setValue: [NSNumber numberWithFloat: 2.094]
                 forKey: @"inputAngle"];

    CIImage *result = [hueAdjust valueForKey: @"outputImage"];

    CVPixelBufferRef newBuffer = //Convert CIImage...

Cómo se podría ir sobre la conversión que CIImage así que puedo:

    [self.filteredImageWriter appendPixelBuffer:newBuffer withPresentationTime:lastSampleTime];
InformationsquelleAutor Andrew | 2012-04-02

1 Comentario

  1. 9

    RESPUESTA ACTUALIZADA

    Mientras mi anterior método funciona, yo era capaz de modificar esto para simplificar el código. También parece que corre un poco más rápido.

    samplePixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
    CVPixelBufferLockBaseAddress(samplePixelBuffer, 0); //NOT SURE IF NEEDED //NO PERFORMANCE IMPROVEMENTS IF REMOVED
    
    NSDictionary *options = [NSDictionary dictionaryWithObject:(__bridge id)rgbColorSpace forKey:kCIImageColorSpace];                
    outputImage = [CIImage imageWithCVPixelBuffer:samplePixelBuffer options:options];
    
    //-----------------
    //FILTER OUTPUT IMAGE
    
    @autoreleasepool {
    
        outputImage = [self applyEffectToCIImage:outputImage dict:dict];
    
    }
    CVPixelBufferUnlockBaseAddress(samplePixelBuffer, 0); //NOT SURE IF NEEDED //NO PERFORMANCE IMPROVEMENTS IF REMOVED
    
    //-----------------
    //RENDER OUTPUT IMAGE BACK TO PIXEL BUFFER
    
    [self.filterContext render:outputImage toCVPixelBuffer:samplePixelBuffer bounds:[outputImage extent] colorSpace:CGColorSpaceCreateDeviceRGB()]; //DOES NOT SEEM TO WORK USING rgbColorSpace

    RESPUESTA ANTERIOR

    Me implementado los procedimientos para obtener el pixel buffer de un CIImage. Asegúrese de que sus formatos de píxel son consistentes, de lo contrario tendrá problemas de color. También la CFDictionaries son muy importantes. http://allmybrain.com/2011/12/08/rendering-to-a-texture-with-ios-5-texture-cache-api/

    CFDictionaryRef empty = CFDictionaryCreate(kCFAllocatorDefault, //EMPTY IOSURFACE DICT
                                               NULL,
                                               NULL,
                                               0,
                                               &kCFTypeDictionaryKeyCallBacks,
                                               &kCFTypeDictionaryValueCallBacks);
    CFMutableDictionaryRef attributes = CFDictionaryCreateMutable(kCFAllocatorDefault,
                                                             1,
                                                             &kCFTypeDictionaryKeyCallBacks,
                                                             &kCFTypeDictionaryValueCallBacks);
    
    CFDictionarySetValue(attributes,kCVPixelBufferIOSurfacePropertiesKey,empty);
    
    CVPixelBufferRef pixelBuffer = NULL;
    CVReturn status = CVPixelBufferCreate(kCFAllocatorDefault, 
                                          outputImage.extent.size.width, 
                                          outputImage.extent.size.height, 
                                          kCVPixelFormatType_32BGRA, 
                                          attributes, 
                                          &pixelBuffer);
    
    if (status == kCVReturnSuccess && pixelBuffer != NULL) {
    
        CVPixelBufferLockBaseAddress(pixelBuffer, 0); //NOT SURE IF NEEDED //KEPT JUST IN CASE
        [self.filterContext render:outputImage toCVPixelBuffer:pixelBuffer bounds:[outputImage extent] colorSpace:CGColorSpaceCreateDeviceRGB()];
        CVPixelBufferUnlockBaseAddress(pixelBuffer, 0); //NOT SURE IF NEEDED //KEPT JUST IN CASE
    
    }
    • Este código no estaba funcionando para mí.
    • Esto es muy útil, respuesta, sin embargo, le falta una pieza fundamental de información para mí. ¿Qué es [auto.filterContext… ]. Si entiendo el código correctamente, esta es la parte que realmente hace que la CIImage de regreso a el Pixel Buffer que es lo que estoy buscando. Puedes compartir esa función, por favor? Gracias!
    • Sé que ha sido un par de años, pero para alguien que puede ver esto en el futuro: self.filteContext es un CIContext objeto. El render método hace que el CIImage a un CVPixelBuffer objeto: developer.apple.com/documentation/coreimage/cicontext/…
    • ejemplo en swift?
    • ¿puede usted proporcionar el ejemplo completo en Swift y caliente para obtener ese contexto? Es la forma CIImage?

Dejar respuesta

Please enter your comment!
Please enter your name here