超出最小未加标缓冲区计数

时间:2014-06-23 08:07:11

标签: android android-camera

我使用SurfaceTexture以下列方式获取预览帧。

首先,我设置了一个预览纹理:

camera.setPreviewTexture(new SurfaceTexture(0));

然后,在开始预览之前,然后每次调用onPreviewFrame时,我都会设置回调缓冲区:

camera.addCallbackBuffer(buffer);
camera.setPreviewCallbackWithBuffer(this);

有效。有时,我会使用camera.takePicture(null, null, callback)拍摄照片,这会导致成功调用onPictureTaken。图像已保存。由于我想在拍摄照片后重新开始预览,我会执行以下操作:

try
{
    camera.setPreviewTexture(new SurfaceTexture(0));
    camera.startPreview();
}
...

预览重新开始,一切似乎都没问题。但是在我的Logcat中报告了以下错误,似乎在重新启动预览之后:

E/BufferQueue﹕ [unnamed-5682-5] dequeueBuffer: min undequeued buffer count (2) exceeded (dequeued=5 undequeudCount=1)

我错过了什么吗?我应该在某个时候释放旧纹理吗?

配置:三星Galaxy S4,三星Galaxy S5,Nexus 5,在Android KitKat上运行。

编辑:我不确定它是否已链接,但过了一段时间,我的应用程序不再拍照了,以下消息会在我的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

编辑2:如果我使用相同的new SurfaceTexture(0)(我保留为会员),而不是SurfaceTexture,那么一些错误就会消失继续工作。 min undequeued buffer count exceeded错误和Too many preview buffer is locked by surfaceflinger警告停留。

1 个答案:

答案 0 :(得分:5)

似乎相机在其缓冲区中存放了一些未被您的活动排队的东西。开始新预览时,必须找到清除相机缓冲区的方法。

您可以在Android文档中找到有关Camera类的信息:

  

如果使用null回调调用此方法[setPreviewCallbackWithBuffer],调用setPreviewCallback(Camera.PreviewCallback)或调用setOneShotPreviewCallback(Camera.PreviewCallback),则将清除缓冲区队列。

因此,当您拍照时删除回调,然后在重新启动预览时重新恢复它就足够了。