מערכת Android מאפשרת למכשירים לתמוך בשידור בו-זמנית של מצלמות. לדוגמה, כך אפשר להפעיל בו-זמנית את המצלמה הקדמית ואת המצלמה האחורית במכשיר. החל מ-Android 11, Camera2 API כולל את השיטות הבאות שאפליקציות יכולות לבצע שיחה כדי לקבוע אם המצלמות תומכות בסטרימינג בו-זמנית הגדרות השידור הנתמכות.
getConcurrentCameraIds
קבלת קבוצת השילובים של המכשיר המחובר הנוכחי למצלמה מזהים שתומכים בהגדרת סשנים של מכשירי מצלמה בו-זמנית.isConcurrentSessionConfigurationSupported
הפונקציה בודקת אם קבוצת התקני המצלמה שסופקה והתאימות שלהם ניתן להגדיר תצורות של סשנים בו-זמנית.
קבוצת שילובים נדרשים של שידורים חיים שחייבים לתמוך בהם במהלך צפייה בו-זמנית
הם כלולים דרך מאפייני המצלמה של המכשיר
SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS
לנכס.
כל מכשיר מצלמה שמפורסם דרך getConcurrentStreamingCameraIds()
חייב לתמוך בהגדרות הבאות להבטחת שידור בו-זמנית.
יעד 1 | יעד 2 | |||
---|---|---|---|---|
סוג | גודל מקסימלי | סוג | גודל מקסימלי | תרחישים לדוגמה |
YUV | s1440p | עיבוד תמונות או סרטונים מתוך האפליקציה | ||
PRIV | 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 (1920 x 1440) או לרזולוציה המקסימלית הנתמכת בפורמט הספציפי שמוחזר על ידי StreamConfigurationMap.getOutputSizes()
.
מכשירים שהיכולות שלהם לא כוללות
ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE
חייבת לתמוך לפחות בשידור Y16 אחד, Dataspace::DEPTH
עם sVGA
במקרה של פעולה בו-זמנית, כאשר sVGA הוא הקטן מבין השניים.
הרזולוציות הבאות:
- רזולוציית פלט מקסימלית לפורמט הנתון
- 640 x 480
הטמעה
כדי לאפשר לאפליקציות לשלוח שאילתה למכשיר כדי לקבוע אם המצלמות שלו תומכות בסטרימינג בו-זמנית, צריך להטמיע את ממשק ה-HAL ICameraProvider@2.6
, שכולל את השיטות הבאות:
מידע נוסף על ההטמעה של ממשק ICameraProvider@2.6
HAL זמין בכתובת
בספריית ה-HAL של המצלמה האמולציה
EmulatedCameraProviderHWLImpl.cpp
.
אימות
כדי לבדוק שההטמעה של התכונה הזו פועלת כמצופה,
ConcurrentCameraTest.java
בדיקת CTS. מומלץ גם לבדוק באמצעות אפליקציה שפותחת כמה מצלמות ומפעילה אותן בו-זמנית.
בעיות בהקצאת משאבים
אם ממשקי HAL של מצלמה מכריזים על תמיכה בתפעול בו-זמני של מכשירי מצלמה, יכול להיות שיופיעו בעיות בהקצאת משאבים, במיוחד במקרה שיש מספיק משאבים של מעבד אותות תמונה (ISP) בטלפון כדי להעביר סטרימינג של המצלמה הקדמית והאחורית (או מצלמות אחרות) בו-זמנית, אבל לא במלוא הקיבולת שלהן. במקרה כזה, תכונת ה-HAL של המצלמה צריכה להקצות כמות מוגבלת משאבי חומרה לכל מכשיר מצלמה.
תרחיש לדוגמה
התרחיש הבא מדגים את הבעיה.
בעיה
הגדרות המכשיר הן:
- מזהה המצלמה
0
הוא מצלמה לוגית שמגובה על ידי מצלמה רחבה ורחבה במיוחד מצלמה, שכל אחת מהן תופסת משאב ISP אחד. - מזהה המצלמה
1
הוא מצלמה שמשתמשת במשאב ISP אחד.
למכשיר (טלפון) יש שני ספקי אינטרנט. אם מזהה המצלמה 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
אם אין אפשרות לתמוך בהגדרות השידור המלאות עבור
כל המצלמות פועלות בו-זמנית.