2015-10-20 53 views
2

我有一個純綠色背景的視頻,我試圖用GPUImageChromaKeyFilter透明。使用GPUImageChromaKeyFilter的視頻在透明GPUImageView中播放時具有色調?

當我有清晰的彩色玩家視圖,其結果是,該視頻是不是真的透明的,但色調背景:

Tint on clear

當我改變背景爲白色,綠色背景走了,但很明顯的觀點是不透明的:

No tint on white

我在做什麼錯?

我的代碼是:

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

我能得到它GPUImageChromaKeyFilter工作,它看起來像你只需要調用setThresholdSensitivity除了setColorToReplaceRed和單一調用設置的backgroundColor道具。不需要使用更復雜的GPUImageChromaKeyBlendFilter,需要2個輸入。 – MoDJ

回答

3

我得到了這個工作。解決方案是使用GPUImageChromaKey Blend過濾器。 它通過將第一個源中的setColorToReplaceRed中指定的顏色的像素替換爲第二個源中的像素來混合兩個源。

所以我做了一個透明UIImage的GPUImagePicture,並添加了過濾器作爲目標。你可以使用透明的PNG或建立一個UIImage並用代碼透明填充(空UIImage不起作用!)

現在一切都很好用!

Working!

的代碼是

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() 
+0

我不得不製作'filter','movieFile','sourcePicture'類屬性來避免崩潰。 –

+0

不需要使它們成爲類屬性,但必須在某個地方對它們進行強有力的引用,以便在您聲明它們的範圍退出時不會釋放它們。 –