2012-12-18 5 views
5

Je travaille sur un projet iOS qui utilise AV-Out pour afficher le contenu d'une fenêtre 1280x720 sur un deuxième écran.GPUImage Vidéo avec transparence sur UIView

J'ai une vue de MPMoviePlayerController en arrière-plan et en plus de ces différents autres éléments comme UIImages et UILabels. Le film d'arrière-plan est lu en boucle.

Maintenant, je veux superposer l'ensemble de la vue, y compris tous les éléments visibles avec une autre animation en plein écran qui a la transparence de sorte que seules les parties de la vue sous-jacente sont visibles. J'ai d'abord essayé une animation png avec UIImageView. J'ai été surpris de constater que cela fonctionne réellement sur iPhone5, mais bien sûr, les png sont si gros en taille que cela utilise beaucoup trop ram et il se bloque sur tout en dessous de iPhone4s. J'ai donc besoin d'un autre moyen.

J'ai compris comment lire un deuxième film en même temps en utilisant AVFoundation. Jusqu'ici, tout va bien. Maintenant, je peux jouer la vidéo de superposition, mais bien sûr, il n'est pas encore transparent.

J'ai également appris qu'avec la bibliothèque GPUImage je peux utiliser GPUImageChromaKeyBlendFilter pour filtrer une couleur d'une vidéo pour la rendre transparente, puis la combiner avec une autre vidéo. Ce que je ne comprends pas encore est la meilleure façon de l'implémenter dans mon cas pour obtenir le résultat que je veux. Puis-je utiliser toute la hiérarchie de vue sous la vidéo supérieure comme première entrée pour le GPUImageChromaKeyBlendFilter et une vidéo de style vert comme seconde entrée et afficher le résultat en direct en 720p? comment ferais-je ça?

Ou serait-il préférable d'utiliser GPUImageChromaKeyFilter et juste filtrer la vidéo de style vert, et le jouer dans une vue au-dessus de toutes les autres vues? L'arrière-plan de cette vidéo serait-il transparent alors?

Merci pour votre aide!

Répondre

3

Vous devrez créer un lecteur personnalisé en utilisant AVFoundation.framework, puis utiliser une vidéo avec un canal alpha. Le framework AVFoundation permet une manipulation beaucoup plus robuste de la vidéo sans beaucoup de limitations du framework MPMedia. Construire un lecteur personnalisé n'est pas aussi difficile que les gens le font croire. J'ai écrit un tutoriel sur le sujet ici: http://www.sdkboy.com/?p=66

AILLEURS ..........

L'exemple SimpleVideoFileFilter dans le cadre montre comment charger un film, filtrer, et encode retour au disque La modification de ce pour effectuer chroma keying donne les éléments suivants:

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

Le code ci-dessus charger un film à partir des ressources de l'application appelée sample.m4v, introduire dans un filtre clé chroma qui est mis à la clé hors de bleu pur avec une sensibilité de 0,4, attachez une image d'arrière-plan à utiliser pour l'incrustation chroma, puis envoyez tout cela à un encodeur de film qui écrit Movie.m4v dans le répertoire/Documents de l'application.

Vous pouvez régler le seuil et la teinte bleue spécifique en fonction de vos besoins, ainsi que remplacer l'image d'entrée par un autre film ou une autre source si nécessaire. Ce processus peut également être appliqué à la vidéo en direct à partir de la caméra de l'appareil iOS, et vous pouvez afficher les résultats à l'écran si vous le souhaitez.Sur un iPhone 4 fonctionnant sous iOS 5.0, le chroma keying prend 1,8 ms (500+ FPS) pour les trames 640x480, 65 ms pour les trames 720p (15 FPS). Les nouveaux appareils basés sur A5 sont 6 à 10 fois plus rapides que ceux de ces opérations, ce qui leur permet de gérer des vidéos 1080p sans faire de vagues. J'utilise les caches de texture rapides d'iOS 5.0 pour les téléchargements de trames et les récupérations, ce qui accélère le traitement sur cette version du système d'exploitation sur 4.x.

La seule mise en garde que j'ai à ce sujet est que je ne l'ai pas tout à fait obtenu l'audio pour enregistrer directement dans mon encodage de film, mais je travaille en ce moment.

0

L'exemple SimpleVideoFileFilter dans le cadre montre comment charger un film, filtre, et l'encoder sur le disque. La modification de ce pour effectuer chroma keying donne les éléments suivants:

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

Le code ci-dessus charger un film à partir des ressources de l'application appelée sample.m4v, introduire dans un filtre clé chroma qui est mis à la clé hors de bleu pur avec une sensibilité de 0,4, attachez une image d'arrière-plan à utiliser pour l'incrustation chroma, puis envoyez tout cela à un encodeur de film qui écrit Movie.m4v dans le répertoire/Documents de l'application.

Vous pouvez régler le seuil et la teinte bleue spécifique en fonction de vos besoins, ainsi que remplacer l'image d'entrée par un autre film ou une autre source si nécessaire. Ce processus peut également être appliqué à la vidéo en direct à partir de la caméra de l'appareil iOS, et vous pouvez afficher les résultats à l'écran si vous le souhaitez. Sur un iPhone 4 fonctionnant sous iOS 5.0, le chroma keying prend 1,8 ms (500+ FPS) pour les trames 640x480, 65 ms pour les trames 720p (15 FPS). Les nouveaux appareils basés sur A5 sont 6 à 10 fois plus rapides que ceux de ces opérations, ce qui leur permet de gérer des vidéos 1080p sans faire de vagues. J'utilise les caches de texture rapides d'iOS 5.0 pour les téléchargements de trames et les récupérations, ce qui accélère le traitement sur cette version du système d'exploitation sur 4.x.

La seule mise en garde que j'ai à ce sujet est que je ne l'ai pas tout à fait obtenu l'audio pour enregistrer directement dans mon encodage de film, mais je travaille en ce moment.