我有一个绿色背景的视频,我试图通过GPUImageChromaKeyFilter透明化。
当我为播放器视图设置了清晰的颜色时,结果是视频不是真正透明,而是为背景着色:
当我将背景更改为白色时,绿色背景消失了,但显然视图不透明:
我做错了什么?
我的代码是:
let movie = GPUImageMovie(URL: url)
let filter = GPUImageChromaKeyFilter()
filter.setColorToReplaceRed(0, green: 1, blue: 0)
movie.addTarget(filter)
let playerView = GPUImageView()
playerView.backgroundColor = UIColor.clearColor()
playerView.setBackgroundColorRed(0, green: 0, blue: 0, alpha: 0)
let trinity = (movieFile, filter, playerView)
filter.addTarget(playerView)
movie.startProcessing()
我正在存储电影,过滤器和视图,以避免在退出示波器时ARC释放它们,我将视图添加到正确的超视图并使用自动布局定位。
我正在使用的视频是h264视频 - https://dl.dropboxusercontent.com/u/1400954/Coin.mp4
答案 0 :(得分:3)
我得到了这个工作。解决方案是使用GPUImageChromaKey Blend 过滤器。 它通过将第一个源中setColorToReplaceRed中指定颜色的像素替换为第二个源中的像素来混合两个源。
所以我用透明的UIImage创建了一个GPUImagePicture,并将过滤器添加为目标。您可以使用透明的PNG或构建UIImage并使用透明的代码填充它(空的UIImage将无效!)
现在一切都很美妙!
代码是
let filter = GPUImageChromaKeyBlendFilter()
filter.setColorToReplaceRed(0, green: 1, blue: 0)
let movieFile = GPUImageMovie(URL: url)
movieFile.addTarget(filter)
let backgroundImage = UIImage(named: "MTransparent")
let sourcePicture = GPUImagePicture(image: backgroundImage, smoothlyScaleOutput: true)
sourcePicture.addTarget(filter)
sourcePicture.processImage()
let playerView = GPUImageView()
playerView.backgroundColor = UIColor.clearColor()
filter.addTarget(playerView)
movieFile.startProcessing()