2012-12-18 135 views
5

我正在使用AV-Out在第二個屏幕上的1280x720窗口中顯示內容的iOS項目。具有UIView透明度的GPUImage視頻

我有一個MPMoviePlayerController作爲背景的視圖,以及不同的其他元素,如UIImagesUILabels。 背景電影循環播放。

現在我想覆蓋整個視圖,包括所有可見元素與另一個具有透明度的全屏動畫,以便只有部分底層視圖可見。

我第一次嘗試PNG動畫UIImageView。 我很驚訝地發現,實際上iPhone5的作品,但當然,巴新的規模如此之大,這使用太多的內存和它在iPhone4s以下的一切崩潰。 所以我需要另一種方式。

我想出瞭如何使用AVFoundation同時播放第二部電影。 到目前爲止,這麼好。現在我可以播放疊加視頻,但當然它不是透明的。

我還了解到,通過使用GPUImage庫,我可以使用GPUImageChromaKeyBlendFilter過濾視頻中的某種顏色使其透明,然後將其與另一個視頻合併。

我不明白的是最好的方式來實現它在我的情況下得到我想要的結果。

我可以使用頂部視頻下方的整個視圖層次作爲GPUImageChromaKeyBlendFilter的第一個輸入和作爲第二個輸入的綠屏風格視頻,並以720p顯示結果?我會怎麼做?

或者是更好地使用GPUImageChromaKeyFilter,只是過濾綠屏風格的視頻,並在視圖中播放它高於所有其他視圖?那麼這個視頻的背景會是透明的嗎?

感謝您的幫助!

回答

3

您需要使用AVFoundation.framework構建自定義播放器,然後使用帶有Alpha通道的視頻。 AVFoundation框架允許更多強大的視頻處理,而沒有MPMedia框架的許多限制。建立一個自定義的玩家並不像人們想象的那樣困難。我已經寫在這裏就可以了教程:http://www.sdkboy.com/?p=66

其他辦法..........

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

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

0

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

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