2012-12-18 19 views
5

Sto lavorando a un progetto iOS che utilizza AV-Out per mostrare contenuti in una finestra 1280x720 su un secondo schermo.GPUImmagine video con trasparenza su UIView

Ho una vista di MPMoviePlayerController come sfondo e sopra altri diversi elementi come UIImages e UILabels. Il film di sottofondo viene riprodotto in loop.

Ora voglio sovrapporre l'intera vista includendo tutti gli elementi visibili con un'altra animazione a schermo intero che ha trasparenza in modo che siano visibili solo parti della vista sottostante.

Ho provato per la prima volta un'animazione PNG con UIImageView. Sono stato sorpreso di scoprire che funziona effettivamente su iPhone5, ma ovviamente le dimensioni dei png sono così grandi che questo utilizza troppa RAM e si blocca su tutto sotto iPhone4s. Quindi ho bisogno di un altro modo.

Ho scoperto come riprodurre un secondo film contemporaneamente utilizzando AVFoundation. Finora, tutto bene. Ora posso riprodurre il video overlay, ma ovviamente non è ancora trasparente.

Ho anche appreso che con la libreria GPUImage posso usare GPUImageChromaKeyBlendFilter per filtrare un colore da un video per renderlo trasparente e quindi combinarlo con un altro video.

Quello che non capisco ancora è il modo migliore per implementarlo nel mio caso per ottenere il risultato che voglio.

Posso utilizzare l'intera gerarchia di viste sotto il video in alto come primo input per lo GPUImageChromaKeyBlendFilter e un video in stile greenscreen come secondo input e mostrare il risultato live in 720p? Come potrei farlo?

O sarebbe meglio usare GPUImageChromaKeyFilter e solo filtrare il video in stile greenscreen e riprodurlo in una vista sopra tutte le altre viste? Lo sfondo di questo video sarebbe trasparente allora?

Grazie per il vostro aiuto!

risposta

3

È necessario creare un lettore personalizzato utilizzando AVFoundation.framework e quindi utilizzare un video con canale alfa. Il framework AVFoundation consente una gestione dei video molto più solida senza molte limitazioni del framework MPMedia. Costruire un giocatore personalizzato non è così difficile come le persone lo dimostrano. Ho scritto un tutorial su di esso qui: http://www.sdkboy.com/?p=66

ALTRO MODO ..........

L'esempio SimpleVideoFileFilter nel quadro mostra come caricare un film, filtrare, e codificare torna al disco. La modifica di questa per eseguire chroma keying ha pronunciato la seguente:

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

Il codice qui sopra caricare un filmato con le risorse del applicazione chiamata sample.m4v, dargli da mangiare in un filtro chroma key che è impostato a chiave fuori del blu puro con una sensibilità di 0,4, allegare un'immagine di sfondo da utilizzare per la chroma keying, quindi inviare tutto ciò a un codificatore di film che scrive Movie.m4v nella directory dell'applicazione/Documenti.

È possibile regolare la soglia e la tinta blu specifica in base alle proprie esigenze, nonché sostituire l'immagine di input con un altro film o altra fonte, se necessario. Questo processo può anche essere applicato al video in diretta dalla videocamera del dispositivo iOS e puoi visualizzare i risultati sullo schermo se lo desideri.

Su un iPhone 4 con iOS 5.0 in esecuzione, la chroma keying richiede 1,8 ms (500+ FPS) per i frame 640x480 di video, 65 ms per i frame 720p (15 FPS). I nuovi dispositivi basati su A5 sono 6-10 volte più veloci di quelli per queste operazioni, quindi sono in grado di gestire video a 1080p senza problemi. Uso le cache di texture veloce di iOS 5.0 per caricare e recuperare i frame, accelerando l'elaborazione su quella versione del sistema operativo oltre 4.x.

L'unica avvertenza che ho su questo è che non ho ancora ottenuto l'audio per registrare direttamente nella codifica del mio film, ma ci sto lavorando proprio ora.

0

L'esempio SimpleVideoFileFilter nel framework mostra come caricare un filmato, filtrarlo e ricodificarlo su disco. La modifica di questa per eseguire chroma keying ha pronunciato la seguente:

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

Il codice qui sopra caricare un filmato con le risorse del applicazione chiamata sample.m4v, dargli da mangiare in un filtro chroma key che è impostato a chiave fuori del blu puro con una sensibilità di 0,4, allegare un'immagine di sfondo da utilizzare per la chroma keying, quindi inviare tutto ciò a un codificatore di film che scrive Movie.m4v nella directory dell'applicazione/Documenti.

È possibile regolare la soglia e la tinta blu specifica in base alle proprie esigenze, nonché sostituire l'immagine di input con un altro film o altra fonte, se necessario. Questo processo può anche essere applicato al video in diretta dalla videocamera del dispositivo iOS e, se lo desideri, puoi visualizzare i risultati sullo schermo.

Su un iPhone 4 con iOS 5.0 in esecuzione, la chroma keying richiede 1,8 ms (500+ FPS) per i frame 640x480 di video, 65 ms per i frame 720p (15 FPS). I nuovi dispositivi basati su A5 sono 6-10 volte più veloci di quelli per queste operazioni, quindi sono in grado di gestire video a 1080p senza problemi. Uso le cache di texture veloce di iOS 5.0 per caricare e recuperare i frame, accelerando l'elaborazione su quella versione del sistema operativo oltre 4.x.

L'unica avvertenza che ho su questo è che non ho ancora ottenuto l'audio per registrare direttamente nella codifica del mio film, ma ci sto lavorando proprio ora.