2013-08-10 16 views
6

Robię zrzut ekranu z AVCaptureScreenInput. Aplikacja ma okno z opcjami konfiguracji.AVCaptureScreenInput i kCGWindowListOptionOnScreenBelowWindow

Chcę nagrać ekran, ale nie nagrać okna w aplikacji nagrywającej. Quicktime robi to, jeśli zrobisz nagranie ekranowe, jako przykład.

Myślę, że znalazłem, co to zrobi, ale nie jestem pewien, jak lub jeśli mogą być używane razem.

kCGWindowListOptionOnScreenBelowWindow znajduje się w CGWindow.h w środowisku Core Graphics. AVCaptureScreenInput jest częścią AVCaptureInput.h w ramach AVFoundation.

Jeśli robisz jeden zrzut ekranu, możesz przekazać wartości kCGWindowListOptionOnScreenBelowWindow i windowID, aby przechwycić tylko okna poniżej tego poziomu okna. Mogę osiągnąć mój cel, ustawiając okno aplikacji przechwytywania na bardzo wysoki poziom, jeśli to działa.

Jestem względnie nowy w stosunku do Objective-c i nie jest dla mnie jasne, czy możliwe jest użycie kCGWindowListOptionOnScreenBelowWindow z AVCaptureScreenInput. Jeśli tak, to czy ktoś może udzielić wskazówek na temat wyglądu kodu wynikowego?

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

+0

Muszę zaimplementować taką funkcję, jeśli masz jakieś pojęcie o tym, to proszę mi również podziękować @Geuis – morroko

+0

@iMac Nie śledziłem tego projektu od sierpnia i nigdy nie udało mi się go wdrożyć. Czekałem, aż 10,9 wyjdzie, aby sprawdzić, czy nowe API ułatwi to. Jednak nie sprawdziłem ponownie. – Geuis

+0

dziękuję za odpowiedź, że naprawdę fajny pomysł kontrolujesz swoje nagranie z okna, które znajduje się na pulpicie, ale w rzeczywistych wynikach nagrywania będzie wyświetlane jako niewidoczne. Nie mam żadnego pomysłu, ale wciąż szukam – morroko

Odpowiedz

8

O ile mi wiadomo, nie ma sposobu, aby wykluczyć określone okna z OS X wbudowanego wyświetlacza API nagrywania:

  • AVFoundation za AVCaptureScreenInput (10.7+)
  • rdzeń graficzny CGDisplayStream (10.8+)

Obie powyższe metody wydają się pobierać zawartość ekranu po compositing, gdy końcowe wyjście ekranu zostało już połączone razem.
Tak więc wyłączenie okna nagrywania wymagałoby użycia interfejsu API, który pozwala na samodzielne zestawianie okien, a następnie dołączanie niestandardowych ramek do AVAssetWriterInput.

Quartz Window Services Umożliwia robienie migawek pojedynczych okien za pośrednictwem CGWindowListCreateImage. Dobry przykładowy projekt, który pokazuje również, jak połączyć wiele ujęć okiennych, to Son of Grab.

Po pobraniu połączonego zdjęcia należy go dołączyć do AVAssetWriterInput. AVFoundation zapewnia klasę wygody do dodawania niestandardowych buforów pikseli do filmu: AVAssetWriterInputPixelBufferAdaptor.

Szczególnie część AVFoundation może stać się bardzo frustrująca i możesz napotkać problemy z wydajnością, ponieważ kompozycja będzie prawdopodobnie wolniejsza niż wbudowany komponent systemu OS X, ale ogólnie powinno być możliwe osiągnięcie tego, co chcesz.

+0

Dzięki Weichsel.Doszedłem do tego samego wniosku o użyciu CGWindowListCreateImage, ale chciałem się upewnić, zanim przejdę dalej. Dziękujemy za dodatkowe wskazówki na temat AVAssetWriterInputPixelBufferAdaptor. Być może zajęło mi to trochę dłużej. Czy znasz jakąś metodę, aby zobaczyć, w jaki sposób implementowany jest AVCaptureScreenInput? Czy jest to dobry pomysł, aby zastanowić się nad jego podklasą i nieco zmodyfikować, aby zrobił to, czego potrzebuję? – Geuis

+0

Nie wiem, co AVFoundation używa do nagrywania ekranu. Ale prawdopodobnie CGDisplayStream, ponieważ jest niższy poziom i zapewnia podobne opcje (kursor przechwytywania, min. Czas trwania klatki, ...). Aby uzyskać więcej informacji na temat CGDisplayStream, możesz przejrzeć komentarze w CGDisplayStream.h (brak dostępnych jeszcze rzeczywistych dokumentów). To również może być interesujące - Wątek o wykluczeniu NSWindows z zrzutów ekranu: http://www.cocoabuilder.com/archive/cocoa/326518-turning-off-screen-shot-ability.html Nie oferuje możliwe rozwiązanie. –

+0

Nie widziałem CGDisplayStream. Przyjrzymy się temu głębiej. Tak, wpadłem też na dyskusję w NSWindows. Niestety, to nie działa lub nie byłem w stanie go uruchomić. Jeszcze raz dziękuję za odpowiedź! – Geuis