סטרימינג ממצלמה בו-זמנית

מערכת Android מאפשרת למכשירים לתמוך בשידור בו-זמנית של מצלמות. עבור לדוגמה, זה מאפשר למכשיר להפעיל גם את המצלמה הקדמית וגם את המצלמה האחורית בו-זמנית. החל מ-Android 11, Camera2 API כולל את השיטות הבאות שאפליקציות יכולות לבצע שיחה כדי לקבוע אם המצלמות תומכות בסטרימינג בו-זמנית הגדרות השידור הנתמכות.

  • getConcurrentCameraIds: קבלת קבוצת השילובים של המכשיר המחובר הנוכחי למצלמה מזהים שתומכים בהגדרת סשנים של מכשירי מצלמה בו-זמנית.
  • isConcurrentSessionConfigurationSupported: הפונקציה בודקת אם קבוצת התקני המצלמה שסופקה והתאימות שלהם ניתן להגדיר תצורות של סשנים בו-זמנית.

קבוצת שילובים של מקורות נתונים חובה שחייבים לתמוך בהם במהלך צפייה בו-זמנית הם כלולים דרך מאפייני המצלמה של המכשיר SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS לנכס.

כל מכשיר מצלמה שמתפרסם דרך getConcurrentStreamingCameraIds() חייב לתמוך בהגדרות המובטחות הבאות לסטרימינג בו-זמנית.

יעד 1 יעד 2
סוג גודל מקסימלי סוג גודל מקסימלי תרחישים לדוגמה
YUV s1440p עיבוד תמונות או סרטונים מתוך האפליקציה
הרשאות s1440p ניתוח העינית באפליקציה
JPEG s1440p לא ניתן לצלם תמונות סטילס בעינית
YUV / PRIV s720p JPEG s1440p תמונת סטילס רגילה
YUV / PRIV s720p YUV / PRIV s1440p וידאו או עיבוד בתוך האפליקציה עם תצוגה מקדימה

מכשירים עם הקיבולת MONOCHROME (CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES כוללת CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME) תמיכה ב-Y8 חייבת לתמוך בהחלפה של שידורי YUV ב-Y8 באופן מלא שילובים של שידורי סטרימינג.

s720p מתייחס ל-720p (1280x720) או לרזולוציה המקסימלית הנתמכת פורמט מסוים שהוחזר על ידי StreamConfigurationMap.getOutputSizes(). s1440p מתייחס ל-1440p (1,920 x 1,440) או לרזולוציה המקסימלית הנתמכת עבור הפורמט המסוים המוחזר על ידי StreamConfigurationMap.getOutputSizes(). מכשירים שהיכולות שלהם לא כוללות ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE חייבת לתמוך לפחות בשידור Y16 אחד, Dataspace::DEPTH עם sVGA במקרה של פעולה בו-זמנית, כאשר sVGA הוא הקטן מבין השניים. הרזולוציות הבאות:

  • רזולוציית פלט מקסימלית לפורמט הנתון
  • 640 x 480

הטמעה

כדי לאפשר לאפליקציות לשלוח שאילתות למכשיר כדי לקבוע אם מצלמות שתומכות בסטרימינג בו-זמנית, מטמיעים את ICameraProvider@2.6 ממשק HAL, שכולל את השיטות הבאות:

מידע נוסף על ההטמעה של ממשק ICameraProvider@2.6HAL זמין בכתובת בספריית ה-HAL של המצלמה האמולציה EmulatedCameraProviderHWLImpl.cpp.

אימות

כדי לבדוק שההטמעה של התכונה הזו פועלת כמצופה, ConcurrentCameraTest.java בדיקת CTS. בנוסף, יש לבצע בדיקה באמצעות אפליקציה שפותחת מספר מצלמות ופועלת אותם בו-זמנית.

בעיות בהקצאת משאבים

אם רכיבי HAL של המצלמה מפרסמות תמיכה בפעולה בו-זמנית מצלמה, הם עלולים להיתקל בבעיות בהקצאת משאבים, במיוחד במצב שבו יש מספיק משאבים של מעבד אותות תמונה (ISP) את הטלפון כדי לשדר מהמצלמה הקדמית והאחורית (או אחרת) בו-זמנית, אך לא הקיבולת המלאה שלהם. במקרה כזה, תכונת ה-HAL של המצלמה צריכה להקצות כמות מוגבלת משאבי חומרה לכל מכשיר מצלמה.

תרחיש לדוגמה

התרחיש הבא מדגים את הבעיה.

בעיה

הגדרות המכשיר הן:

  • מזהה המצלמה 0 הוא מצלמה לוגית שמגובה על ידי מצלמה רחבה ורחבה במיוחד מצלמה, שכל אחת מהן תופסת משאב ISP אחד.
  • מזהה המצלמה 1 הוא מצלמה שלוקחת משאב אחד של ספק אינטרנט.

למכשיר (טלפון) יש שני ספקי אינטרנט. אם מזהה המצלמה 0 פתוח ויש סשן קיימת אפשרות שהמצלמה HAL שומרת שני ספקי ISP לצפות שימוש במצלמה רחבת במיוחד וגם במצלמה רחבה.

במקרה כזה, במצלמה הקדמית (מזהה 1) לא ניתן להגדיר שידורים כי שני ספקי האינטרנט נמצאים בשימוש.

הפתרון

כדי לפתור את הבעיה, ה-framework יכול לפתוח גם את מזהי המצלמות 0 וגם 1 לפני הגדרת סשנים, כדי לספק רמז ל-HAL של המצלמה להקצות משאבים (מכיוון שעכשיו הוא מצפה להפעלה בו-זמנית של מצלמות). עם זאת, יכולות להיות לכך יכולות מוגבלות, לדוגמה, יכול להיות שלא ניתן לשנות את מרחק התצוגה יכולת להתמודד עם יחס של טווח זום מלא (כי החלפת המצלמה הפיזית) יכול להיות שהמזהים בעייתיים).

כדי ליישם את הפתרון הזה, צריך לבצע את העדכונים הבאים provider@2.6::ICameraProvider::getConcurrentCameraStreamingCameraIds

  • ייפוי כוח לביצוע פעולה בו-זמנית של מצלמות, על ה-framework לפתוח את מכשירי המצלמה (@3.2::ICameraDevice::open) לפני הגדרת הסשנים במכשירים עם המצלמה. ההרשאה הזו מאפשרת להשתמש במצלמה לספקים של הקצאת משאבים בהתאם.

  • כדי לטפל בבעיה של אי-יכולת לטפל של טווח הזום, יש לוודא שאפליקציות המצלמה, כאשר משתמשים במצלמות בו-זמנית, מובטחות להשתמש בהגדרת הבקרה ZOOM_RATIO בין 1x ו- MAX_DIGITAL_ZOOM במקום ZOOM_RATIO_RANGE המלא (זו מונעת מעבר של מצלמות פיזיות בתוך הארגון, מה שעלול נדרש עוד ספקי אינטרנט).

בעיה ב-testDual CameraPreview

ביצוע העדכונים שלמעלה עשוי ליצור בעיה שקשורה להתנהגות מותרת לפני הבדיקה של MultiViewTest.java#testDualCameraPreview.

בבדיקה testDualCameraPreview לא מוגדר סשנים רק לאחר הפתיחה כל המצלמות. הוא מתבצע לפי הרצף הבא:

for each camera  in cameraDevices :
  device = openCamera(camera)
     createCaptureSession(device);

עם זאת, הוא עמיד בפני כשלים בפתיחת המצלמה ERROR_MAX_CAMERAS_IN_USE [1] אופן הפעולה הזה עשוי להשפיע על אפליקציות צד שלישי.

כי מצלמת ה-HAL לא מזהה את כל מזהי המצלמות שנפתחים לפעולה בו-זמנית לפני הגדרת סשנים, יכול להיות שיהיה קשה להקצות משאבי חומרה (בהנחה שיש תחרות כלשהי עליהם).

כדי לטפל בבעיה, שמירה על תאימות לאחור בנוסף תמיכה בסטרימינג בו-זמנית, תמיכה ב-HAL של המצלמה אמורה להיכשל ב-openCamera שיחות עם ERROR_MAX_CAMERAS_IN_USE אם אין אפשרות לתמוך בהגדרות השידור המלאות עבור כל המצלמות פועלות בו-זמנית.