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).
Zur Optimierung müssen diese Ausgabestreams im Voraus konfiguriert werden und es darf nur eine begrenzte Anzahl gleichzeitig vorhanden sein. Dies ermöglicht eine Vorabzuweisung von Arbeitsspeicherpuffern und die Konfiguration der Kamerahardware, sodass es zu keinen Verzögerungen oder Latenzen bei der Ausführung der Anfrage kommt, wenn Anfragen mit mehreren oder unterschiedlichen aufgeführten Ausgabepipelines gesendet werden.
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 digitalen Zoom und andere Anwendungsfälle, in denen ein kleineres Sichtfeld wünschenswert ist) wird über die Einstellung ANDROID_SCALER_CROP_REGION gesendet. 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 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 Kamera-App in der Lage sein, das Sichtfeld basierend auf dem Zuschnittbereich, den Abmessungen des Bildsensors und der Brennweite des Objektivs zu bestimmen.
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. Ist das Seitenverhältnis des Streams breiter als der zu beschneiden, sollte er weiter vertikal zugeschnitten werden. Ist das Seitenverhältnis des Streams schmaler als der Zuschnitt, sollte er weiter horizontal zugeschnitten werden.
In allen Fällen muss der Stream im gesamten Anbaubereich zentriert werden. Jeder Stream wird entweder horizontal oder vertikal relativ 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)
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)
Nochmalige Verarbeitung
Zusätzliche Unterstützung für Rohbilddateien wird durch die Unterstützung der Nachbearbeitung von RAW-Bayer-Daten bereitgestellt. Durch diese Unterstützung kann die Kamerapipeline einen zuvor erfassten RAW-Zwischenspeicher und Metadaten (einen ganzen Frame, der zuvor aufgezeichnet wurde) verarbeiten, um eine neue gerenderte YUV- oder JPEG-Ausgabe zu erzeugen.
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 mehr als ein Objektiv mit unterschiedlichen Brennweite enthalten und der Nutzer kann den optischen Zoom verwenden, indem er zwischen verschiedenen 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
. - Herauszoomen von einem Weitwinkel- auf ein Ultraweitwinkelobjektiv:
ANDROID_CONTROL_ZOOM_RATIO
unterstützt eine Herauszoomung (< 1,0f),ANDROID_SCALER_CROP_REGION
hingegen nicht.
Zoomverhältnis: 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)
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.