5

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

我有一个MPMoviePlayerController's 视图作为背景,并在不同的其他元素(如UIImages和)之上UILabels。背景电影循环播放。

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

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

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

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

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

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

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

谢谢你的帮助!

4

2 回答 2

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

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

于 2014-02-24T05:28:09.960 回答
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 上,640x480 帧视频的色度键控需要 1.8 毫秒 (500+ FPS),720p 帧 (15 FPS) 需要 65 毫秒。较新的基于 A5 的设备比这些操作快 6-10 倍,因此它们可以毫不费力地处理 1080p 视频。我使用 iOS 5.0 的快速纹理缓存进行帧上传和检索,这可以加速该操作系统版本超过 4.x 的处理。

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

于 2014-02-24T05:37:00.897 回答