GPUImage视频,透明度超过UIView

时间:2012-12-18 14:02:57

标签: iphone ios transparent video-processing gpuimage

我正在开发一个iOS项目,该项目使用AV-Out在第二个屏幕上的1280x720窗口中显示内容。

我有一个MPMoviePlayerController的视图作为背景,并且在UIImagesUILabels等不同的其他元素之上。 背景影片循环播放。

现在我想用包含所有可见元素的整个视图覆盖另一个具有透明度的全屏动画,以便只有部分底层视图可见。

我首先尝试使用UIImageView的png动画。 我很惊讶地发现它实际上可以在iPhone5上运行,但当然pngs的体积非常大,以至于它使用了太多的内存并且在iPhone4s以下的所有内容都会崩溃。 所以我需要另一种方式。

我想出了如何使用AVFoundation同时播放第二部电影。 到现在为止还挺好。现在我可以播放叠加视频了,但当然它还不是透明的。

我还了解到,使用GPUImage库,我可以使用GPUImageChromaKeyBlendFilter过滤视频中的颜色,使其透明,然后将其与其他视频合并。

我不理解的是在我的情况下实现它以获得我想要的结果的最佳方式。

我可以将顶部视频下方的整个视图层次结构用作GPUImageChromaKeyBlendFilter的第一个输入,将绿屏风格视频用作第二个输入,并以720p显示结果吗?我该怎么做?

或者最好使用GPUImageChromaKeyFilter并过滤绿屏风格的视频,并在所有其他视图之上的视图中播放?这段视频的背景是否会透明呢?

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

您需要使用AVFoundation.framework构建自定义播放器,然后使用带alpha通道的视频。 AVFoundation框架允许更加强大的视频处理,而没有MPMedia框架的许多限制。建立一个自定义播放器并不像人们想象的那么难。我在这里写了一个教程:http://www.sdkboy.com/?p=66

其他方式..........

框架中的SimpleVideoFileFilter示例显示了如何加载电影,过滤它和 将其编码回磁盘。修改它以执行色度键控可得到以下结果:

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

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

[movieFile addTarget:filter];

UIImage *inputImage = [UIImage imageNamed:@"background.jpg"];
sourcePicture = [[GPUImagePicture alloc] initWithImage:inputImage smoothlyScaleOutput:YES];
[sourcePicture addTarget:filter];

NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Movie.m4v"];
NSURL *movieURL = [NSURL fileURLWithPath:pathToMovie];
movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(480.0, 640.0)];
[filter addTarget:movieWriter];

[movieWriter startRecording];
[movieFile startProcessing];

[movieWriter setCompletionBlock:^{
    [filter removeTarget:movieWriter];
    [movieWriter finishRecording];
}];

上面的代码将从名为sample.m4v的应用程序资源加载一部电影,将其输入色度键过滤器,该过滤器设置为关闭纯蓝色,灵敏度为0.4,附加背景图像用于色度键入,然后将所有内容发送到电影编码器,该编码器将Movie.m4v写入应用程序的/ Documents目录。

您可以根据需要调整阈值和特定蓝色调,以及根据需要将输入图像替换为其他电影或其他来源。此过程也可以应用于iOS设备相机的实时视频,如果您愿意,可以将结果显示在屏幕上。

在运行iOS 5.0的iPhone 4上,色度键控需要1.8 ms(500+ FPS)用于640x480帧视频,65 ms用于720p帧(15 FPS)。较新的基于A5的设备比这些操作快6-10倍,因此它们可以处理1080p视频而不会出汗。我使用iOS 5.0的快速纹理缓存进行帧上传和检索,从而加速了该操作系统版本在4.x上的处理。

我对此的一个警告是,我的电影编码中没有完全记录音频,但我现在正在研究它。

答案 1 :(得分:0)

框架中的SimpleVideoFileFilter示例显示了如何加载影片,过滤它并将其编码回磁盘。修改它以执行色度键控可得到以下结果:

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

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

[movieFile addTarget:filter];

UIImage *inputImage = [UIImage imageNamed:@"background.jpg"];
sourcePicture = [[GPUImagePicture alloc] initWithImage:inputImage smoothlyScaleOutput:YES];
[sourcePicture addTarget:filter];

NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Movie.m4v"];
NSURL *movieURL = [NSURL fileURLWithPath:pathToMovie];
movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(480.0, 640.0)];
[filter addTarget:movieWriter];

[movieWriter startRecording];
[movieFile startProcessing];

[movieWriter setCompletionBlock:^{
    [filter removeTarget:movieWriter];
    [movieWriter finishRecording];
}];

上面的代码将从名为sample.m4v的应用程序资源加载一部电影,将其输入色度键过滤器,该过滤器设置为关闭纯蓝色,灵敏度为0.4,附加背景图像用于色度键入,然后将所有内容发送到电影编码器,该编码器将Movie.m4v写入应用程序的/ Documents目录。

您可以根据需要调整阈值和特定蓝色调,以及根据需要将输入图像替换为其他电影或其他来源。此过程也可以应用于iOS设备相机的实时视频,如果您愿意,可以将结果显示在屏幕上。

在运行iOS 5.0的iPhone 4上,色度键控需要1.8 ms(500+ FPS)用于640x480帧视频,65 ms用于720p帧(15 FPS)。较新的基于A5的设备比这些操作快6-10倍,因此它们可以处理1080p视频而不会出汗。我使用iOS 5.0的快速纹理缓存进行帧上传和检索,从而加速了该操作系统版本在4.x上的处理。

我对此的一个警告是,我的电影编码中没有完全记录音频,但我现在正在研究它。