Частота кадров, поступающих в ImageReader.OnImageAvailableListener - PullRequest
0 голосов
/ 14 ноября 2018

Я интегрирую API Camera2 в свое приложение для Android и тестирую его на Samsung Galaxy Tab S2.Мне нужно работать с кадрами предварительного просмотра в реальном времени.Вот мой код:

private val onPreviewAvailableListener = ImageReader.OnImageAvailableListener { reader ->
    if (reader != null) {
        val image = reader.acquireNextImage()
        if (image != null) {
            // do something with image
            image.close()
        }
    }
}

private var mPreviewRequestBuilder: CaptureRequest.Builder? = null
private lateinit var mPreviewSize: Size

private fun configurePreview() {
    // some code here 
    // ... 

    previewImageReader = ImageReader.newInstance(
            mPreviewSize.width,
            mPreviewSize.height,
            ImageFormat.YUV_420_888,
            2
    )
    previewImageReader?.setOnImageAvailableListener(onPreviewAvailableListener, backgroundHandler)

    // some code here 
    // ... 
}

// other code

private fun createCameraPreviewSession() {
    mPreviewRequestBuilder = mCameraDevice?.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW)
    mPreviewRequestBuilder?.addTarget(previewImageReader?.surface)
    mPreviewRequestBuilder?.addTarget(surface) // surfaceView

    mCameraDevice?.createCaptureSession(
                    Arrays.asList(previewImageReader?.surface, surface),
                    object : CameraCaptureSession.StateCallback() { },
                    null /* null handler */
}

Мне нужны изображения в onPreviewAvailableListener, чтобы иметь высокое разрешение.И они.Разрешение не слишком высокое.Что-то около 1280 * 720.Проблема в том, что мой предварительный просмотр TextureView запаздывает, как если бы было установлено 15 FPS.

Возможно, я смогу уменьшить частоту появления изображений до onPreviewAvailableListener.Я попытался установить флаг для обработки только каждого 10-го или 20-го изображения в onPreviewAvailableListener onImageAvailable, но ничего не изменилось:

private val onPreviewAvailableListener = object: ImageReader.OnImageAvailableListener {

    private var counter = 10 

    fun onImageAvailable(reader : ImageReader) {
        if (counter % 10 == 0) {
            if (reader != null) {
                val image = reader.acquireNextImage()
                if (image != null) {
                    // do something with image
                    image.close()
                }
            }
        } 
        if (counter == Int.MAX_VALUE) {
            counter = 0
        } else {
            counter++
        }
    }
}

Я также попытался создать новый фоновый поток специально дляonPreviewAvailableListener так что его метод обратного вызова вызывается в этом потоке.Ничего не изменилось:

previewImageReader?.setOnImageAvailableListener(onPreviewAvailableListener, previewImageReaderHandler) /* it's NOT backgroundHandler */
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...