0

私はこの効果を達成しようとしています。この効果は music.ly アプリで確認できます (リップル効果)

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

これが私のアプローチです。

AVSampleBufferDisplayLayer を使用してすべてのサンプル バッファーを表示しているピクセル バッファーにアルファとスケーリングされたイメージをレンダリングします。このアニメーションを 3 秒から 5 秒表示したいと思います。ユーザーが完了したら、 AVAssetWriter を使用して mp4 に変換します。

アルファ画像を 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]

前もって感謝します

4

1 に答える 1