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

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