我正在尝试使用两种视频的组合GPUImage和AVVideoCompositing实现两个视频之间的实时色度键过滤器.这样做天真地利用CIImage imageFromCVPixelBuffer进入CGImage到GPUImage出来CGImage,以CIImage对CVPixelBuffer,是非常低效的,并导致记忆问题.
我注意到框架中有纹理对象,渲染目标和帧缓冲区GPUImage.我希望能够利用CVOpenGLESTextureCacheCreateTextureFromImageiOS来保持GPU上的所有内容.
我不认为我完全理解框架的内部工作原理,因为我假设我可以在一个GPUImageTextureInput对象上设置一个过滤器链然后得到过滤器renderTarget,这是一个CVPixelBufferRef.在renderTarget下面的永远是零,并呼吁imageFromCurrentFrameBuffer将产生我一个灰色的框,这是不是我的形象.
请注意,下面的示例不是色度键,而是单个视频上的简单亮度滤镜,以尝试和证明该概念.
@implementation MyCustomCompositor : NSObject <AVVideoCompositing>
- (instancetype)init
{
self = [super init];
if (self) {
CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, [GPUImageContext sharedImageProcessingContext].context, NULL, &_textureCache);
}
return self;
}
- (NSDictionary<NSString *,id> *)requiredPixelBufferAttributesForRenderContext
{
return @{(NSString *)kCVPixelBufferPixelFormatTypeKey : @[@(kCVPixelFormatType_32BGRA)],
(NSString *)kCVPixelBufferOpenGLCompatibilityKey : @YES};
}
- (NSDictionary<NSString *,id> *)sourcePixelBufferAttributes
{ …Run Code Online (Sandbox Code Playgroud)