在CVImageBufferRef上渲染Alpha图像

时间:2018-04-19 11:44:27

标签: ios objective-c animation core-image cvpixelbuffer

我正在努力实现这种效果。你可以在musical.ly app(涟漪效应)中检查这个效果

https://drive.google.com/open?id=1uXExnmWQ7OfSGLFXdH7-5imay8tW87vO

这是我的方法。

我将alpha和缩放图像渲染到像素缓冲区我正在使用AVSampleBufferDisplayLayer显示所有样本缓冲区。我想要显示这个动画3秒 - 5秒。一旦用户完成然后我将使用AVAssetWriter将其转换为mp4。

我无法将alpha图像添加到cvpixelbuffer

如果有更好的方法来制作这个动画。请指导。

我使用AVAssetReaderTrackOutput获取所有样本缓冲区。

NSDictionary *readerOutputSettings = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA], kCVPixelBufferPixelFormatTypeKey, nil];
AVAssetReaderTrackOutput* readerOutput = [AVAssetReaderTrackOutput assetReaderTrackOutputWithTrack:videoTrack
                                                                                    outputSettings:readerOutputSettings];
[reader addOutput:readerOutput];
[reader startReading];

  while ((sample = [readerOutput copyNextSampleBuffer]))
     {
        [samples addObject:(__bridge id)sample];
        CFRelease(sample);
     }

CVImageBufferRef pixelBuffer = CMSampleBufferGetImageBuffer((__bridge CMSampleBufferRef)[samples lastObject]);

CIImage *filteredImage = [CIImage imageWithCVPixelBuffer:pixelBuffer options:nil];

CIFilter* theFilter = [CIFilter filterWithName:@"CIColorMatrix"];

[theFilter setDefaults];

[theFilter setValue: filteredImage forKey: @"inputImage"];

CIVector *theRVector = [CIVector vectorWithX:1 Y:0 Z:0 W:0];
[theFilter setValue: theRVector forKey:@"inputRVector"];

CIVector *theGVector = [CIVector vectorWithX:0 Y:1 Z:0 W:0];
[theFilter setValue: theGVector forKey:@"inputGVector"];

CIVector *theBVector = [CIVector vectorWithX:0 Y:0 Z:1 W:0];
[theFilter setValue: theBVector forKey:@"inputBVector"];

CIVector *theAVector = [CIVector vectorWithX:0 Y:0 Z:0 W:0.5];
[theFilter setValue: theAVector forKey:@"inputAVector"];

CIVector *theBiasVector = [CIVector vectorWithX:0 Y:0 Z:0 W:0];
[theFilter setValue: theBiasVector forKey:@"inputBiasVector"];

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

然后我减少了ciimage的alpha并渲染到第一个像素缓冲区

EAGLContext *eaglContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES3];
    CIContext *cicontext =  [CIContext contextWithEAGLContext:eaglContext options:@{kCIContextWorkingColorSpace : [NSNull null]}];

 [cicontext render:result toCVPixelBuffer:CMSampleBufferGetImageBuffer((__bridge CMSampleBufferRef)[samplebuffers firstObject]) bounds:CGRectMake(0, 0, [result extent].size.width,[result extent].size.height) colorSpace:CGColorSpaceCreateDeviceRGB()];

我得到了这个结果。 result[1]

预期结果Expected result[2]

提前致谢

1 个答案:

答案 0 :(得分:0)

此图像效果似乎是固定图像,其缩放和淡入应用于原件上的复印件。您不需要为此创建动画库,只需创建一个PNG和2个图层来渲染它,然后缩放其中一个图层并在缩放发生时将其淡出。从32 BPP图像开始,其中包含透视部分的alpha,你应该没问题。如果你想将效果捕获为.h264,这是一个完全不同的问题。