我有一段录制在蓝屏上的视频。
有没有办法让它在iOS设备上透明?我知道我可以用像素着色器和openGL来做到这一点,但我担心解码视频帧/上传openGL纹理并用像素着色器消除碎片的过程会太慢。
有什么建议吗?
答案 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,工作正常。