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