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:
- Android onPreviewFrame no se llama
- Captura la foto gira 90 grados en móvil samsung
- Android Rotar imagen antes de guardar
- Android: la imagen tomada por la cámara personalizada es demasiado oscura
- ¿Puedo obligar a mi aplicación a iniciar la cámara predeterminada en lugar de ofrecer la lista de "Acción completa usando"?
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
.
- Apertura de la cámara en modo vertical con Intent
- ¿Cómo hacer que la luz de la cámara parpadee en una secuencia específica?
- Servidor de la cámara Android muerto y error de la cámara - 100
- ¿Cómo puedo liberar la cámara cuando otra aplicación lo solicite?
- Error: No se puede obtener un lockedBuffer, el cliente muy probable intenta bloquear más de buffers maxImages
- AutoExposureLock que restablece después de llamar a takePicture ()
- Cómo obtener imágenes de la imagen de vídeo en Android
- Cómo obtener los datos RGB sin procesar de la cámara Android
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.