Imagen principal: mostrar una image transparente en CMSampleBufferRef da como resultado un recuadro negro a su alnetworkingedor.

Estoy tratando de agregar una marca de agua / logotipo en un video que estoy grabando utilizando AVCaptureVideoDataOutput de AVFoundation. Mi class se establece como sampleBufferDelegate y recibe el CMSamplebufferRefs. Ya aplico algunos efectos al CMSampleBufferRefs CVPixelBuffer y lo devuelvo al AVAssetWriter.

El logotipo en la esquina superior izquierda se entrega con un PNG transparente. El problema que estoy teniendo es que las partes transparentes del UIImage son negras una vez que se escriben en el video. Alguien tiene una idea de lo que estoy haciendo mal o podría estar olvidando?

Fragmentos de código a continuación:

//somewhere in the init of the class; _eaglContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]; _ciContext = [CIContext contextWithEAGLContext:_eaglContext options: @{ kCIContextWorkingColorSpace : [NSNull null] }]; //samplebufferdelegate method: - (void) captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection { CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); CVPixelBufferLockBaseAddress(pixelBuffer, 0); .... UIImage *logoImage = [UIImage imageNamed:@"logo.png"]; CIImage *renderImage = [[CIImage alloc] initWithCGImage:logoImage.CGImage]; CGColorSpaceRef cSpace = CGColorSpaceCreateDeviceRGB(); [_ciContext render:renderImage toCVPixelBuffer:pixelBuffer bounds: [renderImage extent] colorSpace:cSpace]; CVPixelBufferUnlockBaseAddress(pixelBuffer, 0); CGColorSpaceRelease(cSpace); .... } 

Parece que CIContext no dibuja los CIImages alpha. ¿Algunas ideas?

Para desarrolladores que han encontrado el mismo problema:

Parece que todo lo que aparece en la GPU y se graba en el video termina haciendo un agujero negro en el video. En su lugar, eliminé el código anterior, creó un CGContextRef, como lo haría al editar imágenes, y dibujé en ese context.

Código:

 .... CVPixelBufferLockBaseAddress( pixelBuffer, 0 ); CGContextRef context = CGBitmapContextCreate(CVPixelBufferGetBaseAddress(pixelBuffer), CVPixelBufferGetWidth(pixelBuffer), CVPixelBufferGetHeight(pixelBuffer), 8, CVPixelBufferGetBytesPerRow(pixelBuffer), CGColorSpaceCreateDeviceRGB(), (CGBitmapInfo) kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst); CGRect renderBounds = ... CGContextDrawImage(context, renderBounds, [overlayImage CGImage]); CVPixelBufferUnlockBaseAddress(pixelBuffer, 0); CGColorSpaceRelease(cSpace); .... 

Y por supuesto, el EAGLContext global y el CIContext ya no son necesarios.