Novità sul prodotto
Presentazione di CameraX 1.5: registrazione video potente e acquisizione di immagini di livello professionale
Lettura di 7 minuti
Il team di CameraX è entusiasta di annunciare la release della versione 1.5. Questo ultimo aggiornamento si concentra sull'offerta di funzionalità di livello professionale a portata di mano, semplificando al contempo la configurazione della sessione della videocamera.
Per la registrazione video, gli utenti possono ora acquisire senza sforzo video in slow motion o con frame rate elevato. Ancora più importante, la nuova API Feature Group ti consente di attivare con sicurezza combinazioni complesse come HDR a 10 bit e 60 FPS, garantendo risultati coerenti sui dispositivi supportati.
Per quanto riguarda l'acquisizione di immagini , hai la massima flessibilità grazie al supporto per l'acquisizione di file DNG (RAW) non elaborati e non compressi. Inoltre, ora puoi sfruttare l'output Ultra HDR anche quando utilizzi le potenti estensioni della videocamera.
Alla base di queste funzionalità c'è la nuova API SessionConfig, che semplifica la configurazione e la riconfigurazione della videocamera. Ora, esaminiamo i dettagli di queste nuove ed entusiasmanti funzionalità.
Registrazione video potente: alta velocità e combinazioni di funzionalità
CameraX 1.5 espande in modo significativo le sue funzionalità video, consentendo esperienze di registrazione più creative e robuste.
Video in slow motion e con frame rate elevato
Una delle funzionalità più attese, il video in slow motion, è ora disponibile. Ora puoi acquisire video ad alta velocità (ad es. 120 o 240 fps) e codificarli direttamente in un video in slow motion. In alternativa, puoi registrare con la stessa frequenza fotogrammi elevata per produrre video eccezionalmente fluidi.
L'implementazione è semplice se hai familiarità con l'API VideoCapture.
1. Verifica il supporto dell'alta velocità: utilizza il nuovo Recorder.getHighSpeedVideoCapabilities() metodo per verificare se il dispositivo supporta questa funzionalità.
val cameraInfo = cameraProvider.getCameraInfo(cameraSelector)
val highSpeedCapabilities = Recorder.getHighSpeedVideoCapabilities(cameraInfo)
if (highSpeedCapabilities == null) {
// This camera device does not support high-speed video.
return
}
2. Configura e associa il caso d'uso: utilizza videoCapabilities restituito (che contiene informazioni sulla qualità video supportata) per creare un oggetto HighSpeedVideoSessionConfig. Dopodiché, devi eseguire una query sugli intervalli di frequenza fotogrammi supportati tramite cameraInfo.getSupportedFrameRateRanges() e impostare l'intervallo desiderato. Richiama setSlowMotionEnabled(true) per registrare video in slow motion, altrimenti verranno registrati video con frame rate elevato. Il passaggio finale consiste nell'utilizzare il normale Recorder.prepareRecording().start() per avviare la registrazione del video.
val preview = Preview.Builder().build()
val quality = highSpeedCapabilities
.getSupportedQualities(DynamicRange.SDR).first()
val recorder = Recorder.Builder()
.setQualitySelector(QualitySelector.from(quality)))
.build()
val videoCapture = VideoCapture.withOutput(recorder)
val frameRateRange = cameraInfo.getSupportedFrameRateRanges(
HighSpeedVideoSessionConfig(videoCapture, preview)
).first()
val sessionConfig = HighSpeedVideoSessionConfig(
videoCapture,
preview,
frameRateRange = frameRateRange,
// Set true for slow-motion playback, or false for high-frame-rate
isSlowMotionEnabled = true
)
cameraProvider.bindToLifecycle(
lifecycleOwner, cameraSelector, sessionConfig)
// Start recording slow motion videos.
val recording = recorder.prepareRecording(context, outputOption)
.start(executor, {})
Compatibilità e limitazioni
La registrazione ad alta velocità richiede il supporto specifico di CameraConstrainedHighSpeedCaptureSession e CamcorderProfile. Esegui sempre il controllo delle funzionalità e attiva la registrazione ad alta velocità solo sui dispositivi supportati per evitare una cattiva esperienza utente. Al momento, questa funzionalità è supportata sulle videocamere posteriori di quasi tutti i dispositivi Pixel e su alcuni modelli di altri produttori.
Per ulteriori dettagli, consulta il post del blog.
Combina le funzionalità con sicurezza: l'API Feature Group
CameraX 1.5 introduce l'API Feature Group, che elimina le incertezze sulla compatibilità delle funzionalità. In base all'API di query di combinazione di funzionalità di Android 15 API, ora puoi attivare con sicurezza più funzionalità contemporaneamente, garantendo una sessione della videocamera stabile. Il gruppo di funzionalità supporta attualmente: HDR (HLG), 60 fps, stabilizzazione dell'anteprima e Ultra HDR. Ad esempio, puoi attivare contemporaneamente HDR, 60 fps e stabilizzazione dell'anteprima sulle serie Pixel 10 e Galaxy S25. Sono previsti miglioramenti futuri per includere la registrazione in 4K e lo zoom ultrawide.
L'API del gruppo di funzionalità consente due casi d'uso essenziali:
Caso d'uso 1: dare la priorità alla qualità migliore
Se vuoi acquisire utilizzando la migliore combinazione possibile di funzionalità, puoi fornire un elenco con priorità. CameraX tenterà di attivarle in ordine, selezionando la prima combinazione completamente supportata dal dispositivo.
val sessionConfig = SessionConfig(
useCases = listOf(preview, videoCapture),
preferredFeatureGroup = listOf(
GroupableFeature.HDR_HLG10,
GroupableFeature.FPS_60,
GroupableFeature.PREVIEW_STABILIZATION
)
).apply {
// (Optional) Get a callback with the enabled features to update your UI.
setFeatureSelectionListener { selectedFeatures ->
updateUiIndicators(selectedFeatures)
}
}
processCameraProvider.bindToLifecycle(activity, cameraSelector, sessionConfig)
In questo esempio, CameraX tenta di attivare le funzionalità in questo ordine:
- HDR + 60 FPS + stabilizzazione dell'anteprima
- HDR + 60 FPS
- HDR + stabilizzazione dell'anteprima
- HDR
- 60 FPS + stabilizzazione dell'anteprima
- 60 FPS
- Stabilizzazione dell'anteprima
- Nessuno
Caso d'uso 2: creazione di un'interfaccia utente delle impostazioni rivolta all'utente
Ora puoi riflettere con precisione quali combinazioni di funzionalità sono supportate nell'interfaccia utente delle impostazioni dell'app, disattivando i pulsanti di attivazione/disattivazione per le opzioni non supportate, come nell'immagine riportata di seguito.
Per determinare se disattivare un pulsante di attivazione/disattivazione, utilizza i seguenti codici per verificare il supporto della combinazione di funzionalità. Inizialmente, esegui una query sullo stato di ogni singola funzionalità. Una volta attivata una funzionalità, esegui di nuovo una query sulle funzionalità rimanenti con le funzionalità attivate per verificare se i relativi pulsanti di attivazione/disattivazione devono essere disattivati a causa di vincoli di compatibilità.
fun disableFeatureIfNotSuported(
enabledFeatures: Set<GroupableFeature>,
featureToCheck:GroupableFeature
) {
val sessionConfig = SessionConfig(
useCases = useCases,
requiredFeatureGroup = enabledFeatures + featureToCheck
)
val isSupported = cameraInfo.isFeatureGroupSupported(sessionConfig)
if (!isSupported) {
// disable the toggle for featureToCheck
}
}
Per ulteriori informazioni, consulta il post del blog sul gruppo di funzionalità .
Altri miglioramenti video
- Miglioramenti simultanei della videocamera: con CameraX 1.5.1, ora puoi associare contemporaneamente i casi d'uso Anteprima + ImageCapture + VideoCapture per ogni SingleCameraConfig in modalità non di composizione. Inoltre, in modalità di composizione (gli stessi casi d'uso con CompositionSettings), ora puoi impostare l'oggetto
CameraEffectapplicato al risultato della composizione finale. - Disattivazione dinamica dell'audio: ora puoi avviare una registrazione con l'audio disattivato utilizzando
PendingRecording.withAudioEnabled(boolean initialMuted)e consentire all'utente di riattivare l'audio in un secondo momento utilizzandoRecording.mute(boolean muted). - Gestione migliorata dello spazio di archiviazione insufficiente: ora CameraX invia in modo affidabile l'errore
VideoRecordEvent.Finalize.ERROR_INSUFFICIENT_STORAGE, consentendo all'app di gestire correttamente le situazioni di spazio di archiviazione insufficiente e di informare l'utente. - Low Light Boost: sui dispositivi supportati (come la serie Pixel 10), puoi attivare CameraControl.enableLowLightBoostAsync per illuminare automaticamente l'anteprima e gli stream video in ambienti bui.
Acquisizione di immagini di livello professionale
CameraX 1.5 introduce importanti aggiornamenti a ImageCapture per gli sviluppatori che richiedono la massima qualità e flessibilità.
Libera il controllo creativo con l'acquisizione DNG (RAW)
Per un controllo completo della post-elaborazione, CameraX ora supporta l'acquisizione DNG (RAW). In questo modo, puoi accedere ai dati delle immagini non elaborate e non compresse direttamente dal sensore della videocamera, consentendo l'editing e la correzione cromatica di livello professionale. L'API supporta l'acquisizione del solo file DNG o l'acquisizione simultanea di output JPEG e DNG. Per scoprire come acquisire contemporaneamente file JPEG e DNG, consulta il codice campione riportato di seguito.
val capabilities = ImageCapture.getImageCaptureCapabilities(cameraInfo)
val imageCapture = ImageCapture.Builder().apply {
if (capabilities.supportedOutputFormats
.contains(OUTPUT_FORMAT_RAW_JPEG)) {
// Capture both RAW and JPEG formats.
setOutputFormat(OUTPUT_FORMAT_RAW_JPEG)
}
}.build()
// ... bind imageCapture to lifecycle ...
// Provide separate output options for each format.
val outputOptionRaw = /* ... configure for image/x-adobe-dng ... */
val outputOptionJpeg = /* ... configure for image/jpeg ... */
imageCapture.takePicture(
outputOptionRaw,
outputOptionJpeg,
executor,
object : ImageCapture.OnImageSavedCallback {
override fun onImageSaved(results: OutputFileResults) {
// This callback is invoked twice: once for the RAW file
// and once for the JPEG file.
}
override fun onError(exception: ImageCaptureException) {}
}
)
Ultra HDR per le estensioni della videocamera
Ottieni il meglio di entrambi i mondi: la straordinaria fotografia computazionale delle estensioni della videocamera (come la modalità Foto notturna) combinata con il colore brillante e la gamma dinamica di Ultra HDR. Questa funzionalità è ora supportata su molti smartphone Android premium recenti, come le serie Pixel 9/10 e Samsung S24/S25.
// Support UltraHDR when Extension is enabled.
val extensionsEnabledCameraSelector = extensionsManager
.getExtensionEnabledCameraSelector(
CameraSelector.DEFAULT_BACK_CAMERA, ExtensionMode.NIGHT)
val imageCapabilities = ImageCapture.getImageCaptureCapabilities(
cameraProvider.getCameraInfo(extensionsEnabledCameraSelector)
val imageCapture = ImageCapture.Builder()
.apply {
if (imageCapabilities.supportedOutputFormats
.contains(OUTPUT_FORMAT_JPEG_ULTRA_HDR) {
setOutputFormat(OUTPUT_FORMAT_JPEG_ULTRA_HDR)
}
}.build()
Miglioramenti dell'API principale e dell'usabilità
Un nuovo modo di configurare: SessionConfig
Come mostrato negli esempi precedenti, SessionConfig è un nuovo concetto in CameraX 1.5. Centralizza la configurazione e semplifica l'API in due modi principali:
- Niente più chiamate
unbind()manuali: le API CameraX sono sensibili al ciclo di vita. Eseguirà implicitamente l'annullamento dell'associazione dei casi d'uso quando l'attività o un altroLifecycleOwnerviene eliminato. Tuttavia, l'aggiornamento dei casi d'uso o il cambio di videocamera richiede comunque di chiamareunbind()ounbindAll()prima di eseguire di nuovo l'associazione. Ora, con CameraX 1.5, quando associ un nuovoSessionConfig, CameraX aggiorna automaticamente la sessione, eliminando la necessità di chiamare unbind. - Controllo deterministico della frequenza fotogrammi: la nuova API
SessionConfigintroduce un modo deterministico per gestire la frequenza fotogrammi. A differenza del precedentesetTargetFrameRate, che era solo un suggerimento, questo nuovo metodo garantisce che l'intervallo di frequenza fotogrammi specificato venga applicato dopo la configurazione. Per garantire l'accuratezza, devi eseguire una query sulle frequenze fotogrammi supportate utilizzandoCameraInfo.getSupportedFrameRateRanges(SessionConfig). Passando l'oggettoSessionConfigcompleto, CameraX può determinare con precisione gli intervalli supportati in base alle configurazioni degli stream.
Camera-Compose è ora stabile
Sappiamo quanto ti piace Jetpack Compose e siamo felici di annunciare che la camera-compose libreria è ora stabile alla versione 1.5.1! Questa release include correzioni di bug critici relativi all'utilizzo di CameraXViewfinder con le funzionalità di Compose come moveableContentOf e Pager, oltre alla risoluzione di un problema di allungamento dell'anteprima. Continueremo ad aggiungere altre funzionalità a camera-compose nelle release future.
Miglioramenti di ImageAnalysis e CameraControl
- Regolazione della potenza della torcia: ottieni un controllo granulare sulla torcia del dispositivo con le nuove API. Puoi eseguire una query sulla potenza massima supportata utilizzando CameraInfo.getMaxTorchStrengthLevel() e poi impostare il livello desiderato con CameraControl.setTorchStrengthLevel().
- Supporto di NV21 in
ImageAnalysis: ora puoi richiedere il formato immagine NV21 direttamente daImageAnalysis, semplificando l'integrazione con altre librerie e API. Per attivare questa funzionalità, richiamaImageAnalysis.Builder.setOutputImageFormat(OUTPUT_IMAGE_FORMAT_NV21).
Inizia subito
Aggiorna oggi le dipendenze a CameraX 1.5 ed esplora le nuove ed entusiasmanti funzionalità. Non vediamo l'ora di vedere le tue creazioni.
Per utilizzare CameraX 1.5, aggiungi le seguenti dipendenze a libs.versions.toml. (Ti consigliamo di utilizzare la versione 1.5.1, che contiene molte correzioni di bug critici e miglioramenti simultanei della videocamera.)
[versions]
camerax = "1.5.1"
[libraries]
..
androidx-camera-core = { module = "androidx.camera:camera-core", version.ref = "camerax" }
androidx-camera-compose = { module = "androidx.camera:camera-compose", version.ref = "camerax" }
androidx-camera-view = { module = "androidx.camera:camera-view", version.ref = "camerax" }
androidx-camera-lifecycle = { group = "androidx.camera", name = "camera-lifecycle", version.ref = "camerax" }
androidx-camera-camera2 = { module = "androidx.camera:camera-camera2", version.ref = "camerax" }
androidx-camera-extensions = { module = "androidx.camera:camera-extensions", version.ref = "camerax" }
Quindi, aggiungi queste dipendenze a build.gradle.kts del modulo:
dependencies {
..
implementation(libs.androidx.camera.core)
implementation(libs.androidx.camera.lifecycle)
implementation(libs.androidx.camera.camera2)
implementation(libs.androidx.camera.view) // for PreviewView
implementation(libs.androidx.camera.compose) // for compose UI
implementation(libs.androidx.camera.extensions) // For Extensions
}
Hai domande o vuoi contattare il team di CameraX? Partecipa al gruppo di discussione per sviluppatori di CameraX o invia una segnalazione di bug:
Continua a leggere
-
Novità sul prodotto
L'ecosistema mobile è in continua evoluzione, portando con sé nuove opportunità e nuove minacce. Grazie a questi cambiamenti, Android e Google Play continuano a garantire che miliardi di utenti possano continuare a utilizzare le loro app con fiducia e che l'innovazione degli sviluppatori possa prosperare.
Vijaya Kaza • Lettura di 3 minuti
-
Novità sul prodotto
La release di Jetpack Compose di aprile 2026 è stabile. Questa release contiene la versione 1.11 dei moduli Compose principali (vedi il mapping BOM completo), gli strumenti di debug degli elementi condivisi, gli eventi del trackpad e altro ancora.
Meghan Mehta • Lettura di 5 minuti
-
Novità sul prodotto
Android Studio Panda 4 è ora stabile e pronto per essere utilizzato in produzione. Questa release include la modalità di pianificazione, la previsione della modifica successiva e altro ancora, semplificando la creazione di app Android di alta qualità.
Matt Dyor • Lettura di 5 minuti
Resta al passo con le novità
Ricevi ogni settimana nella tua casella di posta le ultime informazioni sullo sviluppo di Android.