2012-12-18 95 views
5

我正在使用AV-Out在第二个屏幕上的1280x720窗口中显示内容的iOS项目。具有UIView透明度的GPUImage视频

我有一个MPMoviePlayerController作为背景的视图,以及不同的其他元素,如UIImagesUILabels。 背景电影循环播放。

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

我第一次尝试PNG动画UIImageView。 我很惊讶地发现,实际上iPhone5的作品,但当然,巴新的规模如此之大,这使用太多的内存和它在iPhone4s以下的一切崩溃。 所以我需要另一种方式。

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

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

我不明白的是最好的方式来实现它在我的情况下得到我想要的结果。

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

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

感谢您的帮助!

回答

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 ms(500+ FPS),对于720p帧(15 FPS)需要65 ms。较新的基于A5的设备比这些操作的速度快6-10倍,因此他们可以在不打破汗水的情况下处理1080p视频。我使用iOS 5.0的快速纹理缓存来进行帧上传和检索,这加快了该操作系统版本上的处理速度。

我对此有一个警告,那就是我还没有把音频录制到我的电影编码中,但我现在正在处理这个问题。

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 ms(500+ FPS),对于720p帧(15 FPS)需要65 ms。较新的基于A5的设备比这些操作的速度快6-10倍,因此他们可以在不打破汗水的情况下处理1080p视频。我使用iOS 5.0的快速纹理缓存来进行帧上传和检索,这加快了该操作系统版本上的处理速度。

我对此有一个警告,那就是我还没有把音频录制到我的电影编码中,但我现在正在处理这个问题。