كاميرات USB خارجية

يدعم نظام Android الأساسي استخدام كاميرات USB للتوصيل والتشغيل (أي كاميرات الويب) باستخدام واجهة برمجة تطبيقات Android Camera2 القياسية وواجهة HAL للكاميرا. تدعم كاميرات الويب بشكل عام برامج تشغيل فئة فيديو USB (UVC) وفي نظام التشغيل Linux، يتم استخدام برنامج تشغيل Video4Linux (V4L) القياسي للتحكم في كاميرات UVC.

ومن خلال دعم كاميرات الويب، يمكن استخدام الأجهزة في حالات الاستخدام الخفيف مثل محادثات الفيديو وأكشاك الصور. لا تحل هذه الميزة محل HALs للكاميرا الداخلية النموذجية على هواتف Android وليست مصممة لدعم المهام المعقدة كثيفة الأداء التي تتضمن البث عالي الدقة والسرعة والواقع المعزز والتحكم اليدوي في مزود خدمة الإنترنت/المستشعر/العدسة.

تعد عملية HAL لكاميرا USB جزءًا من موفر الكاميرا الخارجية الذي يستمع إلى توفر جهاز USB ويعدد أجهزة الكاميرا الخارجية وفقًا لذلك. تحتوي العملية على أذونات وسياسة SE مشابهة لعملية HAL في الكاميرا المدمجة. تتطلب تطبيقات كاميرا الويب التابعة لجهات خارجية والتي تتواصل مباشرة مع أجهزة USB نفس أذونات الكاميرا للوصول إلى أجهزة UVC كما هو الحال مع أي تطبيق كاميرا عادي.

الأمثلة والمصادر

لمزيد من المعلومات حول كيفية تنفيذ كاميرات USB، راجع التنفيذ المرجعي لموفر الكاميرا الخارجية على ExternalCameraProvider . يتم تضمين جهاز الكاميرا الخارجية وتطبيقات الجلسة في ExternalCameraDevice و ExternalCameraDeviceSession . بدءًا من مستوى واجهة برمجة التطبيقات (API) 28، تشتمل واجهة برمجة تطبيقات عميل Java على مستوى الأجهزة EXTERNAL .

تطبيق

يجب أن يدعم التنفيذ ميزة نظام android.hardware.usb.host .

يجب أيضًا تمكين دعم Kernel لأجهزة UVC. يمكنك تمكين ذلك عن طريق إضافة ما يلي إلى ملفات defconfig kernel المعنية.

+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>

التخصيص

يمكنك تحسين كاميرا Android إما من خلال خيارات التخصيص العامة أو التحسينات الخاصة بالجهاز.

التخصيصات العامة

يمكنك تخصيص موفر الكاميرا الخارجية عن طريق تعديل ملف external_camera_config.xml . على وجه التحديد، يمكن للعملاء تخصيص المعلمات التالية:

  • باستثناء عقد الفيديو للكاميرات الداخلية
  • حجم الصورة المدعوم والحد الأعلى لمعدل الإطارات
  • عدد المخازن المؤقتة على متن الطائرة (المقايضة غير المرغوب فيها مقابل الذاكرة)

بالإضافة إلى هذه المعلمات، يمكنك إضافة المعلمات الخاصة بك أو تطوير التكوينات الخاصة بك.

تحسينات خاصة بالجهاز

يمكنك أيضًا تحسين الأداء عن طريق إضافة تحسينات خاصة بالجهاز.

نسخ/قياس المخزن المؤقت وفك تشفير/تشفير JPEG

تستخدم التطبيقات العامة وحدة المعالجة المركزية (libyuv/libjpeg) ولكن يمكنك استبدال ذلك بتحسينات خاصة بالجهاز.

تنسيق إخراج هال

تستخدم التطبيقات العامة تنسيقات الإخراج التالية:

  • YUV_420_888 للفيديو IMPLEMENTATION_DEFINED المخازن المؤقتة
  • YUV12 لكافة المخازن المؤقتة IMPLEMENTATION_DEFINED الأخرى

لتحسين الأداء، يمكنك استبدال تنسيقات الإخراج بتنسيقات فعالة خاصة بالجهاز. يمكنك أيضًا دعم التنسيقات الإضافية في تنفيذ مخصص

تصديق

يجب أن تجتاز الأجهزة التي تدعم الكاميرا الخارجية كاميرا CTS . يجب أن تظل كاميرا الويب USB الخارجية متصلة بالجهاز المحدد أثناء تشغيل الاختبار بالكامل، وإلا ستفشل بعض حالات الاختبار.