透明视频iPhone

时间:2012-03-15 10:05:01

标签: iphone ios video

我有一段录制在蓝屏上的视频。

有没有办法让它在iOS设备上透明?我知道我可以用像素着色器和openGL来做到这一点,但我担心解码视频帧/上传openGL纹理并用像素着色器消除碎片的过程会太慢。

有什么建议吗?

2 个答案:

答案 0 :(得分:3)

听起来你想用你的视频进行某种色度键控。我刚刚将这个功能添加到我的GPUImage框架中,正如名称所示,使用基于GPU的处理来执行这些操作的速度比CPU绑定的过滤器快许多倍。

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

我对此的一个警告是,我的电影编码中没有完全记录音频,但我现在正在研究它。

答案 1 :(得分:2)

如果您想渲染视频,但将蓝色像素设置为透明,那么使用OpenGL的唯一有效方法就是这样做。对于iOS设备来说这很容易实现,视频解码在硬件中处理,我有几个项目,我使用glTexSubImage2D将视频帧传输到OpenGL,工作正常。