צוות CameraX שמח להודיע על השקת גרסה 1.5. העדכון האחרון מתמקד בהוספת יכולות ברמה מקצועית, והופך את הגדרת המצלמה לקלה יותר מאי פעם.
בהקלטת וידאו, המשתמשים יכולים עכשיו לצלם בקלות סרטונים מדהימים בהילוך איטי או בקצב פריימים גבוה. חשוב מכך, ממשק ה-API החדש של קבוצת התכונות מאפשר להפעיל בביטחון שילובים מורכבים כמו HDR של 10 ביט ו-60 FPS, וכך להבטיח תוצאות עקביות במכשירים נתמכים.
בכל הנוגע לצילום תמונות, אתם נהנים מגמישות מקסימלית עם תמיכה בצילום קובצי DNG (RAW) לא מעובדים ולא דחוסים. בנוסף, עכשיו אתם יכולים להשתמש בפלט Ultra HDR גם כשאתם משתמשים בתוספים מתקדמים למצלמה.
התכונות האלה מבוססות על SessionConfig API החדש, שמייעל את ההגדרה וההגדרה מחדש של המצלמה. עכשיו נפרט על התכונות החדשות והמעניינות האלה.
הקלטת וידאו מתקדמת: שילוב של מהירות גבוהה ותכונות
גרסה 1.5 של CameraX מרחיבה באופן משמעותי את יכולות הווידאו, ומאפשרת חוויות הקלטה יצירתיות ויציבות יותר.
סרטונים בהילוך איטי ובקצב פריימים גבוה
אחת התכונות הכי מבוקשות שלנו, סרטונים בהילוך איטי, זמינה עכשיו. עכשיו אתם יכולים לצלם סרטון במהירות גבוהה (למשל, 120 או 240 פריימים לשנייה) ולקודד אותו ישירות לסרטון דרמטי בהילוך איטי. אפשר גם לצלם באותו קצב פריימים גבוה כדי ליצור סרטון חלק במיוחד.
אם אתם מכירים את ה-API של VideoCapture, ההטמעה פשוטה.
1. בודקים אם יש תמיכה במהירות גבוהה: משתמשים ב-method החדש Recorder.getHighSpeedVideoCapabilities() כדי לבדוק אם המכשיר תומך בתכונה הזו.
val cameraInfo = cameraProvider.getCameraInfo(cameraSelector)
val highSpeedCapabilities = Recorder.getHighSpeedVideoCapabilities(cameraInfo)
if (highSpeedCapabilities == null) {
// This camera device does not support high-speed video.
return
}2. מגדירים ומקשרים את תרחיש השימוש: משתמשים ב-videoCapabilities שהוחזר (שמכיל מידע על איכות הווידאו הנתמכת) כדי ליצור HighSpeedVideoSessionConfig. לאחר מכן, צריך לשלוח שאילתה לגבי טווחי קצב הפריימים הנתמכים באמצעות cameraInfo.getSupportedFrameRateRanges() ולהגדיר את הטווח הרצוי. מפעילים את setSlowMotionEnabled(true) כדי לצלם סרטונים בהילוך איטי. אחרת, המצלמה תצלם סרטונים בקצב פריימים גבוה. השלב האחרון הוא להשתמש בלחצן Recorder.prepareRecording().start() הרגיל כדי להתחיל לצלם את הסרטון.
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, {})תאימות ומגבלות
כדי להקליט במהירות גבוהה, נדרשת תמיכה ספציפית ב-CameraConstrainedHighSpeedCaptureSession וב-CamcorderProfile. כדי למנוע חוויית משתמש גרועה, תמיד צריך לבצע את בדיקת היכולת ולהפעיל הקלטה במהירות גבוהה רק במכשירים נתמכים. נכון לעכשיו, התכונה הזו נתמכת במצלמות האחוריות של כמעט כל מכשירי Pixel ובדגמים נבחרים של יצרנים אחרים.
פרטים נוספים זמינים בפוסט בבלוג.
שילוב תכונות בביטחון: Feature Group API
בגרסה 1.5 של CameraX הוספנו את Feature Group API, שמאפשר לכם לבדוק בקלות אם התכונות תואמות. על סמך API של שאילתות לשילוב תכונות ב-Android 15, עכשיו אתם יכולים להפעיל כמה תכונות ביחד בלי חשש, ולהבטיח סשן יציב של המצלמה. קבוצת התכונות תומכת כרגע ב: HDR (HLG), 60fps, ייצוב תצוגה מקדימה ו-Ultra HDR. לדוגמה, אתם יכולים להפעיל את התכונות HDR, 60fps וייצוב התצוגה המקדימה בו-זמנית במכשירי Pixel 10 ו-Galaxy S25. אנחנו מתכננים להוסיף בעתיד שיפורים כמו הקלטה באיכות 4K וזום רחב במיוחד.
Feature Group API מאפשר שני תרחישי שימוש חיוניים:
תרחיש לדוגמה 1: מתן עדיפות לאיכות הטובה ביותר
אם אתם רוצים לצלם באמצעות השילוב הטוב ביותר של תכונות, אתם יכולים לספק רשימה לפי סדר עדיפויות. CameraX ינסה להפעיל אותם לפי הסדר, ויבחר בשילוב הראשון שהמכשיר תומך בו באופן מלא.
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)בדוגמה הזו, CameraX מנסה להפעיל תכונות בסדר הבא:
- HDR + 60 FPS + ייצוב התצוגה המקדימה
- HDR + 60 פריימים לשנייה (FPS)
- HDR + ייצוב תצוגה מקדימה
- HDR
- 60 FPS + ייצוב תצוגה מקדימה
- 60 FPS
- ייצוב התצוגה המקדימה
- ללא
תרחיש לדוגמה 2: יצירת ממשק משתמש של הגדרות שגלוי למשתמשים
עכשיו אתם יכולים לשקף במדויק אילו שילובי תכונות נתמכים בממשק המשתמש של הגדרות האפליקציה, ולהשבית את המתגים של אפשרויות שלא נתמכות, כמו בתמונה שלמטה.
כדי לקבוע אם להשבית מתג, משתמשים בקודים הבאים כדי לבדוק אם יש תמיכה בשילוב התכונות. בהתחלה, שולחים שאילתה לגבי הסטטוס של כל תכונה בנפרד. אחרי שמפעילים תכונה, צריך לבדוק שוב את התכונות שנותרו יחד עם התכונות שהופעלו כדי לראות אם המתגים שלהן צריכים להיות עכשיו באפור בגלל אילוצי תאימות.
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
}
}מידע נוסף זמין בפוסט בבלוג בנושא קבוצות תכונות .
עוד סרטונים לשיפור הביצועים
- שיפורים במצלמה בו-זמנית: ב-CameraX 1.5.1, עכשיו אפשר לקשר תרחישי שימוש של Preview + ImageCapture + VideoCapture בו-זמנית לכל SingleCameraConfig במצב ללא קומפוזיציה. בנוסף, במצב קומפוזיציה (אותם תרחישי שימוש עם CompositionSettings), עכשיו אפשר להגדיר את
CameraEffectשמוחל על התוצאה הסופית של הקומפוזיציה. - השתקה דינמית: עכשיו אפשר להתחיל הקלטה במצב מושתק באמצעות
PendingRecording.withAudioEnabled(boolean initialMuted)ולאפשר למשתמש לבטל את ההשתקה מאוחר יותר באמצעותRecording.mute(boolean muted). - טיפול משופר במקרים של נפח אחסון לא מספיק: עכשיו CameraX שולח באופן מהימן את השגיאה
VideoRecordEvent.Finalize.ERROR_INSUFFICIENT_STORAGE, וכך האפליקציה יכולה לטפל בצורה חלקה במצבים של נפח אחסון נמוך וליידע את המשתמש. - שיפור התאורה: במכשירים נתמכים (כמו סדרת Pixel 10), אתם יכולים להפעיל את CameraControl.enableLowLightBoostAsync כדי להבהיר באופן אוטומטי את התצוגה המקדימה ואת שידורי הווידאו בסביבות חשוכות.
צילום תמונות באיכות מקצועית
גרסת CameraX 1.5 כוללת שדרוגים משמעותיים ל-ImageCapture למפתחים שדורשים איכות וגמישות מקסימליות.
שליטה יצירתית מלאה עם צילום בפורמט DNG (RAW)
כדי לאפשר שליטה מלאה בעיבוד שאחרי הצילום, CameraX תומכת עכשיו בצילום בפורמט DNG (RAW). כך אתם מקבלים גישה לנתוני התמונה הלא מעובדים והלא דחוסים ישירות מחיישן המצלמה, ויכולים לערוך את התמונה ולשנות את הצבעים שלה ברמה מקצועית. ה-API תומך בצילום קובץ DNG בלבד, או בצילום פלטים של JPEG ו-DNG בו-זמנית. בקוד לדוגמה שבהמשך מוסבר איך לצלם קובצי JPEG ו-DNG בו-זמנית.
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 לתוספי מצלמה
אתם יכולים ליהנות משני העולמות: הצילום הממוחשב המדהים של תוספי המצלמה (כמו מצב לילה) בשילוב עם הצבעים הבוהקים והטווח הדינמי של Ultra HDR. התכונה הזו נתמכת עכשיו בהרבה טלפונים מתקדמים עם Android, כמו סדרת Pixel 9/10 וסדרת 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()שיפורים בממשק ה-API העיקרי ובנוחות השימוש
דרך חדשה להגדיר: SessionConfig
כפי שמוצג בדוגמאות שלמעלה, SessionConfig הוא קונספט חדש ב-CameraX 1.5. הוא מרכז את ההגדרות ומפשט את ה-API בשתי דרכים עיקריות:
- אין יותר קריאות ידניות ל-
unbind(): ממשקי ה-API של CameraX מודעים למחזור החיים. הוא "יבטל את הקישור" של תרחישי השימוש באופן משתמע כשהפעילות אוLifecycleOwnerאחר יושמדו. אבל כדי לעדכן תרחישי שימוש או להחליף מצלמות, עדיין צריך להפעיל אתunbind()או אתunbindAll()לפני הקישור מחדש. עכשיו, ב-CameraX 1.5, כשמקשריםSessionConfigחדש, CameraX מעדכן את הסשן באופן חלק, בלי צורך בקריאות לביטול הקישור. - שליטה דטרמיניסטית בקצב הפריימים: ה-API החדש של
SessionConfigמציג דרך דטרמיניסטית לנהל את קצב הפריימים. בניגוד ל-setTargetFrameRateהקודם, שהיה רק רמז, השיטה החדשה הזו מבטיחה שטווח קצב הפריימים שצוין יופעל אחרי הגדרה מוצלחת. כדי להבטיח דיוק, צריך לשלוח שאילתה לגבי קצבי הפריימים הנתמכים באמצעותCameraInfo.getSupportedFrameRateRanges(SessionConfig). כשמעבירים את ה-SessionConfigהמלא, CameraX יכול לקבוע במדויק את הטווחים הנתמכים על סמך הגדרות הסטרימינג.
Camera-Compose עכשיו יציב
אנחנו יודעים כמה אתם נהנים מ-Jetpack Compose, ושמחים להודיע שהספרייה camera-compose יציבה עכשיו בגרסה 1.5.1! הגרסה הזו כוללת תיקוני באגים קריטיים שקשורים לשימוש ב-CameraXViewfinder עם תכונות של Compose כמו moveableContentOf ו-Pager, וגם פתרון לבעיה של מתיחת התצוגה המקדימה. נמשיך להוסיף עוד תכונות ל-camera-compose בגרסאות עתידיות.
שיפורים ב-ImageAnalysis וב-CameraControl
- כוונון עוצמת הפנס: ממשקי API חדשים מאפשרים שליטה מדויקת בפנס של המכשיר. אפשר לשלוח שאילתה לגבי העוצמה המקסימלית הנתמכת באמצעות CameraInfo.getMaxTorchStrengthLevel(), ואז להגדיר את הרמה הרצויה באמצעות CameraControl.setTorchStrengthLevel().
- תמיכה ב-NV21 ב-
ImageAnalysis: עכשיו אפשר לבקש את פורמט התמונה NV21 ישירות מ-ImageAnalysis, וכך לפשט את השילוב עם ספריות וממשקי API אחרים. כדי להפעיל את זה, צריך להפעיל אתImageAnalysis.Builder.setOutputImageFormat(OUTPUT_IMAGE_FORMAT_NV21).
מתחילים עוד היום
כדאי לעדכן את יחסי התלות ל-CameraX 1.5 כבר היום ולגלות את התכונות החדשות והמלהיבות. אנחנו כבר ממש סקרנים לראות מה תיצרו.
כדי להשתמש ב-CameraX 1.5, צריך להוסיף את יחסי התלות הבאים לקובץ libs.versions.toml. (מומלץ להשתמש בגרסה 1.5.1, שכוללת תיקוני באגים קריטיים רבים ושיפורים במצלמה בו-זמנית).
[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" }ואז מוסיפים את הקוד הבא ליחסי התלות של build.gradle.kts במודול:
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
}יש לכם שאלות או שאתם רוצים ליצור קשר עם צוות CameraX? הצטרפו לקבוצת הדיון של מפתחי CameraX או שלחו דוח על באג:
-
חדשות על המוצרהיום, במפגש של מפתחי Android, אנחנו מכריזים על הזמינות הרחבה של הרבה כלים וממשקי API שנועדו להסיר את החיכוך היומיומי ולתת לכם יותר גמישות ליצור אפליקציות Android נהדרות.
Matthew McCullough • משך הקריאה: 4 דקות -
חדשות על המוצרגרסת Android Studio Rabbit 2 יציבה ומוכנה לשימוש בסביבת הייצור. הגרסה הזו כוללת תכונות חשובות שמשפרות את הפיתוח, כמו Bring Your Own Agent, תכונות חדשות של אמולטור XR, עדכון של LeakCanary, כלי חדש לניהול מיומנויות של סוכנים, סקר קוד באמצעות AI ועוד.
Matthew Warner • משך הקריאה: 3 דקות -
חדשות על המוצראפליקציות שמטרגטות את הגרסה הבאה של Android לא יוכלו יותר לכתוב ישירות לאנשי קשר באמצעות ההרשאה WRITE_CONTACTS.
Roxanna Aliabadi Walker • משך הקריאה: 6 דקות
רוצים לקבל טיפים עדכניים לפיתוח Android ישירות לאימייל כל שבוע?