2015-12-04 4 views
1

Только что начал использовать рамку Camera2 из-за повышенного контроля над низкоуровневыми функциями камеры. Тем не менее, у меня возникают проблемы с быстром включением и выключением фонарика. Со старым API камеры, я мог бы переключить вспышку во время подачи предварительного просмотра по:Переключить фонарик в Camera2 без прерывания предварительного просмотра

try 
{ 
    android.hardware.Camera.Parameters parameters = c.getParameters(); 
    if (parameters.getFlashMode().equals(Camera.Parameters.FLASH_MODE_OFF)) 
    { 
     parameters.setFlashMode(Parameters.FLASH_MODE_TORCH); 
     Log.i("HeartBeatAlgorithm", "LightOn"); 
    } 
    else if (parameters.getFlashMode().equals(Camera.Parameters.FLASH_MODE_TORCH)) 
    { 
     parameters.setFlashMode(Parameters.FLASH_MODE_OFF); 
     Log.i("HeartBeatAlgorithm", "LightOff"); 
    } 
    c.setParameters(parameters); 
} 
catch (Exception exception) 
{ 
    c.release(); 
    c = null; 
} 

И фонарик быстро включить или выключить, без какого-либо заметного прерывания. С Camera2, однако, кажется, что режим вспышки является собственностью CaptureSession, что означает совершенно новый CaptureSession должен быть создан, чтобы изменить режим вспышки, то есть:

try 
{ 
    SurfaceTexture texture = mTextureView.getSurfaceTexture(); 
    assert texture != null; 

    texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight()); 
    Surface surface = new Surface(texture); 
    mPreviewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); 

    if (mLightNowOn == true) 
    { 
     mPreviewRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_TORCH); 
    } 
    else 
    { 
     mPreviewRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF); 
    } 

    mPreviewRequestBuilder.addTarget(surface); 
    mPreviewRequest = mPreviewRequestBuilder.build(); 
    mCameraDevice.createCaptureSession(Arrays.asList(surface), mSessionStateCallback, null); 
} 
catch (CameraAccessException e) 
{ 
    e.printStackTrace(); 
} 

Как упоминается в документации для разработчиков, " Создание сеанса является дорогостоящей операцией и может занимать несколько сотен миллисекунд, поскольку для этого требуется настройка внутренних конвейеров устройства камеры и выделение буферов памяти для отправки изображений в желаемые цели ». Это определенно делает, и есть заметная задержка в моем приложении при переключении режима вспышки.

Мне действительно нужно иметь возможность быстро переключать режимы вспышки, не прерывая предварительный просмотр. Есть ли способ обойти это, или это неизбежно из-за нового конвейера API?

ответ

0

Неверно, что совершенно новый сеанс захвата должен создаваться каждый раз только для изменения режима вспышки. Вместо этого вы можете создать повторный запрос предварительного просмотра в существующем сеансе захвата и просто задать запросNewRepeating каждый раз, например:

mPreviewRequestBuilder.set (CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_TORCH); ... mPreviewRequest = mPreviewRequestBuilder.build(); ... mCaptureSession.setRepeatingRequest (mPreviewRequest, captureCallBack, backgroundHandler);

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

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