2015-08-20 6 views
4

Я читаю код о Android Camera2 API, здесь: https://github.com/googlesamples/android-Camera2BasicAndroid Camera2 Основы API

И это сбивает с толку в этой линии: https://github.com/googlesamples/android-Camera2Basic/blob/master/Application/src/main/java/com/example/android/camera2basic/Camera2BasicFragment.java#L570-L574

, что строитель previewRequest только добавить поверхность, которая является TextureView, чтобы показать, как цель. Но следующая строка фактически добавляет как цели. Насколько я понимаю, это не должно запускать «OnImageAvailable» Lisenter во время предварительного просмотра, нет? Итак, почему это добавляет поверхность воображения здесь?

Я попытался удалить поверхности этой ImageReader здесь, но получил ошибку, когда я действительно хочу, чтобы захватить изображение .....

SOOO запутывающую !!!

+0

'ImageReader' используется для получения записанных данных изображения для сохранения в файле. И поверхность 'ImageReader' должна быть добавлена ​​к' CaptureSession', прежде чем вы будете использовать 'CaptureRequest.Builder' для захвата изображения в соответствии с [doc] (https://developer.android.com/reference/android/hardware/camera2 /CaptureRequest.Builder.html#addTarget(android.view.Surface)) – calvinfly

ответ

8

Вам необходимо объявить все выходные данные Surface s, чтобы данные изображения могли быть отправлены на момент создания CameraCaptureSession. Это именно то, как разрабатывается инфраструктура.

При создании CaptureRequest вы добавляете целевой список (0) Surface (s). Здесь будут отображаться данные изображения из захваченного кадра - это может быть Surface, связанный с TextureView для отображения или с ImageReader для сохранения, или с Allocation для обработки и т. Д. (A Surface - это действительно просто буфер, который может принимать данные, выводимые камерой. Тип связанного с буфером объекта определяет, как вы можете получить доступ/работать с данными.)

Вам не нужно отправлять данные из каждого кадра всем зарегистрированным Surface s, но он должен быть отправлен подмножество из них. Вы не можете добавить Surface в качестве цели в CaptureRequest, если он не был зарегистрирован с CameraCaptureSession, когда он был создан. Ну, вы можете, но передача его на сеанс вызовет крушение, так что не надо.

+0

Привет, Самнер, спасибо за объяснение. По моему мнению, есть два разных сеанса захвата, один для предварительного просмотра и один для реального захвата. Я смущен, потому что я должен только зарегистрировать поверхность считывателя изображений в реальном сеансе захвата, нет? – Coderzelf

+0

CameraCaptureSessions большие и дорогостоящие и редко создаются. Как правило, вы решаете, какие выходные поверхности вы хотите отправить для своих целей (отображение, сохранение и т. Д.), А затем создайте один сеанс с каждым из них, зарегистрированным на нем, чтобы вы могли использовать их, когда захотите, CaptureRequests к этому разделу. Вы должны заметить в camera2basic, что они создают только один CameraCaptureSession. – rcsumner

+0

CameraCaptureSession похож на конфигурацию для всего контура камеры, а зарегистрированные в нем Surfaces - это выходные каналы, подключенные к создаваемой инфраструктуре. Вы не хотите создавать несколько инфраструктур, вы просто настроили один для нескольких выходов. – rcsumner

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