iphone - 在 UIView 上透明的 GPUImage 视频

标签 iphone ios transparent video-processing gpuimage

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

我有一个 MPMoviePlayerController 的 View 作为背景,在不同的其他元素之上,如 UIImagesUILabels。 背景电影循环播放。

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

我首先尝试使用 UIImageView 制作 png 动画。 我惊讶地发现它实际上适用于 iPhone5,但是当然 png 的尺寸太大以至于它使用了太多的内存并且它在 iPhone4s 以下的所有东西上崩溃了。 所以我需要另一种方式。

我想出了如何使用 AVFoundation 同时播放第二部电影。 到目前为止,一切都很好。现在我可以播放覆盖视频了,当然它还不是透明的。

我还了解到,借助 GPUImage 库,我可以使用 GPUImageChromaKeyBlendFilter 从视频中滤除颜色以使其透明,然后将其与另一个视频组合。

我还不明白的是在我的案例中实现它以获得我想要的结果的最佳方式。

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

或者使用 GPUImageChromaKeyFilter 过滤绿屏风格的视频,然后在所有其他 View 之上的 View 中播放它会更好吗?那么这个视频的背景是透明的吗?

感谢您的帮助!

最佳答案

您需要使用 AVFoundation.framework 构建自定义播放器,然后使用带 alpha channel 的视频。 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 上,640x480 视频帧的色度键控需要 1.8 毫秒(500+ FPS),720p 帧(15 FPS)需要 65 毫秒。更新的基于 A5 的设备比这些操作快 6-10 倍,因此它们可以毫不费力地处理 1080p 视频。我使用 iOS 5.0 的快速纹理缓存进行帧上传和检索,这加快了 4.x 以上操作系统版本的处理速度。

我对此的一个警告是,我还没有完全正确地在我的电影编码中录制音频,但我现在正在努力。

关于iphone - 在 UIView 上透明的 GPUImage 视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13934643/

相关文章:

iphone - ios : create NavigationBar programmatically, 但无法设置标题

ios - 从 Safari 复制时的 "iOS rich content paste pasteboard type"是什么?

iphone - 可以将 WiFi 设置从 iOS 设备传递到 ExternalAccessory 对象吗?

iphone - 如何跳过压缩一张 PNG?

iphone - 拖动 UITableView 时 NSTimer 不工作

iphone - 将效果应用于iPhone相机预览 "Video"

c++ - Qt设置iOS屏幕方向

c# - 如何在 .NET 中以编程方式为图像的透明部分着色

uinavigationbar - iOS 11 大标题栏色调颜色无法设置

python - 使 tkinter 中 'Text' 小部件的背景透明