פלטפורמת Android תומכת בשימוש במצלמות USB מסוג plug-and-play (כלומר, מצלמות אינטרנט) באמצעות Android Camera2 API הסטנדרטי וממשק המצלמה HAL. בדרך כלל, מצלמות אינטרנט תומכות במנהלי USB Video Class (UVC), וב-Linux, מנהל Video4Linux (V4L) משמש לצורך בקרה על מצלמות UVC.
התמיכה במצלמות אינטרנט מאפשרת להשתמש במכשירים בתרחישי שימוש קלים, כמו וידאו צ'אט וקיוסקים לתמונות. התכונה הזו לא מחליפה את ה-HALs הפנימיים הרגילים של המצלמה בטלפונים עם Android, והיא לא מיועדת לתמוך במשימות מורכבות שדורשות ביצועים גבוהים, כמו סטרימינג ברזולוציה גבוהה ובמהירות גבוהה, מציאות מדומה ושליטה ידנית ב-ISP, בחיישן או בעדשה.
תהליך ה-HAL של מצלמת ה-USB הוא חלק מספק המצלמה החיצונית, שמאזין לזמינות של התקני USB ומפרט את התקני המצלמה החיצונית בהתאם. לתהליך יש הרשאות ומדיניות SE דומה לתהליך ה-HAL המובנה של המצלמה. אפליקציות מצלמת אינטרנט של צד שלישי שמתקשרות ישירות עם מכשירי USB זקוקות לאותן הרשאות מצלמה כדי לגשת למכשירי UVC, כמו כל אפליקציית מצלמה רגילה.
דוגמאות ומקורות
מידע נוסף על הטמעת מצלמות USB זמין בהטמעה לדוגמה של ספק מצלמה חיצוני בכתובת ExternalCameraProvider
.
הטמעות המצלמה החיצונית והסשן כלולות ב-ExternalCameraDevice
וב-ExternalCameraDeviceSession
.
החל מרמת API 28, ממשק ה-API של לקוח Java כולל את רמת החומרה EXTERNAL
.
הטמעה
ההטמעה חייבת לתמוך בתכונה המערכת android.hardware.usb.host
.
צריך גם להפעיל את התמיכה בליבה (kernel) במכשירי UVC. כדי להפעיל את התכונה הזו, צריך להוסיף את הקטע הבא לקובצי defconfig
של הליבה הרלוונטית.
+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y
כדי להפעיל את ספק המצלמה החיצונית ב-build המתאים של המכשיר, שבו מתווספות ההרשאות הנדרשות של SELinux, ההגדרה של המצלמה החיצונית והתלות בספק המצלמה החיצונית, מבצעים את השלבים הבאים:
מוסיפים את קובץ התצורה של המצלמה החיצונית ואת הספרייה של המצלמה החיצונית ל-
device.mk
.+PRODUCT_PACKAGES += android.hardware.camera.provider-V1-external-service +PRODUCT_COPY_FILES += \ +device/manufacturerX/productY/external_camera_config.xml:$(TARGET_COPY_OUT_VENDOR)/etc/external_camera_config.xml
מוסיפים את שם הספק של המצלמה החיצונית למניפסט של Treble HAL במכשיר.
<hal format="aidl"> <name>android.hardware.camera.provider</name> <version>1</version> <interface> <name>ICameraProvider</name> <instance>internal/0</instance> + <instance>external/0</instance> </interface> </hal>
(אופציונלי) אם המכשיר פועל במצב העברה של Treble, מעדכנים את
sepolicy
כדי ש-cameraserver
תהיה לו גישה למצלמת ה-UVC.+# for external camera +allow cameraserver device:dir r_dir_perms; +allow cameraserver video_device:dir r_dir_perms; +allow cameraserver video_device:chr_file rw_file_perms;
דוגמה ל-external_camera_config.xml
(שורות זכויות היוצרים הושמטו).
<ExternalCamera> <Provider> <ignore> <!-- Internal video devices to be ignored by external camera HAL --> <id>0</id> <!-- No leading/trailing spaces --> <id>1</id> </ignore> </Provider> <!-- See ExternalCameraUtils.cpp for default values of Device configurations below --> <Device> <!-- Max JPEG buffer size in bytes--> <MaxJpegBufferSize bytes="3145728"/> <!-- 3MB (~= 1080p YUV420) --> <!-- Size of v4l2 buffer queue when streaming >= 30fps --> <!-- Larger value: more request can be cached pipeline (less janky) --> <!-- Smaller value: use less memory --> <NumVideoBuffers count="4"/> <!-- Size of v4l2 buffer queue when streaming < 30fps --> <NumStillBuffers count="2"/> <!-- List of maximum fps for various output sizes --> <!-- Any image size smaller than the size listed in Limit row will report fps (as minimum frame duration) up to the fpsBound value. --> <FpsList> <!-- width/height must be increasing, fpsBound must be decreasing--> <Limit width="640" height="480" fpsBound="30.0"/> <Limit width="1280" height="720" fpsBound="15.0"/> <Limit width="1920" height="1080" fpsBound="10.0"/> <!-- image size larger than the last entry will not be supported--> </FpsList> </Device> </ExternalCamera>
התאמה אישית
אתם יכולים לשפר את המצלמה של Android באמצעות אפשרויות התאמה אישית כלליות או אופטימיזציות ספציפיות למכשיר.
התאמות אישיות כלליות
אפשר להתאים אישית את ספק המצלמה החיצונית על ידי שינוי הקובץ external_camera_config.xml
. באופן ספציפי, לקוחות יכולים להתאים אישית את הפרמטרים הבאים:
- החרגת צמתים של וידאו ממצלמות פנימיות
- מגבלת הגודל והקצב של התמונות הנתמכות
- מספר מאגרי הנתונים הזמניים בזמן אמת (איכות ירודה לעומת שימוש בזיכרון)
בנוסף לפרמטרים האלה, אפשר להוסיף פרמטרים משלכם או לפתח הגדרות אישיות משלכם.
אופטימיזציות ספציפיות למכשיר
אפשר גם לשפר את הביצועים על ידי הוספת אופטימיזציות ספציפיות למכשיר.
העתקה/שינוי קנה מידה של מאגר ופענוח/קידוד של JPEG
בהטמעות כלליות נעשה שימוש ב-CPU (libyuv/libjpeg), אבל אפשר להחליף את זה באופטימיזציות ספציפיות למכשיר.
פורמט הפלט של HAL
בהטמעות כלליות נעשה שימוש בפורמטים הבאים של פלט:
YUV_420_888
למאגריIMPLEMENTATION_DEFINED
של וידאוYUV12
לכל שאר מאגרי ה-IMPLEMENTATION_DEFINED
כדי לשפר את הביצועים, אפשר להחליף את פורמטי הפלט בפורמטים יעילים ספציפיים למכשיר. אפשר גם לתמוך בפורמטים נוספים בהטמעה מותאמת אישית
אימות
מכשירים עם תמיכה במצלמה חיצונית חייבים לעבור את בדיקת ה-CTS של המצלמה. מצלמת ה-USB החיצונית חייבת להישאר מחוברת למכשיר הספציפי במהלך כל הרצת הבדיקה, אחרת חלק ממקרי הבדיקה יכשלו.