הזרמת מצלמה במקביל

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

  • 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 (1280 x 720) או לרזולוציה המקסימלית הנתמכת עבור הפורמט המסוים המוחזר על ידי StreamConfigurationMap.getOutputSizes() . s1440p מתייחס ל-1440p (1920 x 1440) או לרזולוציה המקסימלית הנתמכת עבור הפורמט המסוים המוחזר על ידי 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 חייבת להקצות משאבי חומרה מוגבלים לכל התקן מצלמה.

תרחיש לדוגמה

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

בְּעָיָה

למכשיר יש את התצורה הבאה:

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

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

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

פִּתָרוֹן

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

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

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

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

בעיה עם testDualCameraPreview

כאשר אתה מבצע את העדכונים שלמעלה, זה יכול ליצור בעיה בהתנהגות המותרת על ידי מבחן MultiViewTest.java#testDualCameraPreview .

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

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

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

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

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