2012-12-18 17 views
5

Ich arbeite an einem iOS-Projekt, das AV-Out verwendet, um Inhalte in einem 1280x720-Fenster auf einem zweiten Bildschirm anzuzeigen.GPUImage Video mit Transparenz über UIView

Ich habe eine MPMoviePlayerController 's Ansicht als Hintergrund und darüber verschiedene andere Elemente wie UIImages und UILabels. Der Hintergrundfilm wird in einer Schleife abgespielt.

Jetzt möchte ich die gesamte Ansicht einschließlich aller sichtbaren Elemente mit einer anderen Vollbild-Animation überlagern, die transparent ist, so dass nur Teile der darunterliegenden Ansicht sichtbar sind.

Ich versuchte zuerst eine PNG-Animation mit UIImageView. Ich war überrascht zu finden, dass tatsächlich auf iPhone5 funktioniert, aber natürlich sind die PNGs so groß, dass dies viel zu viel Ram verwendet und es stürzt auf alles unter iPhone4s. Also ich brauche einen anderen Weg.

Ich habe herausgefunden, wie man einen zweiten Film gleichzeitig mit AVFoundation spielt. So weit, so gut. Jetzt kann ich das Overlay-Video abspielen, aber natürlich ist es noch nicht transparent.

Ich habe auch gelernt, dass mit der GPUImage Bibliothek kann ich GPUImageChromaKeyBlendFilter verwenden, um eine Farbe aus einem Video zu filtern, um es transparent zu machen und dann mit einem anderen Video zu kombinieren.

Was ich noch nicht verstehe, ist der beste Weg, es in meinem Fall zu implementieren, um das Ergebnis zu erhalten, das ich will.

Kann ich die gesamte Ansichtshierarchie unter dem oberen Video als erste Eingabe für das GPUImageChromaKeyBlendFilter und ein Greenscreen-Video als zweite Eingabe verwenden und das Ergebnis live in 720p anzeigen? Wie würde ich das tun?

Oder wäre es besser, GPUImageChromaKeyFilter zu verwenden und einfach das Greenscreen-Video zu filtern und es in einer Ansicht über allen anderen Ansichten abzuspielen? Wäre der Hintergrund dieses Videos dann transparent?

Danke für Ihre Hilfe!

Antwort

3

Sie müssen einen benutzerdefinierten Player mit AVFoundation.framework erstellen und dann ein Video mit Alphakanal verwenden. Das AVFoundation-Framework ermöglicht eine wesentlich robustere Videoverarbeitung ohne die Einschränkungen des MPMedia-Frameworks. Einen eigenen Spieler zu erstellen, ist nicht so schwer, wie die Leute es schaffen. Ich habe hier auf es ein Tutorial geschrieben: http://www.sdkboy.com/?p=66

ANDERE WEISE ..........

Das SimpleVideoFileFilter Beispiel im Rahmen zeigt, wie ein Film zu laden, filtern, und kodieren es zurück auf die Festplatte. Ändern dieses Chroma-Keying auszuführen gibt folgendes:

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

Der obige Code einen Film aus den Ressourcen der Anwendung geladen wird genannt sample.m4v, stellt es mit einem Chroma-Key-Filter, der gesetzt ist aus reinem Blau Schlüssel mit Wählen Sie eine Empfindlichkeit von 0,4, hängen Sie ein Hintergrundbild an, das für die Chroma-Keying-Funktion verwendet werden soll, und senden Sie dann alles an einen Film-Encoder, der Movie.m4v in das Verzeichnis/Documents der Anwendung schreibt.

Sie können den Schwellenwert und den spezifischen Blauton an Ihre Anforderungen anpassen und das Eingabebild je nach Bedarf durch einen anderen Film oder eine andere Quelle ersetzen. Dieser Vorgang kann auch auf Live-Videos von der Kamera des iOS-Geräts angewendet werden, und Sie können die Ergebnisse auf dem Bildschirm anzeigen, wenn Sie möchten.

Auf einem iPhone 4 mit iOS 5.0 dauert die Chroma Keying-Funktion 1,8 ms (500 + FPS) für 640x480 Frames, 65 ms für 720p Frames (15 FPS). Die neueren A5-basierten Geräte sind 6-10x schneller als die für diese Operationen, so dass sie 1080p-Video verarbeiten können, ohne ins Schwitzen zu geraten. Ich benutze die schnellen Textur-Caches von iOS 5.0 sowohl für Frame-Uploads als auch für Retrieval-Aufrufe, was die Verarbeitung in dieser OS-Version über 4.x beschleunigt.

Die eine Warnung, die ich darüber habe, ist, dass ich den Ton nicht richtig in meiner Filmkodierung aufgenommen habe, aber ich arbeite gerade daran.

0

Das SimpleVideoFileFilter-Beispiel im Framework zeigt, wie ein Film geladen, gefiltert und auf Festplatte zurückverschlüsselt wird. Ändern dieses Chroma-Keying auszuführen gibt folgendes:

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

Der obige Code einen Film aus den Ressourcen der Anwendung geladen wird genannt sample.m4v, stellt es mit einem Chroma-Key-Filter, der gesetzt ist aus reinem Blau Schlüssel mit Wählen Sie eine Empfindlichkeit von 0,4, hängen Sie ein Hintergrundbild an, das für die Chroma-Keying-Funktion verwendet werden soll, und senden Sie dann alles an einen Film-Encoder, der Movie.m4v in das Verzeichnis/Documents der Anwendung schreibt.

Sie können den Schwellenwert und den spezifischen Blauton an Ihre Anforderungen anpassen und das Eingabebild je nach Bedarf durch einen anderen Film oder eine andere Quelle ersetzen. Dieser Vorgang kann auch auf Live-Videos von der Kamera des iOS-Geräts angewendet werden, und Sie können die Ergebnisse auf dem Bildschirm anzeigen, wenn Sie möchten.

Auf einem iPhone 4 mit iOS 5.0 dauert die Chroma Keying-Funktion 1,8 ms (500 + FPS) für 640x480 Frames, 65 ms für 720p Frames (15 FPS). Die neueren A5-basierten Geräte sind 6-10x schneller als die für diese Operationen, so dass sie 1080p-Video verarbeiten können, ohne ins Schwitzen zu geraten. Ich benutze die schnellen Textur-Caches von iOS 5.0 sowohl für Frame-Uploads als auch für Retrieval-Aufrufe, was die Verarbeitung in dieser OS-Version über 4.x beschleunigt.

Die eine Warnung, die ich darüber habe, ist, dass ich den Ton nicht richtig in meiner Filmkodierung aufgenommen habe, aber ich arbeite gerade daran.