2012-03-15 98 views
2

我有一個視頻錄製在藍色屏幕上。透明視頻iPhone

有沒有辦法讓它在iOS設備上透明?我知道我可以用像素着色器和OpenGL來做,但是恐怕解碼視頻幀/上傳OpenGL紋理和消除像素着色器碎片的過程將會太慢。

有什麼建議嗎?

+1

請密切投票者解釋投票嗎? – 2012-03-15 10:36:28

+0

投票結束這個問題可能是因爲這兩個副本:http://stackoverflow.com/questions/4796626/iphone-display-a-semi-transparent-video-on-top-of-a-uiview, http://stackoverflow.com/questions/1401517/iphone-sdk-how-to-play-a-video-with-transparency。但重複是舊的(2和1年),所以這裏可能有新的東西。 – 2012-03-15 11:36:03

+0

你正在嘗試做比你需要的更多的工作。使用現有桌面視頻軟件包處理視頻,以刪除藍屏並生成帶有Alpha通道的視頻。然後,你有2個選項用於帶有Alpha通道的視頻。你可以使用一個支持alpha通道的庫(AVAnimator,Bink,你可以找到其他的),或者你可以按照這個問題描述的方式編碼2通道h.264 http://stackoverflow.com/questions/10815805/mpeg-4-和-α-透明度 - 正在進行的傳奇#答案-17072503 – MoDJ 2013-06-25 20:27:19

回答

2

如果你的意思是你想渲染視頻,但將藍色像素設置爲透明,那麼唯一有效的方法就是使用OpenGL。這對於iOS設備應該很容易實現,視頻解碼在硬件中處理,並且我有幾個項目,我使用glTexSubImage2D將視頻幀傳輸到OpenGL,工作正常。

+0

是的,看起來像openGL是唯一的方法來做到這一點,但我不知道如何獲得源像素上傳我的紋理,對此有什麼建議嗎? – 2012-03-16 16:59:30

+0

檢查2010年的WWDC示例代碼,有一個名爲GLVideoFrame的示例項目。否則檢查SquareCam示例項目,它會完成大部分工作。基本上你只需要使用'CVPixelBufferGetBaseAddress'獲得一個指向像素數據的指針。 – Tark 2012-03-20 10:26:02

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,附加背景圖像用於色度鍵控,然後將所有內容發送到電影編碼器,該編碼器在應用程序的/Documents目錄中寫入Movie.m4v

您可以根據需要調整閾值和特定藍色色調,並根據需要將輸入圖像替換爲其他電影或其他來源。這個過程也可以應用於iOS設備攝像頭的實時視頻,如果需要,您可以將結果顯示在屏幕上。

在運行iOS 5.0的iPhone 4上,色度鍵控對於640x480幀視頻需要1.8 ms(500+ FPS),對於720p幀(15 FPS)需要65 ms。較新的基於A5的設備比這些操作的速度快6-10倍,因此他們可以在不打破汗水的情況下處理1080p視頻。我使用iOS 5.0的快速紋理緩存來進行幀上傳和檢索,這加快了該操作系統版本上的處理速度。

我對此有一個警告,那就是我還沒有把音頻錄製到我的電影編碼中,但我現在正在處理這個問題。

+0

嗨布拉德 - 偉大的圖書館!你能讓音頻工作嗎?謝謝! – ewindsor 2012-07-19 22:35:40

+0

@ewindsor - 是的,大部分。在實時視頻中,有時音頻會在視頻結尾附近停頓幾秒鐘,但對於預先錄製的視頻,它應該可以正常工作。 – 2012-07-19 22:41:51

+0

太棒了!謝啦。我打算把這個代碼,並嘗試一下:) – ewindsor 2012-07-19 23:00:32