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 kann es nur eine begrenzte Anzahl geben. So können Speicher- und Puffer 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 im Koordinatensystem des aktiven Pixel-Arrays des Sensors definiert. Dabei ist (0,0) das Pixel oben links im aktiven Pixel-Array. 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 minimale 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 Mindestbreite und -höhe des zugeschnittenen Bereichs 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 den Metadaten der Ausgabeergebnisse ausgeben. 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 sollten bei jedem Stream quadratische Pixel und das Seitenverhältnis beibehalten werden, indem der definierte Zuschneidebereich nur 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. Jeder Stream wird nur horizontal oder vertikal im Verhältnis zum gesamten Zuschnittsbereich zugeschnitten, niemals beides.
Wenn beispielsweise zwei Streams definiert sind, ein Stream mit 640 × 480 (4:3) und ein Stream mit 1280 × 720 (16:9), sehen Sie unten die erwarteten Ausgabebereiche für jeden Stream für einige Beispiel-Zuschnittsbereiche auf einem hypothetischen Sensor mit 3 MP (2.000 × 1.500 Pixel).
Zuschneidebereich: (500, 375, 1.000, 750) (Seitenverhältnis 4:3)
Zuschnitt für 640 × 480-Stream: (500, 375, 1.000, 750) (entspricht dem Zuschneidebereich)
Zuschnitt für 1.280 × 720-Stream: (500, 469, 1.000, 562)
![crop-region-43-ratio](https://source.android.com/static/docs/core/camera/images/crop-region-43-ratio.png?authuser=1&hl=de)
Abbildung 1: Bildverhältnis 4:3
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)
![crop-region-169-ratio](https://source.android.com/static/docs/core/camera/images/crop-region-169-ratio.png?authuser=1&hl=de)
Abbildung 2: Seitenverhältnis von 16:9
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)
![crop-region-11-ratio](https://source.android.com/static/docs/core/camera/images/crop-region-11-ratio.png?authuser=1&hl=de)
Abbildung 3: Seitenverhältnis 1:1
Und noch ein 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)
![crop-region-43-square-ratio](https://source.android.com/static/docs/core/camera/images/crop-region-43-square-ratio.png?authuser=1&hl=de)
Abbildung 4: Seitenverhältnis 4:3, quadratisch
Nochmalige Verarbeitung
Die Unterstützung für die Neuverarbeitung von RAW-Bayer-Daten bietet zusätzliche Unterstützung für Rohbilddateien. 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:
- Heranzoomen von einem Weitwinkelobjektiv auf ein Teleobjektiv: Ein Gleitkommaverhältnis bietet eine bessere Genauigkeit als Ganzzahlwerte 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.
Zoomfaktor: 2,0; 1/4 des ursprünglichen Sichtfelds
Zuschneidebereich: (0, 0, 2.000, 1.500) (Seitenverhältnis 4:3)
Zuschnitt für 640 × 480-Stream: (0, 0, 2.000, 1.500) (entspricht dem Zuschneidebereich)
Zuschnitt für 1280 × 720-Stream: (0, 187, 2.000, 1.125)
![zoom-ratio-2-crop-43](https://source.android.com/static/docs/core/camera/images/zoom-ratio-2-crop-43.png?authuser=1&hl=de)
Abbildung 5: 2,0-facher Zoom, Seitenverhältnis 4:3
Zoomfaktor: 2,0; 1/4 des ursprünglichen Sichtfelds
Zuschneidebereich: (0, 187, 2000, 1125) (Seitenverhältnis 16:9)
Zuschnitt für 640 × 480 Pixel: (250, 187, 1500, 1125) (Pillarbox-Format)
Zuschnitt für 1280 × 720 Pixel: (0, 187, 2000, 1125) (entspricht dem Zuschneidebereich)
![zoom-ratio-2-crop-169](https://source.android.com/static/docs/core/camera/images/zoom-ratio-2-crop-169.png?authuser=1&hl=de)
Abbildung 6 2,0-facher Zoom, Seitenverhältnis 16:9
Zoomverhältnis: 0,5; 4-faches Originalsichtfeld (Wechsel vom Weitwinkel- zum Ultraweitwinkelobjektiv)
Zuschneidebereich: (250, 0, 1.500, 1.500) (Seitenverhältnis 1:1)
Zuschnitt für 640 × 480-Stream: (250, 187, 1.500, 1.125) (Letterbox-Format)
Zuschnitt für 1.280 × 720-Stream: (250, 328, 1.500, 844) (Letterbox-Format)
![images/zoom-ratio-0.5-crop-11](https://source.android.com/static/docs/core/camera/images/zoom-ratio-0.5-crop-11.png?authuser=1&hl=de)
Abbildung 7. 0,5-facher Zoom, Seitenverhältnis 1:1
Wie in den obigen Grafiken zu sehen, ändert sich das Koordinatensystem des Ausschnitts in das effektive Sichtfeld nach dem Zoomen und wird durch das Rechteck mit den folgenden Abmessungen dargestellt: (0
, 0
, activeArrayWith
, activeArrayHeight
). Gleiches 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 eine App android.control.aeRegions
als das linke obere Viertel des Sucher-Sichtfelds festlegen soll, legen Sie android.control.aeRegions
auf (0, 0, 1000, 750)
und android.control.zoomRatio
auf 2.0
fest. 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.