צוות CameraX שמח להודיע על השקת גרסה 1.5! העדכון האחרון הזה מתמקד בהנגשת יכולות ברמה מקצועית, ובהקלה על הגדרת סשן המצלמה יותר מאי פעם.
בנוגע להקלטת סרטונים, המשתמשים יכולים עכשיו לצלם בקלות סרטונים מדהימים בהילוך איטי או עם קצב פריימים גבוה. חשוב מכך, ממשק ה-API החדש של קבוצת התכונות מאפשר להפעיל בביטחון שילובים מורכבים כמו HDR של 10 ביט ו-60 FPS, וכך להבטיח תוצאות עקביות במכשירים נתמכים.
בנושא לכידת תמונות, אתם נהנים מגמישות מקסימלית עם תמיכה בלכידת קובצי DNG (RAW) לא מעובדים ולא דחוסים. בנוסף, עכשיו אפשר להשתמש בפלט Ultra HDR גם כשמשתמשים בתוספים חזקים למצלמה.
בבסיס התכונות האלה עומד SessionConfig API חדש, שמייעל את ההגדרה וההגדרה מחדש של המצלמה. עכשיו נפרט על התכונות החדשות והמעניינות האלה.
הקלטת סרטונים מתקדמת: מהירות גבוהה ושילוב של תכונות
גרסה CameraX 1.5 מרחיבה באופן משמעותי את יכולות הווידאו שלה, ומאפשרת חוויות הקלטה יצירתיות וחזקות יותר.
סרטון בהילוך איטי ובקצב פריימים גבוה
אחת התכונות שהכי ציפינו להן, סרטון בהילוך איטי, זמינה עכשיו. עכשיו אפשר לצלם סרטון במהירות גבוהה (למשל, 120 או 240 פריימים לשנייה) ולקודד אותו ישירות לסרטון דרמטי בהילוך איטי. אפשרות אחרת היא להקליט באותו קצב פריימים גבוה כדי ליצור סרטון חלק במיוחד.
ההטמעה פשוטה אם אתם מכירים את VideoCapture API.
1. בודקים אם יש תמיכה בצילום מהיר: משתמשים בשיטה החדשה 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
ב-CameraX 1.5 מוצג Feature Group API, שמבטל את הניחושים לגבי תאימות התכונות. בעזרת API השאילתות לשילוב תכונות של Android 15, אתם יכולים להפעיל כמה תכונות יחד בביטחון, ולהבטיח הפעלה יציבה של המצלמה. נכון לעכשיו, קבוצת התכונות תומכת ב: HDR (HLG), 60 פריימים לשנייה, ייצוב בתצוגה מקדימה ו-Ultra HDR. לדוגמה, אפשר להפעיל בו-זמנית את התכונות 'HDR', '60 fps' ו'ייצוב התצוגה המקדימה' במכשירי Pixel 10 ובמכשירי סדרת Galaxy S25. אנחנו מתכננים להוסיף בעתיד שיפורים נוספים, כולל הקלטה באיכות 4K וזום רחב במיוחד.
ממשק ה-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(): ממשקי CameraX API מודעים למחזור החיים. הוא יבטל את הקישור של תרחישי השימוש באופן מרומז כשהפעילות אוLifecycleOwnerאחר יושמדו. אבל כדי לעדכן תרחישי שימוש או להחליף מצלמות, עדיין צריך להתקשר אלunbind()או אלunbindAll()לפני שמבצעים שיוך מחדש. עכשיו, עם CameraX 1.5, כשמבצעים binding שלSessionConfigחדש, CameraX מעדכן את הסשן בצורה חלקה, כך שלא צריך לבצע קריאות unbind. - שליטה דטרמיניסטית בקצב הפריימים: ה-API החדש
SessionConfigמאפשר לנהל את קצב הפריימים בצורה דטרמיניסטית. בניגוד ל-setTargetFrameRateהקודם, שהיה רק רמז, השיטה החדשה הזו מבטיחה שטווח קצב הפריימים שצוין יוחל אחרי שההגדרה תתבצע בהצלחה. כדי לוודא שהנתונים מדויקים, צריך לשלוח שאילתה לגבי קצבי הפריימים הנתמכים באמצעותCameraInfo.getSupportedFrameRateRanges(SessionConfig). העברתSessionConfigמלאה מאפשרת ל-CameraX לקבוע במדויק את הטווחים הנתמכים על סמך הגדרות הסטרימינג.
התכונה 'הצעות להשלמת תמונה' במצלמה יציבה עכשיו
אנחנו יודעים כמה אתם נהנים מ-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 או דיווח על באג:
-
חדשות על מוצריםב-Google Play, אנחנו מרחיבים כל הזמן את פלטפורמת המינויים שלנו כדי לעזור לכם להגדיל את הצמיחה, להתאים את עצמכם למודלים עסקיים חדשים ולהגיע למשתמשים שלכם בדיוק במקום שבו הם נמצאים.
Sheenam Mittal • משך הקריאה: 4 דקות -
חדשות על מוצריםבשנה שעברה, פתחנו את Android Studio לכל מודל AI. היום אנחנו עושים את הצעד הבא ומשיקים תמיכה בסוכני קידוד לפי בחירתכם.
Matthew Warner • משך הקריאה: 3 דקות -
חדשות על מוצריםGooglebook הוא קטגוריה חדשה של מחשבים ניידים שמבוססת על פלטפורמת Android משותפת. חומרה עם ביצועים גבוהים של שותפים כמו HP, Dell, Lenovo, Acer ו-Asus משלבת בין הנוחות של מכשיר נייד לבין העוצמה של מחשב.
Fahd Imtiaz, Loryn Hairston • משך הקריאה: 4 דקות
רוצים לקבל טיפים עדכניים לפיתוח Android ישירות לאימייל כל שבוע?