2013-01-16 12 views
17

Pracuję nad aplikacją, która zajmuje się przetwarzaniem obrazu w czasie rzeczywistym na ramkach kamer. Do tego używam metody wywołania zwrotnego podglądu onPreviewFrame.
Działa to dobrze w przypadku aparatów obsługujących ramki podglądu o rozdzielczości co najmniej 640 x 480 lub większej. Ale gdy kamera nie obsługuje tak dużej rozdzielczości podglądu kamery, program jest zaprogramowany do odmowy przetwarzania takich ramek. Teraz mam problem z telefonami takimi jak Sony Xperia Go. Jest to bardzo ładne urządzenie, które może nagrywać wideo do rozdzielczości 1280x720, ale niestety maksymalny rozmiar podglądu z kamery to 480x320, który jest zbyt mały dla moich potrzeb.Przetwarzanie ramek wideo z Androidem

Co chciałbym wiedzieć, jak uzyskać te larger camera frames (do 1280x720 lub więcej)? Oczywiście musi to być możliwe, ponieważ aplikacja kamery ma możliwość nagrywania filmów w tej rozdzielczości - dlatego ta aplikacja musi w jakiś sposób mieć dostęp do większych ramek. Jak zrobić to samo z mojej aplikacji?

Aplikacja musi obsługiwać system Android 2.1 lub nowszy, ale byłbym bardzo szczęśliwy, nawet jeśli znajdę rozwiązanie dla mojego problemu tylko dla Androida 4.0 lub nowszego.

To pytanie jest podobna do http://stackoverflow.com/questions/8839109/processing-android-video-frame-by-frame-while-recording, ale nie trzeba zapisać film - Ja tylko potrzebuję tych klatek wideo o wysokiej rozdzielczości ...

Dziękuję bardzo z góry!

+0

Jeśli można przejść do SDK 11+ jest '' SurfaceTexture'' dostępne możesz użyć do podglądu kamery. A jeśli OpenGL wystarcza do przetwarzania obrazu, możesz zrobić zdjęcie, aby sprawdzić, czy podgląd oparty na SurfaceTexture ma wyższą rozdzielczość. – harism

+0

Dobra uwaga. Pomyślałem, że Camera.Parameters.getSupportedPreviewSizes() zależy tylko od kamery, ale nie od powierzchni, na którą podglądany jest aparat. Spróbuję tego. Z drugiej strony, czy możliwy jest dostęp do kamery przez interfejs V4L2 (VideoForLinux2)? Może z V4L będę miał lepszą kontrolę nad kamerą ... – DoDo

+0

Przede wszystkim należy wziąć pod uwagę, że onPreviewFrame daje obraz YUV (NV21), chyba że podasz inny format podglądu w obiekcie z kamerą. Z powodu braku metod w sdk dla Androida do pracy z tego rodzaju format, byłoby to ból w dupę. Ten format jest domyślny, więc jeśli chcesz mieć 100% kompatybilności ze wszystkimi urządzeniami, musisz nim zarządzać. Oczywiście możesz przekonwertować obrazek na bardziej zarządzalny format, ale jest to kosztowne pod względem wydajności, więc jeśli chcesz wiedzieć, że chcesz przetwarzać w czasie rzeczywistym, to będzie to dla Ciebie problem. – Mario

Odpowiedz

6

Wydaje się, że jedyną rzeczą, którą można zrobić, jest dekodowanie klatek z danych MediaRecoder. Możesz użyć ffmpeg do dekodowania danych rekoretera z LocalSocket.

nadzieję, że poniższe projekty open source może pomóc:

ipcamera-for-android: https://code.google.com/p/ipcamera-for-android/

spydroid-ipcamera: https://code.google.com/p/spydroid-ipcamera/

+0

Dziękujemy za udostępnienie tych projektów i pomysłów. Wygląda na to, czego szukałem. – DoDo

0

Powinieneś prawdopodobnie rzucić okiem na bibliotekę OpenCV. Posiada metody umożliwiające odbieranie pełnych klatek.

0

Mam wrażenie: rozmiar podglądu wideo jest mały i jest powolny, wolniejszy niż ustawiona liczba klatek nagrywania wideo.

Próbowałem kiedyś szukać rozwiązań w tym zakresie. Wydaje się, że lepszym sposobem jest uzyskanie strumienia wideo z magnetowidu, a następnie bezpośrednie przetwarzanie danych ze strumienia wideo.

Możesz znaleźć kilka przykładów na Android-kamera.

Powiązane problemy