Рендеринг альфа-изображения на CVImageBufferRef

Я пытаюсь добиться этого эффекта. Вы можете проверить этот эффект в приложении ical.ly (эффект ряби)

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

Вот мой подход.

Я буду отображать альфа и масштабированное изображение в пиксельном буфере. Я показываю весь буфер образцов, используя AVSampleBufferDisplayLayer . Я хочу показать эту анимацию в течение 3 секунд - 5 секунд. Как только пользователь закончил, я преобразую его в mp4 с помощью AVAssetWriter .

Я не могу добавить альфа-изображение в 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 и рендеринг в буфер первого пикселя

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()];

Я получил этот результат. результат [1

Ожидаемый результат Ожидаемый результат [2

заранее спасибо

1 ответ

Этот эффект изображения выглядит как фиксированное изображение с масштабированием и затемнением, примененным к копии поверх оригинала. Для этого вам не нужна библиотека анимации, просто создайте PNG и 2 слоя для его рендеринга, затем масштабируйте один из слоев и постепенно уменьшайте его по мере увеличения. Начните с изображения 32 BPP, которое содержит альфа для прозрачных частей, и вы должны быть в порядке. Если вы хотите зафиксировать эффект как.h264, это совершенно другая проблема.

Другие вопросы по тегам