2012-12-18 12 views
5

Pracuję nad projektem iOS, który używa AV-Out do wyświetlania zawartości w oknie 1280x720 na drugim ekranie.GPU Obraz wideo z przezroczystością przez UIView

Mam widok MPMoviePlayerController jako tło i nad innymi różnymi elementami, takimi jak UIImages i UILabels. Film tła odtwarzany jest w pętli.

Teraz chcę nałożyć cały widok, w tym wszystkie widoczne elementy, na inną animację pełnoekranową z przezroczystością, tak aby widoczne były tylko części podstawowego widoku.

Najpierw wypróbowałem animację png z UIImageView. Zaskoczyło mnie, że faktycznie działa na iPhone5, ale oczywiście pngs są tak duże, że używa to zbyt wiele pamięci RAM i rozbija się na wszystko poniżej iPhone4s. Potrzebuję więc innej drogi.

Wymyśliłem, jak odtworzyć drugi film w tym samym czasie przy użyciu AVFoundation. Jak dotąd, tak dobrze. Teraz mogę odtworzyć wideo nakładki, ale oczywiście nie jest jeszcze trasparent.

Dowiedziałem się również, że z biblioteką GPUImage mogę użyć GPUImageChromaKeyBlendFilter, aby odfiltrować kolor z filmu, aby stał się przezroczysty, a następnie połączyć go z innym filmem.

Czego jeszcze nie rozumiem, to najlepszy sposób na wdrożenie go w moim przypadku, aby uzyskać pożądany rezultat.

Czy mogę użyć całej hierarchii widoku pod górnym wideo jako pierwszego wejścia dla GPUImageChromaKeyBlendFilter i wideo w stylu greenscreen jako drugie wejście i pokazać wynik na żywo w 720p? jak mógłbym to zrobić?

A może lepiej będzie użyć numeru GPUImageChromaKeyFilter i odfiltrować wideo w stylu greenscreen i odtworzyć je w widoku ponad wszystkie inne widoki? Czy tło tego filmu będzie wtedy przezroczyste?

Dzięki za pomoc!

Odpowiedz

3

Musisz zbudować niestandardowego odtwarzacza za pomocą AVFoundation.framework, a następnie użyć wideo z kanałem alfa. Struktura AVFoundation pozwala na znacznie solidniejsze przenoszenie wideo bez wielu ograniczeń związanych z frameworkiem MPMedia. Budowanie niestandardowego gracza nie jest tak trudne, jak ludzie to robią. Pisałem tutorial tutaj: http://www.sdkboy.com/?p=66

INNY SPOSÓB ..........

Przykład SimpleVideoFileFilter w ramach pokazuje jak załadować film, filtrować ją i kodować wraca na dysk. Modyfikacja tego wykonać kluczowanie chrominancji daje następujące:

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]; 
}]; 

Powyższy kod załaduje film z zasobów aplikacji zwanych sample.m4v, karmić go w filtrze chroma key, który jest ustawiony na OFF czystego błękitu z Czułość 0,4, załączyć obraz tła do użycia dla kluczowania chrominancji, a następnie wysłać go do kodera filmowego, który zapisuje Movie.m4v w katalogu aplikacji/dokumentów.

Można dostosować próg i określony niebieski odcień w celu dopasowania do swoich potrzeb, a także w razie potrzeby zastąpić obraz wejściowy innym filmem lub innym źródłem. Ten proces można również zastosować do wideo na żywo z kamery urządzenia iOS i możesz wyświetlić wyniki na ekranie, jeśli chcesz.

Na iPhonie 4 z systemem iOS 5.0 kluczowanie w kolorze chromowym trwa 1,8 ms (500+ klatek na sekundę) w przypadku klatek wideo 640 x 480, 65 ms w przypadku ramek 720p (15 klatek na sekundę). Nowsze urządzenia oparte na A5 są 6-10 razy szybsze niż te w tych operacjach, dzięki czemu mogą poradzić sobie z wideo 1080p bez przerywania potu. Korzystam z pamięci podręcznych szybkiego tekstury dla iOS 5.0 zarówno dla wysyłania klatek, jak i pobierania, co przyspiesza przetwarzanie w tej wersji systemu operacyjnego ponad 4.x.

Jedyną ostrożnością, którą mam na ten temat, jest to, że nie udało mi się nagrać dźwięku w moim kodowaniu, ale teraz nad tym pracuję.

0

Przykład SimpleVideoFileFilter w ramce pokazuje, jak załadować film, przefiltrować go i zakodować z powrotem na dysk. Modyfikacja tego wykonać kluczowanie chrominancji daje następujące:

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]; 
}]; 

Powyższy kod załaduje film z zasobów aplikacji zwanych sample.m4v, karmić go w filtrze chroma key, który jest ustawiony na OFF czystego błękitu z Czułość 0,4, załączyć obraz tła do użycia dla kluczowania chrominancji, a następnie wysłać go do kodera filmowego, który zapisuje Movie.m4v w katalogu aplikacji/dokumentów.

Można dostosować próg i określony niebieski odcień w celu dopasowania do swoich potrzeb, a także w razie potrzeby zastąpić obraz wejściowy innym filmem lub innym źródłem. Ten proces można również zastosować do wideo na żywo z kamery urządzenia iOS i możesz wyświetlić wyniki na ekranie, jeśli chcesz.

Na iPhonie 4 z systemem iOS 5.0 kluczowanie w kolorze chromowym trwa 1,8 ms (500+ klatek na sekundę) w przypadku klatek wideo 640 x 480, 65 ms w przypadku ramek 720p (15 klatek na sekundę). Nowsze urządzenia oparte na A5 są 6-10 razy szybsze niż te w tych operacjach, dzięki czemu mogą poradzić sobie z wideo 1080p bez przerywania potu. Korzystam z pamięci podręcznych szybkiego tekstury dla iOS 5.0 zarówno dla wysyłania klatek, jak i pobierania, co przyspiesza przetwarzanie w tej wersji systemu operacyjnego ponad 4.x.

Jedyną ostrożnością, którą mam na ten temat, jest to, że nie udało mi się nagrać dźwięku w moim kodowaniu, ale teraz nad tym pracuję.

Powiązane problemy