2014-06-23 5 views
11

Я использую SurfaceTexture для получения кадров предварительного просмотра следующим образом.Минутовое количество неиспользуемых буферов превышено

Во-первых, я поставил предварительный просмотр текстуры:

camera.setPreviewTexture(new SurfaceTexture(0)); 

Тогда, как раз перед началом просмотра, а затем каждый раз, когда onPreviewFrame называется, я поставил обратного вызова буфера так:

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

It работает. Иногда я делаю снимок с помощью 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) 

ли я что-то отсутствует? Должен ли я отпустить старую текстуру в какой-то момент?

Конфигурация: Samsung Galaxy S4, Samsung Galaxy S5, Nexus 5, работает на Android KitKat.

EDIT: Я не уверен, что кастрированный баран это связано или нет, но через некоторое время, мое приложение не фотографировать больше, и следующие сообщения постоянно появляются в моей 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: Если вместо new SurfaceTexture(0), я всегда использую тот же SurfaceTexture (который я сохраняю как член), затем некоторые ошибки исчезают, и приложение продолжает работать. Ошибка min undequeued buffer count exceeded и предупреждение Too many preview buffer is locked by surfaceflinger.

ответ

5

Кажется, что камера держит что-то в своем буфере, которое не удалено вашей деятельностью. Вы должны найти способ очистить буфер камеры при запуске нового предварительного просмотра.

Как вы можете найти в Android документации о классе камеры:

Очередь буфера будет очищена, если этот метод [setPreviewCallbackWithBuffer] называется нулевым обратным вызовом, setPreviewCallback (Camera.PreviewCallback) называются, или вызывается setOneShotPreviewCallback (Camera.PreviewCallback).

Возможно, этого достаточно, чтобы удалить обратный вызов, когда вы делаете снимок, а затем восстанавливайте его при перезапуске предварительного просмотра.

+1

Это интересно знать. К сожалению, у меня все еще есть такое же поведение, если я добавляю 'setPreviewCallbackWithBuffer (null)' перед вызовом 'takePicture()', а также я добавляю его непосредственно перед 'startPreview()' ... – JonesV

+0

Фактически, я даже пытался добавить три решения, которые вы предлагали в то же время, и ничего не меняете. – JonesV

+0

Вы пытались применить это решение, используя всегда ту же SurfaceTexture, вместо того, чтобы создавать новый каждый раз? –

Смежные вопросы