gpt4 book ai didi

android - 超出最小未出列缓冲区计数

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:46:55 26 4
gpt4 key购买 nike

我正在使用 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(我保留为成员(member)),然后一些错误消失,应用程序继续工作。 min undequeued buffer count exceeded 错误和 Too many preview buffer is locked by surfaceflinger 警告停留。

最佳答案

似乎相机在其缓冲区中保存了一些未因您的 Activity 而出列的内容。当您开始新的预览时,您必须找到清除相机缓冲区的方法。

正如您在 Android 文档中找到的有关 Camera 类的内容:

The buffer queue will be cleared if this method [setPreviewCallbackWithBuffer] is called with a null callback, setPreviewCallback(Camera.PreviewCallback) is called, or setOneShotPreviewCallback(Camera.PreviewCallback) is called.

因此,也许在拍照时删除回调并在重新启动预览时恢复回调就足够了。

关于android - 超出最小未出列缓冲区计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24361121/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com