3

我正在尝试RGB: 0x00FF00使用@BradLarson 很棒的GPUImage工具包使用透明度键(或全绿色)在我的应用程序中显示具有透明度的视频文件。但是,我在使用GPUImageChromaKeyFilter过滤器时遇到了一些困难,我不太明白为什么。

我的源视频文件在我的 Dropbox 中可用 12 KB,3 秒长,全绿色背景,屏幕上只是一个正方形),

我使用了名为SimpleVideoFilter.

这是我尝试使用的代码(我只是替换了-viewDidLoad):

NSURL *sampleURL = [[NSBundle mainBundle] URLForResource:@"sample" withExtension:@"m4v"];
movieFile = [[GPUImageMovie alloc] initWithURL:sampleURL];

filter = [[GPUImageChromaKeyFilter alloc] init];
[filter setColorToReplaceRed:0 green:1 blue:0];
[filter setEnabled:YES];

[movieFile addTarget:filter];

GPUImageView *filterView = (GPUImageView *)self.view;
[filter addTarget:filterView];

[movieFile startProcessing];

根据文档(这是稀疏的),这应该具有替换视频中所有绿色的效果。相反,我将其作为输出:

视频截图

这告诉我视频正在播放(因此它正在复制到应用程序),但它似乎没有进行任何色度键控。为什么会这样?我是否需要手动设置平滑值和阈值?我不应该,因为源只包含两种颜色(0x00FF000x000000)。

我也在设备上对此进行了测试,但无济于事。我尝试使用的几乎所有其他过滤器都可以工作,例如GPUImageRGBFilter,GPUImageSepiaFilter等。会GPUImageChromaKeyFilter被破坏吗?

对此的任何帮助将不胜感激,因为此时我正在刮擦桶的底部以获得视频的透明度。

4

2 回答 2

9

与原始问题类似,我想将绿屏视频放在自定义视图层次结构的顶部,包括。现场视频。事实证明,使用标准 GPUImage ChromaKey 过滤器是不可能的。它不是 alpha 混合,而是将绿色像素与背景像素混合。例如,红色背景变成黄色,蓝色变成青色。

让它工作的方法包括两个步骤:

1)确保filterview具有透明背景:

filterView.backgroundColor=[UIColor clearColor];

2)修改GPUImageChromaKeyFilter.m

old: gl_FragColor = vec4(textureColor.rgb, textureColor.a * blendValue);
new: gl_FragColor = vec4(textureColor.rgb * blendValue, 1.0 * blendValue);

现在,视频中的所有键控(例如绿色)像素都变得透明,并显示过滤器视图下方的任何内容,包括。(现场)视频。

于 2013-04-23T12:30:11.607 回答
1

我通过使用GPUImageChromaKeyBlendFilter并设置背景图像使其工作。我想知道我们是否可以在不设置背景的情况下做到这一点。当我不设置背景时,电影显示为白色,但添加背景渲染良好......

filter = [[GPUImageChromaKeyBlendFilter alloc] init];
[(GPUImageChromaKeyBlendFilter *)filter setColorToReplaceRed:0.0 green:1.0 blue:0.0];
[(GPUImageChromaKeyBlendFilter *)filter setThresholdSensitivity:0.4];

UIImage *inputImage = [UIImage imageNamed:@"background.png"];
sourcePicture = [[GPUImagePicture alloc] initWithImage:inputImage smoothlyScaleOutput:YES];
[sourcePicture addTarget:filter];
[sourcePicture processImage];
于 2012-11-06T19:17:27.200 回答