2012-12-11 10 views
8

Po wielu poszukiwaniach i dniach eksperymentów nie znalazłem prostego rozwiązania.Nagrywanie ekranu w aplikacji na Androida w celu przechwytywania 15 klatek na sekundę

Zajmuję się tworzeniem aplikacji, z której użytkownik będzie wchodził w interakcje ze zwierzakiem na ekranie i chcę, aby zapisał go jako wideo.

Czy istnieje "prosty" sposób przechwytywania ekranu samej aplikacji?

Znalazłem obejście (aby zapisać niektóre bitmapy co sekundę, a następnie przekazać je do kodera), ale wydaje się zbyt ciężkie. Będę zadowolony nawet z klatek z 15fps

Wydaje się możliwe, czyli istnieje podobna aplikacja, która to robi, jego nazwie „Rozmowa Tom”

+4

Czy trzeba faktycznie nagrać ekran?Czy możesz wyrenderować wideo oparte na nagrywaniu danych wejściowych/domowych, które będą wyglądały dokładnie tak, jak zrobił to ekran, bez konieczności przechwytywania ekranu? –

+2

"Czy istnieje" prosty "sposób przechwytywania ekranu samej aplikacji?" - dlaczego miałbyś to zrobić, w przeciwieństwie do tworzenia bitmapy bezpośrednio z pożądanej treści? Czy podczas zapisywania obrazu w edytorze graficznym, takim jak Photoshop, aplikacja pobiera zrzut ekranu i zapisuje go? – CommonsWare

+1

Czy używasz OpenGL do renderowania swojego zwierzaka? Możesz użyć 'glReadPixels()' po każdej klatce, aby pobrać dane, a następnie zrobić to, co chcesz. Tak, ta sugestia jest w zasadzie taka sama jak "obejście", o którym wspomniałeś. Nie sądzę, aby w systemie Android było wbudowane magiczne 'recordScreenToVideoFile()', więc chwytanie ramek i kodowanie ich jest prawdopodobnie najlepszym rozwiązaniem. –

Odpowiedz

1

To naprawdę zależy od sposobu realizacji swojego „zwierzaka widok". Czy rysujesz na płótnie? OpenGl ES? Zwykła hierarchia widoku Androida?

W każdym razie, nie ma magicznego "recordScreenToVideo()" jak jeden z komentarzy powiedział.

Musisz:

  • Uzyskać bitmap reprezentujących swoje "ramek". To zależy od sposobu implementacji widoku. Jeśli narysujesz siebie (Canvas lub OpenGL), zapisz surowe bufory pikseli jako ramki. Jeśli używasz normalnej hierarchii widoków, zrób podklasę Android onDraw i zapisz "ramki", które dostajesz na płótnie. Częstotliwość wywołania systemu na onDraw będzie nie mniejsza niż faktyczna "liczba klatek na sekundę" ekranu. W razie potrzeby zduplikuj kolejne klatki, aby dostarczyć wideo o szybkości 15 klatek na sekundę.

  • Zakoduj ramki. Wygląda na to, że masz już taki mechanizm, po prostu potrzebujesz go, by był bardziej wydajny.

sposobów można zoptymalizować kodowanie:

  • pamięć podręczną bitmapy (frame) i zakodować później. To zadziała tylko wtedy, gdy oczekiwane wideo będzie względnie krótkie, w przeciwnym razie otrzymasz miejsce do przechowywania.
  • Nagrywaj tylko w ilości klatek na sekundę, którą twoja aplikacja faktycznie generuje (w zależności od sposobu narysowania) i użyj parametru kodera do wygenerowania wideo 15 klatek na sekundę (bez dostarczania 15 klatek na sekundę).
  • Dostosuj ustawienia jakości do bieżącego urządzenia. Można tego dokonać, wykonując ukryty test cyklu CPU podczas uruchamiania aplikacji i określając pewne progi.
  • Zakoduj tylko najważniejszą część ekranu.
  • Znowu, naprawdę w zależności od sposobu wdrożenia - jeśli można zapisać pewne "dane historyczne", a następnie przekonwertować je na ramki bez konieczności wykonywania go w czasie rzeczywistym, byłoby to najlepsze. Na przykład "przenieś", "uśmiech", "zmień kolor" - lub jakakolwiek jest twoja logika biznesowa, ponieważ nie wyjaśniłeś tego. Funkcja "generuj film" będzie animować dane historii jako sekwencję klatek (bez rysowania na ekranie), a następnie kodować.

nadzieję, że pomoże

Powiązane problemy