Primero - He estado trabajando en esto por algún tiempo y he intentado con varias soluciones, así que no me envíe el primer enlace que encuentre en google.Android: ¿cómo mostrar la vista previa de la cámara con devolución de llamada?
Lo que necesito hacer es bastante simple, quiero mostrar manualmente la vista previa de la cámara usando la devolución de llamada de la cámara y quiero obtener al menos 15 fps en un dispositivo real. Ni siquiera necesito los colores, solo necesito una vista previa de la imagen en escala de grises. Las imágenes de la cámara están en formato YUV y tiene que procesarlo de alguna manera, que es el principal problema de rendimiento. Estoy usando API 8.
En todos los casos estoy usando camera.setPreviewCallbackWithBuffer(), que es más rápido que camera.setPreviewCallback(). Parece que no puedo obtener unos 24 fps aquí, si no estoy mostrando la vista previa. Entonces no hay problema.
me han tratado estas soluciones:
1. Visualizar la cámara preliminar En un SurfaceView como un mapa de bits. Funciona, pero el rendimiento es de aproximadamente 6 fps.
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. Visualizar la cámara preliminar En un GLSurfaceView como una textura. Aquí estaba visualizando solo datos de luminancia (imagen en escala de grises), lo cual es bastante fácil, solo requiere una matriz de copias() en cada cuadro. Puedo obtener aproximadamente 12 fps, pero necesito aplicar algunos filtros a la vista previa y parece que no se puede hacer rápidamente en OpenGL ES 1. Por lo tanto, no puedo usar esta solución. Algunos detalles de esto en another question.
3. cámara de pantalla de vista previa en un SurfaceView (GL) usando NDK para procesar los datos YUV. Encuentro una solución here que usa alguna función C y NDK. Pero no logré usarlo, here some more details. Pero de todos modos, esta solución se hace para devolver a ByteBuffer como una textura en OpenGL y no será más rápido que el intento anterior. Así que tendría que modificarlo para devolver int [] array, que se puede dibujar con canvas.drawBitmap(), pero no entiendo lo suficiente C para hacer esto.
Entonces, ¿hay alguna otra manera que me falta o una mejora de los intentos que intenté?
Gracias por cualquier respuesta!
Gracias, pero realmente necesito usar la devolución de llamada y mostrar imágenes manualmente. No necesito solo la imagen en escala de grises, estoy usando algunos filtros más, que no mencioné en mi pregunta ... –