具有UIView透明度的GPUImagevideo
我正在使用AV-Out的iOS项目在第二个屏幕上显示1280×720窗口中的内容。
我有一个MPMoviePlayerController
的视图作为背景,并在不同的其他元素,如UIImages
和UILabels
顶部。 背景电影循环播放。
现在我想覆盖整个视图,包括所有可见元素与另一个具有透明度的全屏animation,以便只有底层视图的一部分可见。
我第一次尝试用UIImageView
PNGanimation。 我惊讶地发现,实际上在iPhone5上工作,但当然,这个PNG是如此之大,这使用了太多的内存,它在iPhone4s以下的一切崩溃。 所以我需要另一种方式。
我想出了如何使用AVFoundation同时播放第二部电影。 到现在为止还挺好。 现在我可以播放覆盖video,但当然它不是透明的。
我还了解到,使用GPUImage
库,我可以使用GPUImageChromaKeyBlendFilter
来过滤video中的颜色,使其透明,然后将其与另一个video合并。
我不明白的是在我的情况下实现它的最佳方式来获得我想要的结果。
我可以使用顶部video下面的整个视图层次作为GPUImageChromaKeyBlendFilter
第一个input和绿屏风格的video作为第二个input,并以720p显示结果? 我该怎么做?
或者,最好是使用GPUImageChromaKeyFilter
,只是过滤绿屏风格的video,并在视图中播放video高于所有其他视图? 这个video的背景是透明的吗?
谢谢你的帮助!
您需要使用AVFoundation.framework构build自定义播放器,然后使用带有Alpha通道的video。 AVFoundation框架允许更多强大的video处理,而没有MPMedia框架的许多限制。 build立一个自定义的玩家并不像人们想象的那样困难。 我在这里写了一个教程: 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中加载一个电影,将其馈送到一个色度键filter,该filter设置为closures纯蓝色,灵敏度为0.4,附加一个背景图像用于色度键控,以及然后将所有这些发送到将Movie.m4v写入应用程序的/ Documents目录中的电影编码器。
您可以根据需要调整阈值和特定蓝色色调,并根据需要将input图像replace为其他电影或其他来源。 这个过程也可以应用于iOS设备摄像头的实时video,如果您愿意,可以将结果显示在屏幕上。
在运行iOS 5.0的iPhone 4上,色度键控对于640×480帧video需要1.8 ms(500+ FPS),对于720p帧(15 FPS)需要65 ms。 较新的基于A5的设备比这些操作快6-10倍,所以他们可以处理1080pvideo,而不会出汗。 我使用iOS 5.0的快速纹理caching来进行帧上传和检索,这加速了操作系统版本超过4.x的处理。
我对此有一个警告,就是我没有把audio录制到我的电影编码中,但是我现在正在处理这个问题。
框架中的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中加载一个电影,将其馈送到一个色度键filter,该filter设置为closures纯蓝色,灵敏度为0.4,附加一个背景图像用于色度键控,以及然后将所有这些发送到将Movie.m4v写入应用程序的/ Documents目录中的电影编码器。
您可以根据需要调整阈值和特定蓝色色调,并根据需要将input图像replace为其他电影或其他来源。 这个过程也可以应用于iOS设备摄像头的实况video,如果您愿意,可以将结果显示在屏幕上。
在运行iOS 5.0的iPhone 4上,色度键控对于640×480帧video需要1.8 ms(500+ FPS),对于720p帧(15 FPS)需要65 ms。 较新的基于A5的设备比这些操作快6-10倍,所以他们可以处理1080pvideo,而不会出汗。 我使用iOS 5.0的快速纹理caching来进行帧上传和检索,这加速了操作系统版本超过4.x的处理。
我对此有一个警告,就是我没有把audio录制到我的电影编码中,但是我现在正在处理这个问题。