צוות CameraX שמח להודיע על השקת גרסה 1.5! העדכון האחרון הזה מתמקד בהנגשת יכולות ברמה מקצועית, ובהקלה על הגדרת סשן המצלמה יותר מאי פעם.
בנוגע לצילום סרטונים, המשתמשים יכולים עכשיו לצלם בקלות סרטונים מדהימים בהילוך איטי או עם קצב פריימים גבוה. חשוב מכך, Feature Group API החדש מאפשר לכם להפעיל בביטחון שילובים מורכבים כמו 10-bit HDR ו-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 וזום רחב במיוחד.
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 + Preview Stabilization
- HDR + 60 פריימים לשנייה
- 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חדש, המערכת מעדכנת את הסשן בצורה חלקה, בלי שצריך לבצע קריאות unbind. - שליטה דטרמיניסטית בקצב הפריימים: ממשק
SessionConfigAPI החדש מציג דרך דטרמיניסטית לניהול קצב הפריימים. בניגוד ל-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 או שליחת דוח על באג:
-
חדשות על מוצריםהיום אנחנו מציינים באופן רשמי חמש שנים מאז ההשקה של Jetpack Compose 1.0. מאז גרסה 1.0, שהשקתה הוכרזה ב-28 ביולי 2021, ועד לגרסה 1.11 האחרונה, ראינו את ממשקי ה-API מתפתחים באופן משמעותי במהלך השנים, ואנחנו רוצים לעצור לרגע ולחגוג את זה.
Rebecca Franks, Nick Butcher, Loryn Hairston • 5 min read -
חדשות על מוצריםגרסת Android Studio Quail 2 יציבה ומוכנה לשימוש בסביבת ייצור. היא מביאה שינוי לסביבת הפיתוח המשולבת (IDE) עם תהליכי עבודה מקבילים של סוכנים, פרופילים של דליפות זיכרון שמשולבים באופן מקורי ותיקון קריסות בהתאם להקשר.
Amman Asfaw • משך הקריאה: 3 דקות -
חדשות על מוצריםבחודש מרץ השקנו את Android Bench – טבלת ההשוואה של מודלי LLM למשימות פיתוח של Android בעולם האמיתי. מאז, שיפרנו את ההשוואה לשוק על סמך המשוב שלכם, כולל הערכה של מודלים עם משקל פתוח והוספה של מדדי עלות ויעילות לטבלת ההשוואה.
Zoe Lopez-Latorre • משך הקריאה: 3 דקות
רוצים לקבל טיפים עדכניים לפיתוח Android ישירות לאימייל כל שבוע?