2012-03-28 4 views
20

Chcę przetwarzać obraz z kamery na GPU na Androidzie.Używanie SurfaceTexture w połączeniu z RenderScript

W mojej obecnej konfiguracji używam SurfaceTexture do przechwytywania klatek ze strumienia obrazu kamery jako tekstury OpenGL ES. Jest to skuteczny sposób na uzyskanie dostępu do strumienia kamery w moich modułach cieniujących. (http://developer.android.com/reference/android/graphics/SurfaceTexture.html)

Teraz chciałbym rozpocząć korzystanie z nowego interfejsu API RenderScript zamiast bezpośredniego użycia OenGL ES. (http://developer.android.com/guide/topics/renderscript/index.html)

Ale aby utworzyć SurfaceTexture, muszę przekazać ID tekstury openGl do konstruktora. Niestety identyfikator tekstury nie jest dostępny (RenderScript używa klasy alokacji do ładowania tekstur, która nie ujawnia identyfikatora tekstury). Więc nie mogę utworzyć SurfaceTexture podczas używania RenderScript.

Przeczytałem całą dokumentację dotyczącą renderscript (która jest wciąż dość rzadka) i obejrzałem próbki, ale nie mają one żadnych informacji na ten temat.

Moje pytanie brzmi: Czy można użyć SurfaceTexture w połączeniu z RenderScript, czy jest jakiś inny skuteczny sposób wykorzystania strumienia kamery na żywo w skrypcie RenderScript Graphics?

Odpowiedz

1

Jeśli dobrze rozumiem, już używasz SurfaceTexture. Następnie możesz zarejestrować wywołanie zwrotne pod numerem setOnFrameAvailableListener.

Widzę dwa rozwiązania:

  1. Realizuje jesteś właścicielem RSTextureView, która dziedziczy z SurfaceTexture.OnFrameAvailableListener. Zarejestruj swój widok jako wywołanie zwrotne SurfaceTexture. Za każdym razem, gdy twój widok powierzchni jest aktualizowany przez strumień kamery, Twój RSTextureView zostanie powiadomiony i będziesz mógł go obsłużyć tak, jak chcesz.

  2. Innym rozwiązaniem byłoby zaimplementować własną RenderScriptGL (nadal dziedziczenie z SurfaceTexture.OnFrameAvailableListener) i wywołać setSurfaceTexture gdy zwrotna jest wywoływana.

Powinieneś być w stanie połączyć RenderScript z SurfaceTexture z co najmniej jednego z tych dwóch rozwiązań.

+0

Doceniam odpowiedź, ale od zamieszczenia tego pytania postanowiłem użyć GLSL do mojej aplikacji. To dlatego, że nie znalazłem łatwego sposobu, aby to zadziałało, a ostatnio ponieważ sekcja grafiki renderscript będzie amortyzowana w 4.1 (Jelly Bean). Dlatego sam tego nie przetestowałem. Tak więc dla innych obserwujących tego wątku: akceptuję tę odpowiedź, ponieważ jest rozsądna, ale nie wdrożyłem. – Arjan