Я новичок в платформе Camera2 и пытаюсь понять лог c создания сессий захвата.
Мне нужна простая вещь - предварительный просмотр и запись видео. Я также хочу установить правильную подсказку ориентации в то время, когда я начинаю запись видео . Но у меня возникла проблема с курицей / яйцом.
Вот мой лог c:
Чтобы начать запись, я делаю это:
val recordRequest = session.device.createCaptureRequest(CameraDevice.TEMPLATE_RECORD).apply {
// Add the preview and recording surface targets
addTarget(viewFinder.holder.surface)
addTarget(recorder.surface)
}.build()
session.setRepeatingRequest(recordRequest, null, cameraHandler)
recorder.setOrientationHint(it) // NOT allowed after getSurface()!
recorder.prepare() // NOT allowed after getSurface()!
recorder.start()
Однако я уже набрал recorder.surface
(или getSurface()
), когда добавил цели выше. Можно подумать, что я могу подготовить, а затем добавить цели, однако документация для addTarget()
говорит, что поверхность Добавленная поверхность должна быть одной из поверхностей, включенных в самый последний вызов CameraDevice # createCaptureSession
Это приводит к интересной проблеме. Каждый раз, когда я открываю приложение, мне нужно создать сеанс захвата, чтобы начать предварительный просмотр изображения с камеры. Однако в момент создания createCaptureSession () необходимо включить все поверхности , которые появятся в будущем запросы захвата . Это означает, что мне также нужно включить поверхность для записи, даже если я просто открою камеру без записи. Как мне получить эту Surface
для записи? Что ж, в документации написано, что я могу получить его от MediaRecorder
или от MediaCodec
. Я хочу получить его из MediaRecorder
, так как хочу использовать CamcorderProfiles
. Однако, как я показал в приведенном выше коде, как только я получаю поверхность от рекордера в точке создания сеанса - я не могу делать никаких изменений там в точке начала записи , например, установка подсказки ориентации.
Официальный образец приложения Camera2Video делает трюк - он использует createPersistentInputSurface , однако в их примере камера фиксирована, что позволяет им выделять достаточно память для него и использовать эту поверхность на протяжении всего жизненного цикла приложения.
Как это можно решить? Я неправильно понимаю концепции здесь? Как я могу создать рекордер позже, когда я начинаю запись, но при этом поверхность для него создается ранее, когда я открываю камеру для предварительного просмотра?