2012-09-17 62 views
3

我正在嘗試使用透明鍵(RGB: 0x00FF00或全綠色)在我的應用程序內使用@ BradLarson的真棒GPUImage工具包顯示透明視頻文件。不過,我在使用GPUImageChromaKeyFilter過濾器時遇到了一些困難,我不太明白爲什麼。使用GPUImage色度過濾視頻?

我的源視頻文件可以在我的Dropbox here(12 KB 3秒長,充滿綠色的背景,只是在屏幕上多),

而且我用標題SimpleVideoFilter示例項目。

這是我嘗試使用的代碼(我簡單地更換-viewDidLoad):

NSURL *sampleURL = [[NSBundle mainBundle] URLForResource:@"sample" withExtension:@"m4v"]; 
movieFile = [[GPUImageMovie alloc] initWithURL:sampleURL]; 

filter = [[GPUImageChromaKeyFilter alloc] init]; 
[filter setColorToReplaceRed:0 green:1 blue:0]; 
[filter setEnabled:YES]; 

[movieFile addTarget:filter]; 

GPUImageView *filterView = (GPUImageView *)self.view; 
[filter addTarget:filterView]; 

[movieFile startProcessing]; 

根據該文件(這是稀疏的),這應該有替換所有綠色的效果視頻。相反,我得到這個作爲輸出:

Screenshot of video

告訴我,在播放視頻時(因此它複製到應用程序),但它似乎並沒有做任何色度鍵。爲什麼會這樣?我是否需要手動設置平滑值&閾值?我不應該,因爲源只包含兩種顏色(0x00FF000x000000)。

我已經在設備上測試過了,無濟於事。幾乎所有其他我嘗試使用的工作篩選器,如GPUImageRGBFilter,GPUImageSepiaFilter等。難道GPUImageChromaKeyFilter只是被打破?

任何幫助,這將不勝感激,因爲在這一點上,我颳了視頻的透明度桶的底部。

+0

@BradLarson我很想看到你的一些輸入。 –

+0

嗨,理查德,你是否設法解決這個問題?你會發布代碼嗎?謝謝:D –

+0

nope;沒有解決它(我希望@BradLarson可以來這裏回答自己,但可惜情況並非如此 –

回答

1

我通過使用GPUImageChromaKeyBlendFilter並設置了一個背景圖片來實現它。我想知道,但是如果我們能夠做到而不必設置背景。當我不設置背景,影片顯示爲白色,但添加了背景渲染罰款...

filter = [[GPUImageChromaKeyBlendFilter alloc] init]; 
[(GPUImageChromaKeyBlendFilter *)filter setColorToReplaceRed:0.0 green:1.0 blue:0.0]; 
[(GPUImageChromaKeyBlendFilter *)filter setThresholdSensitivity:0.4]; 

UIImage *inputImage = [UIImage imageNamed:@"background.png"]; 
sourcePicture = [[GPUImagePicture alloc] initWithImage:inputImage smoothlyScaleOutput:YES]; 
[sourcePicture addTarget:filter]; 
[sourcePicture processImage]; 
+0

那麼'background.png'是一張透明圖片還是超級圖片的圖片? –

+0

我剛測試過一張透明圖片:http://imgur.com/jWaOW。做**我需要它**絕對**必須是透明的視頻背景,不幸的是 –

+0

這實際上只是一個普通的圖像,這裏是我用過的項目:http://ge.tt/ 29kBY5R –

8

原來的問題相似,我希望把一個綠屏視頻上的頂自定義視圖層次結構。實況視頻。原來,這是標準GPUImage ChromaKey過濾器無法實現的。它將混合綠色像素和背景像素,而不是alpha混合。例如,紅色背景變成黃色,藍色變成青色。

得到它的工作方式包括兩個步驟:

1)確保filterview具有透明背景:

filterView.backgroundColor=[UIColor clearColor]; 

2)修改GPUImageChromaKeyFilter.m

old: gl_FragColor = vec4(textureColor.rgb, textureColor.a * blendValue); 
new: gl_FragColor = vec4(textureColor.rgb * blendValue, 1.0 * blendValue); 

現在視頻中的所有鍵控(例如綠色)像素都變爲透明並發現過濾器視圖下的所有內容,包括(在線 - )視頻。

+1

這實際上與我最終做的非常相似,但是我最終改變了OpenGL層並編寫了一個自定義過濾器。 +1 –