2013-08-10 5 views
6

Sto effettuando la cattura dello schermo con AVCaptureScreenInput. L'app ha una finestra con le opzioni di configurazione.AVCaptureScreenInput e kCGWindowListOptionOnScreenBelowWindow

Desidero registrare lo schermo ma non registrare la finestra nell'applicazione del registratore. Quicktime lo fa se si esegue una registrazione dello schermo, ad esempio.

Penso di aver trovato quello che lo farà, ma non sono sicuro di come o se possano essere usati insieme.

kCGWindowListOptionOnScreenBelowWindow si trova in CGWindow.h nel framework Core Graphics. AVCaptureScreenInput è parte di AVCaptureInput.h nel framework AVFoundation.

Se si sta scattando una singola schermata, è possibile passare a kCGWindowListOptionOnScreenBelowWindow e a windowID in modo che vengano catturate solo le finestre al di sotto del livello di quella finestra. Posso raggiungere il mio obiettivo impostando la finestra dell'app di acquisizione su un livello molto alto se funziona.

Sono relativamente nuovo a Objective-c e non mi è chiaro se è possibile utilizzare kCGWindowListOptionOnScreenBelowWindow con AVCaptureScreenInput. Se lo è, qualcuno potrebbe fornire suggerimenti su come deve essere il codice risultante?

How to access the pixel buffer of an NSWindow in OSX?

+0

Devo implementare una funzione del genere se avete qualche idea su questo poi per favore ditemi anche grazie @Geuis – morroko

+0

@ iMac Non ho seguito questo progetto da agosto e non sono mai arrivato a implementarlo. Stavo aspettando il 10.9 per vedere se le nuove API avrebbero reso tutto più facile. Non ho ancora controllato di nuovo. – Geuis

+0

grazie per aver risposto è davvero una buona idea che controlli la tua registrazione da una finestra che è in desktop, ma in uscita di registrazione effettiva verrà mostrata invisibile. Non ho avuto alcuna idea ma sto ancora cercando – morroko

risposta

8

Per quanto ne so, non c'è modo di escludere le finestre specifiche da OS X display incorporato API di registrazione:

  • di AVFoundation AVCaptureScreenInput (10.7 e versioni successive)
  • Graphics Core CGDisplayStream (10.8+)

Entrambi i metodi sopra sembrano afferrare il contenuto dello schermo dopo compositing, quando l'output finale dello schermo è già stato composto insieme.
Quindi, escludendo la finestra di registrazione, è necessario utilizzare un'API che consente di comporre manualmente le finestre e successivamente aggiungere tali frame personalizzati a un AVAssetWriterInput.

Quartz Window Services consentono di scattare istantanee di finestre singole tramite CGWindowListCreateImage. Un buon esempio di progetto che mostra anche come comporre più scatti di finestre insieme è Son of Grab.

Dopo aver recuperato il colpo unito, è necessario aggiungerlo a un AVAssetWriterInput. AVFoundation fornisce una classe di convenienza per aggiungere buffer di pixel personalizzati a un film: AVAssetWriterInputPixelBufferAdaptor.

Soprattutto la parte AVFoundation potrebbe diventare molto frustrante e potresti incorrere in problemi di prestazioni in quanto è molto probabile che il compositing sia più lento del compositore integrato di OS X, ma nel complesso dovrebbe essere possibile ottenere ciò che desideri.

+0

Grazie weichsel.Sono arrivato praticamente alla stessa conclusione di usare CGWindowListCreateImage ma volevo essere sicuro prima di procedere. Grazie per i suggerimenti extra su AVAssetWriterInputPixelBufferAdaptor. Mi avrebbe preso un po 'di più per trovarlo. Conosci qualche metodo per vedere come viene implementato AVCaptureScreenInput? È un'idea valida pensare a sottoclassi e in qualche modo modificarlo per fare ciò di cui ho bisogno? – Geuis

+0

Non so cosa usi AVFoundation per registrare lo schermo. Ma probabilmente CGDisplayStream come livello inferiore e fornisce opzioni simili (cattura cursore, durata minima fotogramma, ...). Per ulteriori informazioni su CGDisplayStream, è possibile esaminare i commenti in CGDisplayStream.h (non sono ancora disponibili documenti reali). Anche questo potrebbe essere interessante - Una discussione sull'esclusione di NSWindows dagli screenshot: http://www.cocoabuilder.com/archive/cocoa/326518-turning-off-screen-shot-ability.html Non offre un soluzione valida però. –

+0

Non avevo visto CGDisplayStream. Daremo un'occhiata più approfondita a questo. Sì, mi sono imbattuto anche nella discussione NSWindows. Purtroppo, non funziona o non ero in grado di farlo funzionare. Grazie ancora per la risposta! – Geuis