GPUImage视频,透明度超过UIView

Eti*_*678 5 iphone transparent video-processing ios gpuimage

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

我有一个MPMoviePlayerController观点作为背景,并在其他不同的元素之上,如UIImagesUILabels.背景影片循环播放.

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

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

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

我还了解到,使用GPUImage库我可以GPUImageChromaKeyBlendFilter用来过滤视频中的颜色以使其透明,然后将其与另一个视频相结合.

我不明白的是在我的情况下实现它以获得我想要的结果的最佳方式.

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

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

谢谢你的帮助!

Raj*_*aju 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];
}];
Run Code Online (Sandbox Code Playgroud)

上面的代码将从应用程序的名为sample.m4v的资源加载电影,将其输入到色度键滤镜中,该滤镜设置为以0.4的灵敏度抠出纯蓝色,附加一个用于色度键控的背景图像,以及然后将所有这些发送到电影编码器,该编码器将 Movie.m4v 写入应用程序的 /Documents 目录中。

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

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

我对此需要注意的一个问题是,我还没有完全在我的电影编码中正确录制音频,但我现在正在努力解决这个问题。