Se ha superado el recuento de búfer de undequeued mínimo
Estoy usando una SurfaceTexture para obtener marcos de vista previa de la siguiente manera.
En primer lugar, establecer una textura de vista previa:
- Cómo obtener la distancia a un objeto y el tamaño del objeto utilizando la cámara (dispositivo Android)?
- Permitir que HTML5 acceda a la cámara de Android
- Objeto de cámara siempre devuelve nulo
- Capturado La orientación de la fotografía está cambiando en android
- ¿Cuál es la diferencia entre `opencv.android.JavaCameraView` y` opencv.android.NativeCameraView`
camera.setPreviewTexture(new SurfaceTexture(0));
A continuación, justo antes de iniciar la vista previa y luego cada vez que se llama onPreviewFrame
, establezco el búfer de devolución de llamada de la siguiente manera:
camera.addCallbackBuffer(buffer); camera.setPreviewCallbackWithBuffer(this);
Funciona. A veces, tomo una foto usando camera.takePicture(null, null, callback)
, lo que resulta en llamar onPictureTaken
correctamente. Se guarda la imagen. Dado que quiero reiniciar la vista previa después de tomar la foto, hago lo siguiente:
try { camera.setPreviewTexture(new SurfaceTexture(0)); camera.startPreview(); } ...
La vista preliminar se reinicia y todo parece estar bien. Pero el error siguiente se informa en mi Logcat, aparentemente después de que la inspección previo se haya recomenzado:
E/BufferQueue﹕ [unnamed-5682-5] dequeueBuffer: min undequeued buffer count (2) exceeded (dequeued=5 undequeudCount=1)
¿Me estoy perdiendo de algo? ¿Debo liberar la textura antigua en algún momento?
Configuración: Samsung Galaxy S4, Samsung Galaxy S5, Nexus 5, corriendo en Android KitKat.
EDIT: No estoy seguro si está vinculado o no, pero después de un tiempo, mi aplicación no toma fotos y los siguientes mensajes aparecen continuamente en mi Logcat:
E/LocSvc_api_v02( 318): I/---> locClientSendReq line 2332 QMI_LOC_INJECT_SENSOR_DATA_REQ_V02 E/gsiff_dmn( 318): I/loc_api_resp_ind_callback: Received LocAPI Resp ind = 77 E/LocSvc_api_v02( 318): D/loc_sync_process_ind:172]: loc_sync_array not in use E/LocSvc_utils_q( 318): D/msg_q_rcv: Received message 0xB899D940 rv = 0 E/gsiff_dmn( 318): I/gsiff_data_task: Handling message type = 4 E/gsiff_dmn( 318): I/gsiff_daemon_inject_sensor_data_handler: Sending Sensor Data to LocApi. opaque_id = 1226 E/LocSvc_api_v02( 318): I/---> locClientSendReq line 2332 QMI_LOC_INJECT_SENSOR_DATA_REQ_V02 E/gsiff_dmn( 318): I/loc_api_resp_ind_callback: Received LocAPI Resp ind = 77 E/LocSvc_api_v02( 318): D/loc_sync_process_ind:172]: loc_sync_array not in use E/mm-camera( 284): [cpp_hardware_process_frame:997] Too many cpp frames dropped!! E/mm-camera( 284): cpp_thread_handle_process_buf_event:224] get buffer fail. drop frame id:1845 identity:0x20002 W/QCamera2HWI( 269): [CHECK_BUF_LOCK] Too many preview buffer is locked by surfaceflinger : 29 E/mm-camera( 284): [cpp_hardware_process_frame:997] Too many cpp frames dropped!! E/mm-camera( 284): cpp_thread_handle_process_buf_event:224] get buffer fail. drop frame id:1846 identity:0x20002
EDIT 2: Si, en lugar de una new SurfaceTexture(0)
, siempre utilizo la misma SurfaceTexture
(que mantengo como miembro), entonces algunos errores desaparecen y la aplicación continúa funcionando. El min undequeued buffer count exceeded
error y el Too many preview buffer is locked by surfaceflinger
advertencia de la Too many preview buffer is locked by surfaceflinger
.
- La aplicación de la API de la cámara Android se bloquea en onResume
- Cómo tomar una foto (instantánea) mientras el video se ha grabado con la vista de la superficie
- Captura de imagen sin permiso con Android 6.0
- ¿Cómo mostrar el enfoque automático cuando la cámara de vista previa?
- ¿Cómo hacer que la luz de la cámara parpadee en una secuencia específica?
- Cámara Android: la intención de los datos devuelve null
- Cómo configurar la orientación de la cámara Android correctamente?
- Cámara de Android ICS emulador
Parece que la cámara está sosteniendo algo en su búfer que no es dequeued por su actividad. Debe encontrar la forma de borrar el búfer de la cámara cuando inicie una nueva vista previa.
Como se puede encontrar en la documentación de Android acerca de la clase Camera:
La cola del búfer se borrará si se llama a este método [setPreviewCallbackWithBuffer] con una devolución de llamada nula, se llama setPreviewCallback (Camera.PreviewCallback) o se llama setOneShotPreviewCallback (Camera.PreviewCallback).
Así que tal vez es suficiente para eliminar su devolución de llamada cuando se toma una imagen y, a continuación, restablecerlo cuando reinicie su vista previa.