Я интегрирую 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 */