מערכת 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.6
HAL זמין בכתובת
בספריית ה-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
אם אין אפשרות לתמוך בהגדרות השידור המלאות עבור
כל המצלמות פועלות בו-זמנית.