Ausgabestreams
Das Kamera-Subsystem verwendet für alle Auflösungen und Ausgabeformate ausschließlich die ANativeWindow-basierte Pipeline. Mehrere Streams können gleichzeitig konfiguriert werden, um einen einzelnen Frame an viele Ziele zu senden, z. B. an die GPU, den Videoencoder, RenderScript oder an app-sichtbare Puffer (RAW Bayer, verarbeitete YUV-Puffer oder JPEG-codierte Puffer).
Aus Gründen der Optimierung müssen diese Ausgabestreams im Voraus konfiguriert werden. Außerdem darf es nur eine begrenzte Anzahl davon geben. So können Speicher-Buffer vorab zugewiesen und die Kamerahardware konfiguriert werden, damit bei Anfragen mit mehreren oder unterschiedlichen aufgeführten Ausgabepipelines keine Verzögerungen oder Latenzen bei der Ausführung der Anfrage auftreten.
Weitere Informationen zu den Kombinationen mit garantierter Streamausgabe, die von der unterstützten Hardwareebene abhängen, finden Sie unter createCaptureSession()
.
Zuschneiden
Das Zuschneiden des vollständigen Pixelarrays (für den digitalen Zoom und andere Anwendungsfälle, bei denen ein kleineres Sichtfeld wünschenswert ist) wird über die Einstellung ANDROID_SCALER_CROP_REGION mitgeteilt. Diese Einstellung gilt pro Anfrage und kann sich ändern. Das ist entscheidend für die Implementierung eines flüssigen digitalen Zooms.
Die Region wird als Rechteck (x, y, width, height) definiert, wobei (x, y) die linke obere Ecke des Rechtecks beschreibt. Das Rechteck wird auf dem Koordinatensystem des aktiven Pixelarrays des Sensors definiert, wobei (0,0) das Pixel oben links im aktiven Pixelarray ist. Daher dürfen Breite und Höhe nicht größer sein als die im statischen Info-Feld ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY angegebenen Abmessungen. Die minimal zulässige Breite und Höhe werden von der HAL über das statische Info-Feld ANDROID_SCALER_MAX_DIGITAL_ZOOM gemeldet, das den maximal unterstützten Zoomfaktor beschreibt. Die minimale Breite und Höhe des Zuschneidebereichs sind daher:
{width, height} = { floor(ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY[0] / ANDROID_SCALER_MAX_DIGITAL_ZOOM), floor(ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY[1] / ANDROID_SCALER_MAX_DIGITAL_ZOOM) }
Wenn der Zuschnittsbereich bestimmte Anforderungen erfüllen muss (z. B. muss er an geraden Koordinaten beginnen und seine Breite/Höhe muss gerade sein), muss die HAL die erforderlichen Rundungen vornehmen und den endgültigen Zuschnittsbereich in die Metadaten der Ausgabeergebnisse schreiben. Wenn die HAL die Videostabilisierung implementiert, muss sie den Bereich für die resultierende Zuschneidung anpassen, um den Bereich zu beschreiben, der nach der Anwendung der Videostabilisierung tatsächlich in der Ausgabe enthalten ist. Im Allgemeinen muss eine App, die eine Kamera verwendet, das Sichtfeld anhand des zugeschnittenen Bereichs, der Abmessungen des Bildsensors und der Brennweite des Objektivs bestimmen können.
Da der Zuschnittsbereich für alle Streams gilt, die möglicherweise ein anderes Seitenverhältnis als der Zuschnittsbereich haben, ist der genaue Sensorbereich, der für jeden Stream verwendet wird, möglicherweise kleiner als der Zuschnittsbereich. Insbesondere sollte jeder Stream quadratische Pixel und sein Seitenverhältnis beibehalten, indem der definierte Zuschneidebereich minimal weiter zugeschnitten wird. Wenn das Seitenverhältnis des Streams breiter als der Zuschnittsbereich ist, sollte der Stream vertikal weiter zugeschnitten werden. Ist das Seitenverhältnis des Streams schmaler als der Zuschnittsbereich, sollte der Stream horizontal weiter zugeschnitten werden.
In allen Fällen muss der Stream-Zuschnitt im gesamten Zuschnittsbereich zentriert sein. Außerdem wird jeder Stream nur horizontal oder vertikal im Verhältnis zum gesamten Zuschnittsbereich zugeschnitten, niemals beides.
Wenn beispielsweise zwei Streams definiert sind: ein Stream mit 640 × 480 (Seitenverhältnis 4:3) und ein Stream mit einer Größe von 1280 × 720 (Seitenverhältnis von 16:9), werden unten für einige Beispiel-Anschnittbereiche die erwarteten Ausgabebereiche für jeden Stream auf einem hypothetischen 3-MP-Sensor (2.000 × 1.500 Pixel) gezeigt.
Zuschneidebereich: (500, 375, 1.000, 750) (Seitenverhältnis 4:3)
Streamzuschnitt: 640 × 480: (500, 375, 1.000, 750) (entspricht Zuschneidebereich)
Stream-Zuschnitt: 1280 × 720: (60, 60, 12)
Zuschneidebereich: (500, 375, 1333, 750) (Seitenverhältnis 16:9)
Stream-Zuschnitt für 640 × 480: (666, 375, 1000, 750)
Stream-Zuschnitt für 1280 × 720: (500, 375, 1333, 750) (entspricht dem Zuschneidebereich)
Zuschneidebereich: (500, 375, 750, 750) (Seitenverhältnis 1:1)
Zuschnitt für 640 × 480 Pixel: (500, 469, 750, 562)
Zuschnitt für 1280 × 720 Pixel: (500, 543, 750, 414)
Und noch ein letztes Beispiel: ein Stream mit quadratischem Seitenverhältnis von 1.024 × 1.024 statt des 480p-Streams:
Zuschneidebereich: (500, 375, 1.000, 750) (Seitenverhältnis 4:3)
Zuschnitt für Stream mit 1.024 × 1.024: (625, 375, 750, 750)
Zuschnitt für Stream mit 1.280 × 720: (500, 469, 1.000, 562)
Erneute Verarbeitung
Zusätzliche Unterstützung für Rohbilddateien wird durch die Unterstützung der Nachbearbeitung von RAW-Bayer-Daten bereitgestellt. Dank dieser Unterstützung kann die Kamerapipeline einen zuvor erfassten RAW-Puffer und Metadaten (einen gesamten Frame, der zuvor aufgenommen wurde) verarbeiten, um eine neue gerenderte YUV- oder JPEG-Ausgabe zu erstellen.
Zoom
Auf Geräten mit Android 11 oder höher kann eine App den Zoom (digital und optisch) einer Kamera über die Einstellung ANDROID_CONTROL_ZOOM_RATIO
verwenden.
Das Zoomverhältnis wird als Gleitkommafaktor definiert. Anstatt ANDROID_SCALER_CROP_REGION
für Zuschneiden und Zoomen zu verwenden, kann eine App ANDROID_CONTROL_ZOOM_RATIO
zum Steuern der Zoomstufe und ANDROID_SCALER_CROP_REGION
zum horizontalen und vertikalen Zuschneiden verwenden, um ein anderes Seitenverhältnis als das des nativen Kamerasensors zu erzielen.
Ein Mehrkamerasystem kann mehrere Objektive mit unterschiedlichen Brennweiten enthalten. Der Nutzer kann den optischen Zoom nutzen, indem er zwischen den Objektiven wechselt.
Die Verwendung von ANDROID_CONTROL_ZOOM_RATIO
bietet Vorteile in den folgenden Szenarien:
- Vom Weitwinkel- zu einem Teleobjektiv heranzoomen: Ein Gleitkommaverhältnis bietet eine bessere Genauigkeit im Vergleich zu ganzzahligen Werten von
ANDROID_SCALER_CROP_REGION
. - Heranzoomen vom Weitwinkel- zum Ultraweitwinkelobjektiv:
ANDROID_CONTROL_ZOOM_RATIO
unterstützt das Heranzoomen (< 1,0 f),ANDROID_SCALER_CROP_REGION
hingegen nicht.
Zoomverhältnis: 2,0; 1/4 des ursprünglichen Sichtfelds
Zuschneidebereich: (0, 0, 2000, 1500) (Seitenverhältnis 4:3)
Streamzuschnitt 640 × 480: (0, 0, 2.000, 1.500) (entspricht Zuschneidebereich)
20, 10, 10, 1280 ×
Zoomfaktor: 2,0; 1/4 des ursprünglichen Sichtfelds
Zuschneidebereich: (0, 187, 2000, 1125) (Seitenverhältnis 16:9)
Zuschnitt für 640 × 480 Pixel-Stream: (250, 187, 1500, 1125) (Pillarbox-Format)
Zuschnitt für 1280 × 720 Pixel-Stream: (0, 187, 2000, 1125) (entspricht dem Zuschneidebereich)
Zoomverhältnis: 0,5; 4-faches Originalsichtfeld (Wechsel vom Weitwinkel- zum Ultraweitwinkelobjektiv)
Zuschneidebereich: (250, 0, 1500, 1500) (Seitenverhältnis 1:1)
Zuschnitt für 640 × 480-Stream: (250, 187, 1500, 1125) (Letterbox-Format)
Zuschnitt für 1280 × 720-Stream: (250, 328, 1500, 844) (Letterbox-Format)
Wie in den obigen Grafiken zu sehen, ändert sich das Koordinatensystem des Ausschnitts in das effektive Sichtfeld nach dem Zoomen. Es wird durch das Rechteck mit den folgenden Abmessungen dargestellt: (0
, 0
, activeArrayWith
, activeArrayHeight
). Das Gleiche gilt für AE-/AWB-/AF-Regionen und Gesichter. Diese Änderung des Koordinatensystems gilt nicht für die RAW-Aufnahme und die zugehörigen Metadaten wie intrinsicCalibration
und lensShadingMap
.
Angenommen, der Ausgabestream 1 (640 × 480) ist der Sucherstream, kann ein 2,0-facher Zoom auf zwei Arten erreicht werden:
zoomRatio = 2.0
,scaler.cropRegion = (0, 0, 2000, 1500)
zoomRatio = 1.0
(Standard),scaler.cropRegion = (500, 375, 1000, 750)
Wenn in einer App android.control.aeRegions
auf das linke obere Viertel des Sichtfelds im Sucher festgelegt werden soll, musst du android.control.aeRegions
auf (0, 0, 1000, 750)
setzen und android.control.zoomRatio
auf 2.0
setzen. Alternativ kann die App android.control.aeRegions
auf die entsprechende Region von (500, 375, 1000, 750)
für android.control.zoomRatio
von 1.0
festlegen.