دوربین های USB خارجی

پلتفرم اندروید از استفاده از دوربین های USB وصل و پخش (یعنی وب کم) با استفاده از API استاندارد Android Camera2 و رابط دوربین HAL پشتیبانی می کند. وب‌کم‌ها معمولاً از درایورهای کلاس ویدیویی USB (UVC) پشتیبانی می‌کنند و در لینوکس، درایور استاندارد Video4Linux (V4L) برای کنترل دوربین‌های UVC استفاده می‌شود.

با پشتیبانی از وب کم، دستگاه ها را می توان در موارد استفاده سبک مانند چت ویدیویی و کیوسک های عکس استفاده کرد. این ویژگی جایگزین HAL‌های دوربین داخلی معمولی در تلفن‌های اندرویدی نمی‌شود و برای پشتیبانی از کارهای پیچیده و پرفورمنس که شامل پخش جریانی با وضوح بالا و سرعت بالا، AR، و ISP/حسگر/لنز دستی است، طراحی نشده است.

فرآیند HAL دوربین USB بخشی از ارائه‌دهنده دوربین خارجی است که به در دسترس بودن دستگاه USB گوش می‌دهد و دستگاه‌های دوربین خارجی را بر اساس آن شمارش می‌کند. این فرآیند دارای مجوزها و یک خط مشی SE مشابه فرآیند HAL دوربین داخلی است. برنامه‌های وب‌کم شخص ثالث که مستقیماً با دستگاه‌های USB ارتباط برقرار می‌کنند، به همان مجوزهای دوربین برای دسترسی به دستگاه‌های UVC مانند هر برنامه دوربین معمولی نیاز دارند.

مصادیق و منابع

برای اطلاعات بیشتر در مورد نحوه پیاده سازی دوربین های USB، به پیاده سازی مرجع ارائه دهنده دوربین خارجی در ExternalCameraProvider مراجعه کنید. دستگاه دوربین خارجی و اجرای جلسات در ExternalCameraDevice و ExternalCameraDeviceSession گنجانده شده است. با شروع API سطح 28، API کلاینت جاوا شامل سطح سخت افزار 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 سفارشی کنید. به طور خاص، مشتریان می توانند پارامترهای زیر را سفارشی کنند:

  • به استثنای گره های ویدئویی دوربین های داخلی
  • اندازه تصویر و نرخ فریم کران بالایی پشتیبانی می شود
  • تعداد بافرهای حین پرواز (معادل جاک در مقابل حافظه)

علاوه بر این پارامترها، می توانید پارامترهای خود را اضافه کنید یا تنظیمات خود را توسعه دهید.

بهینه سازی های خاص دستگاه

همچنین می‌توانید با افزودن بهینه‌سازی‌های خاص دستگاه، عملکرد را بهبود ببخشید.

کپی/مقیاس‌سازی بافر و رمزگشایی/کدگذاری JPEG

پیاده سازی های عمومی از CPU (libyuv/libjpeg) استفاده می کنند، اما می توانید آن را با بهینه سازی های خاص دستگاه جایگزین کنید.

فرمت خروجی HAL

پیاده سازی های عمومی از فرمت های خروجی زیر استفاده می کنند:

  • YUV_420_888 برای بافرهای IMPLEMENTATION_DEFINED ویدیو
  • YUV12 برای همه بافرهای IMPLEMENTATION_DEFINED دیگر

برای بهبود عملکرد، می توانید فرمت های خروجی را با فرمت های کارآمد مخصوص دستگاه جایگزین کنید. شما همچنین می توانید فرمت های اضافی را در یک پیاده سازی سفارشی پشتیبانی کنید

اعتبار سنجی

دستگاه‌هایی که از دوربین خارجی پشتیبانی می‌کنند باید CTS دوربین را پاس کنند. وب‌کم USB خارجی باید در طول کل اجرای آزمایشی به دستگاه خاص متصل بماند، در غیر این صورت برخی موارد آزمایشی با شکست مواجه خواهند شد.