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 il rilascio della versione 1.5. Questo ultimo aggiornamento si concentra sull'introduzione 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 facilmente video mozzafiato in slow motion o ad alta frequenza di fotogrammi. 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 su tutti i 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 fotocamera.
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 entusiasmanti funzionalità.
Registrazione video potente: combinazioni di alta velocità e 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 ad alta frequenza fotogrammi
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 spettacolare. In alternativa, puoi registrare alla stessa frequenza fotogrammi elevata per produrre un video eccezionalmente fluido.
L'implementazione è semplice se hai familiarità con l'API VideoCapture.
1. Verifica del supporto dell'alta velocità: utilizza il nuovo metodo Recorder.getHighSpeedVideoCapabilities() 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 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 ad alta frequenza dei fotogrammi. L'ultimo passaggio consiste nell'utilizzare il normale Recorder.prepareRecording().start() per iniziare a registrare il 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 un'esperienza utente negativa. Al momento, questa funzionalità è supportata dalle fotocamere posteriori di quasi tutti i dispositivi Pixel e da 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 congetture sulla compatibilità delle funzionalità. In base alla query di combinazione delle funzionalità dell'API di Android 15, ora puoi attivare più funzionalità contemporaneamente, garantendo una sessione della fotocamera stabile. Il gruppo di funzionalità attualmente supporta: HDR (HLG), 60 fps, stabilizzazione dell'anteprima e Ultra HDR. Ad esempio, puoi attivare contemporaneamente HDR, 60 fps e Stabilizzazione anteprima su Pixel 10 e sulla serie Galaxy S25. I miglioramenti futuri prevedono la registrazione in 4K e lo zoom ultra grandangolare.
L'API Feature Group consente due casi d'uso essenziali:
Caso d'uso 1: dare la priorità alla migliore qualità
Se vuoi acquisire utilizzando la migliore combinazione possibile di funzionalità, puoi fornire un elenco con priorità. CameraX tenterà di attivarli 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 anteprima
- HDR + 60 FPS
- HDR + Preview Stabilization
- HDR
- 60 FPS + Stabilizzazione anteprima
- 60 FPS
- Anteprima stabilizzazione
- Nessuno
Scenario di test 2: creazione di un'interfaccia utente per le impostazioni rivolta agli utenti
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 seguente.
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 nuovamente una query sulle funzionalità rimanenti con quelle attivate per verificare se i relativi pulsanti di attivazione/disattivazione devono ora 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 saperne di più, consulta il post del blog del gruppo di funzionalità .
Altri miglioramenti video
- Miglioramenti della videocamera simultanea:con CameraX 1.5.1, ora puoi associare contemporaneamente i casi d'uso Anteprima, Acquisizione immagini e Acquisizione video per ogni SingleCameraConfig in modalità non composizione. Inoltre, in modalità di composizione (stessi casi d'uso con CompositionSettings), ora puoi impostare il
CameraEffectche viene applicato al risultato finale della composizione. - Disattivazione dinamica dell'audio:ora puoi avviare una registrazione con l'audio disattivato utilizzando
PendingRecording.withAudioEnabled(boolean initialMuted)e consentire all'utente di riattivarlo in un secondo momento utilizzandoRecording.mute(boolean muted). - Gestione migliorata dello spazio di archiviazione insufficiente: CameraX ora invia in modo affidabile l'errore
VideoRecordEvent.Finalize.ERROR_INSUFFICIENT_STORAGE, consentendo alla tua app di gestire correttamente le situazioni di spazio di archiviazione insufficiente e informare l'utente. - Low Light Boost: sui dispositivi supportati (come la serie Pixel 10), puoi attivare CameraControl.enableLowLightBoostAsync per aumentare automaticamente la luminosità dell'anteprima e dei flussi 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à.
Scatena il controllo creativo con l'acquisizione DNG (RAW)
Per un controllo completo del post-elaborazione, CameraX ora supporta l'acquisizione DNG (RAW). In questo modo, puoi accedere ai dati delle immagini non elaborati e non compressi direttamente dal sensore della fotocamera, consentendo l'editing e la correzione del colore 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 per fotocamera
Ottieni il meglio di entrambi i mondi: la straordinaria fotografia computazionale delle estensioni della fotocamera (come la modalità Notte) combinata con i colori brillanti 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 all'API principale e all'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. Verranno "scollegati" implicitamente i tuoi casi d'uso quando l'attività o un altroLifecycleOwnerviene eliminato. Tuttavia, l'aggiornamento dei casi d'uso o il cambio di videocamera richiedono comunque di chiamareunbind()ounbindAll()prima del re-binding. Ora, con CameraX 1.5, quando associ un nuovoSessionConfig, CameraX aggiorna automaticamente la sessione, eliminando la necessità di chiamate di disassociazione. - 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 verrà applicato dopo la configurazione. Per garantire l'accuratezza, devi eseguire query sulle frequenze fotogrammi supportate utilizzandoCameraInfo.getSupportedFrameRateRanges(SessionConfig). Passando l'SessionConfigcompleto, CameraX può determinare con precisione gli intervalli supportati in base alle configurazioni dello stream.
Camera-Compose è ora stabile
Sappiamo quanto ti piace Jetpack Compose e siamo felici di annunciare che la libreria camera-compose è ora stabile alla versione 1.5.1. Questa release include correzioni di bug critici relativi all'utilizzo di CameraXViewfinder con funzionalità di Compose come moveableContentOf e Pager, nonché la 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 dell'intensità della torcia:ottieni un controllo granulare sulla torcia del dispositivo con le nuove API. Puoi eseguire 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. Questa opzione viene attivata richiamandoImageAnalysis.Builder.setOutputImageFormat(OUTPUT_IMAGE_FORMAT_NV21).
Inizia subito
Aggiorna le dipendenze a CameraX 1.5 oggi stesso ed esplora le nuove 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" }Poi aggiungili alle dipendenze 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 entrare in contatto con 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
Al Google I/O 2026, abbiamo presentato il passaggio di Android da sistema operativo a sistema intelligente. Abbiamo anche mostrato come creare esperienze intelligenti in modo nativo con il sistema e portare la potenza dell'AI di Google nelle tue app.
Jingyu Shi • Lettura di 2 minuti
-
Novità sul prodotto
Siamo felici di annunciare che è stato aggiunto il supporto ufficiale per Unreal Engine e Godot per Android XR. Stiamo anche lanciando nuovi strumenti progettati per aumentare la produttività e abilitare nuove funzionalità XR: l'hub del motore Android XR e il framework di interazione Android XR.
Luke Hopkins, Ryan Bartley • Lettura di 4 minuti
-
Novità sul prodotto
Con il rilascio di Android 17, stiamo passando a uno standard di sviluppo iniziale adattivo. I tuoi utenti non si affidano più a un unico fattore di forma, ma passano da smartphone, pieghevoli, tablet, laptop, display per auto e ambienti XR immersivi durante la giornata.
Fahd Imtiaz • Lettura di 4 minuti
Resta al passo con le novità
Ricevi ogni settimana gli ultimi approfondimenti sullo sviluppo per Android direttamente nella tua casella di posta.