2010-01-13 17 views
15

Chciałem dowiedzieć się, jak można przechwycić screencast przy użyciu java. Wiem, że używając klasy robotów można uzyskać zrzut ekranu, ale jak mam go przechwycić jako wideo, a następnie przesłać na serwer? Jak dokładnie by to działało?Przechwytywanie ekranu apletu Java do wideo

pomysły?

+0

Dawida, mogę zapytać, czy mogę zapoznać się z kodem źródłowym twojej aplikacji do wyświetlania w celach edukacyjnych? Dzięki – user1030434

Odpowiedz

14

Z czystym rozwiązaniem Java, wątpię, że to zadziała, ale zależy to oczywiście od tego, co twoja interpretacja "wideo".

Na moim komputerze stacjonarnym o rozdzielczości 1920x1200, jestem w stanie uzyskać około 20 klatek na sekundę podczas używania robota Java do przechwytywania całego ekranu. Ponieważ każdy obraz zawiera> 6 MB nieskompresowanych danych, potrzebowałbym przepustowości przekraczającej 1 Gb/s do przesyłania nieprzetworzonych danych tych obrazów na serwer. Najprawdopodobniej wymaganie tak dużej przepustowości jest niedopuszczalne, więc albo trzeba zmniejszyć liczbę klatek na sekundę, albo zastosować kompresję do obrazów.

Jedną z możliwości jest skompresowanie każdego obrazu przy użyciu jednego z formatów obrazu obsługiwanych przez ImageIO. Rozmiar skompresowanych obrazów będzie oczywiście w dużym stopniu zależał od tego, co faktycznie jest wyświetlane na ekranie, ale wydajność kompresorów nie jest szczególnie dobra. Kompresja do formatu PNG powinna zapewniać najlepszy bezstratny współczynnik kompresji dla większości treści na komputery, ale przynajmniej mój komputer może przetwarzać tylko około 2 klatek na sekundę. Używanie kompresora JPEG z domyślnymi ustawieniami jakości osiąga około 5 klatek na sekundę.

Używanie popularnych kodeków wideo za pośrednictwem warstwy abstrakcji, takiej jak jffmpeg, prawdopodobnie zapewni zarówno lepszą wydajność, jak i lepszy współczynnik kompresji, ale wątpię, czy popularne kodeki wideo, takie jak WMV lub H.264, są odpowiednie dla typowych treści pulpitu.

Jeśli naprawdę potrzebujesz czystego rozwiązania Java (i nie możesz używać żadnego z dostępnych samodzielnych programów, które robią to, o co prosisz), podjąłbym próbę wdrożenia mojego własnego, prostego algorytmu kompresji. Przy typowej aktywności na pulpicie powinna być niewielka różnica między większością następujących po sobie zrzutów ekranu, więc to, co może działać całkiem dobrze, to całkowite przesłanie pierwszej klatki, a następnie zaimplementowanie algorytmu do zgrubnego wykrycia prostokątów, w których dokonano zmian, a następnie przesyłać tylko te połączone z JPG lub preferowaną (jakość) kompresją PNG.

+0

W jaki sposób screencast-o-matic.com robi to z tak ładną liczbą klatek na sekundę? Rozumiem i zgadzam się z Tobą, że potrzebny będzie bardzo dobry algorytm kompresji. – Obaid

+0

Skąd mam wiedzieć? Po pierwsze, przechwytują tylko niewielką część ekranu (640x480?), A część apletu jest zaimplementowana w natywnym kodzie. Być może uda Ci się przeprowadzić debugowanie za pomocą dekompilowanego kodu apletu, jeśli naprawdę chcesz wiedzieć. – jarnbjo

+0

+1 Niezła próba wyjaśnienia. Dzięki. – Favonius

4

Lub użyj Xuggler, lepszego opakowania dla FFmpeg w Javie. W rzeczywistości kod przechwytywania ekranu i kodowania wideo jest jednym z standard tutorials.

+0

Xuggler nie pozwala mi uruchomić biblioteki jako apletu. (lub czy coś mi brakuje?) – Obaid

+0

Zgadza się; dziś nie obsługuje apletów, ale jest na naszej mapie drogowej na przyszłość. –

2

Możesz po prostu użyć czegoś podobnego do Javy do natywnej kompilacji FFMPEG i wykonać polecenie w wierszu polecenia. Oto aplet, który zrobiłem, który właśnie to: http://have2chat.net/screencast/

+0

Jeśli jest to możliwe, do celów edukacyjnych prosimy o udostępnienie kodu źródłowego? Byłoby wspaniale, gdyby można było pokazać, w jaki sposób można uzyskać dostęp do kamery internetowej z apletu – Jatin

Powiązane problemy