Po pierwsze - pracuję nad tym od jakiegoś czasu i wypróbowałem kilka rozwiązań, więc nie wysyłaj mi pierwszego linku znalezionego w Google.Android: jak wyświetlić podgląd kamery z oddzwanianiem?
Co muszę zrobić, to całkiem proste, chcę ręcznie wyświetlić podgląd z kamery za pomocą wywołania kamery i chcę uzyskać co najmniej 15 fps na prawdziwym urządzeniu. Nie potrzebuję nawet kolorów, wystarczy podgląd obrazu w skali szarości. Obrazy z kamery są w formacie YUV i trzeba to jakoś przetworzyć, co jest głównym problemem wydajności. Używam API 8.
We wszystkich przypadkach używam camera.setPreviewCallbackWithBuffer(), która jest szybsza niż camera.setPreviewCallback(). Wygląda na to, że nie mogę uzyskać tutaj około 24 fps, jeśli nie wyświetlam podglądu. Więc nie ma problemu.
Próbowałem te rozwiązania:
1. Ekran podglądu kamery na SurfaceView postaci bitmapy. Działa, ale wydajność wynosi około 6 klatek na sekundę.
baos = new ByteOutputStream();
yuvimage=new YuvImage(cameraFrame, ImageFormat.NV21, prevX, prevY, null);
yuvimage.compressToJpeg(new Rect(0, 0, prevX, prevY), 80, baos);
jdata = baos.toByteArray();
bmp = BitmapFactory.decodeByteArray(jdata, 0, jdata.length); // Convert to Bitmap, this is the main issue, it takes a lot of time
canvas.drawBitmap(bmp , 0, 0, paint);
2. Wyświetlacz podgląd kamery na GLSurfaceView jako tekstury. Tutaj wyświetlałem tylko dane luminancji (obraz w skali szarości), co jest dość łatwe, wymaga tylko jednej arraycopy() na każdej ramce. Mogę uzyskać około 12 fps, ale muszę zastosować niektóre filtry do podglądu i wydaje się, że nie można tego zrobić szybko w OpenGL ES 1. Nie mogę użyć tego rozwiązania. Niektóre szczegóły tego w another question.
3. Wyświetlanie podglądu kamery na (GL) SurfaceView wykorzystaniem NDK do przetwarzania danych YUV. Znajduję rozwiązanie here, które używa jakiejś funkcji C i NDK. Ale nie udało mi się go użyć, here some more details. W każdym razie, to rozwiązanie jest zrobione, aby zwrócić ByteBuffer, aby wyświetlić go jako teksturę w OpenGL i nie będzie szybszy niż poprzednia próba. Musiałbym więc zmodyfikować go, aby zwrócić tablicę int [], którą można narysować za pomocą canvas.drawBitmap(), ale nie rozumiem wystarczająco C, aby to zrobić.
Czy jest jakiś inny sposób, którego mi brakuje lub jakaś poprawa prób, które próbowałem?
Dzięki za odpowiedź!
Dzięki, ale naprawdę muszę używać wywołań zwrotnych i wyświetlać obrazy ręcznie. Nie potrzebuję tylko obrazu w skali szarości, używam więcej filtrów, o których nie wspomniałem w swoim pytaniu ... –