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

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

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

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

התאמה אישית

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

התאמות אישיות כלליות

אתה יכול להתאים אישית את ספק המצלמה החיצונית על ידי שינוי הקובץ external_camera_config.xml . באופן ספציפי, לקוחות יכולים להתאים אישית את הפרמטרים הבאים:

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

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

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

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

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

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

פורמט פלט HAL

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

  • YUV_420_888 למאגרים IMPLEMENTATION_DEFINED של וידאו
  • YUV12 עבור כל שאר המאגרים IMPLEMENTATION_DEFINED

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

מַתַן תוֹקֵף

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