מצלמות USB חיצוניות

פלטפורמת Android תומכת בשימוש במצלמות USB שניתנות להפעלה באמצעות חיבור והפעלה (כלומר, מצלמות אינטרנט) באמצעות ממשק API של Android Camera2 לבין המצלמה HAL גרפי. בדרך כלל מצלמות אינטרנט תומכות סיווג וידאו USB (UVC) וב-Linux, Video4Linux (V4L) משמש לשליטה במצלמות UVC.

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

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

דוגמאות ומקורות

מידע נוסף על אופן ההטמעה של מצלמות USB זמין במצלמה החיצונית יישום של הפניית ספק ב- ExternalCameraProvider ההטמעות של המצלמה החיצונית ושל הסשן כלולות ExternalCameraDevice וגם ExternalCameraDeviceSession החל מרמת API 28, ה-API של הלקוח ב-Java כולל את EXTERNAL ברמת החומרה.

הטמעה

ההטמעה צריכה לתמוך android.hardware.usb.host תכונת המערכת.

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

  • החרגה של צומתי וידאו של מצלמות פנימיות
  • גבול עליון של גודל תמונה נתמך וקצב פריימים
  • מספר מאגרי הנתונים הזמניים בזמן אמת (jank לעומת זיכרון)

בנוסף לפרמטרים אלה, תוכלו להוסיף פרמטרים משלכם או לפתח מערכי הגדרות אישיות.

אופטימיזציות ספציפיות למכשיר

אפשר גם לשפר את הביצועים על ידי הוספת אופטימיזציות ספציפיות למכשיר.

העתקת/שינוי קנה מידה של מאגר נתונים זמני ופענוח/קידוד של JPEG

בהטמעות כלליות נעשה שימוש במעבד (CPU) (libyuv/libjpeg) אבל אפשר להחליף אותו ב- ספציפיות למכשיר.

פורמט פלט HAL

הטמעות כלליות משתמשות בפורמטים הבאים של פלט:

  • YUV_420_888 למאגרי נתונים זמניים של סרטון IMPLEMENTATION_DEFINED
  • YUV12 לכל מאגרי הנתונים הזמניים האחרים של IMPLEMENTATION_DEFINED

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

אימות

מכשירים עם תמיכה במצלמה חיצונית חייבים לעבור בהצלחה CTS של המצלמה. כבל ה-USB החיצוני מצלמת האינטרנט חייבת להישאר מחוברת למכשיר הספציפי במהלך כל הרצת הבדיקה. אחרת, מקרי בדיקה מסוימים ייכשלו.