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

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

من خلال إتاحة استخدام كاميرات الويب، يمكن استخدام الأجهزة في حالات الاستخدام البسيطة، مثل محادثات الفيديو وكبائن الصور. لا تحل هذه الميزة محل واجهات برمجة التطبيقات (HAL) المعتادة لوحدة التحكّم في كاميرا الهاتف على هواتف Android، كما أنّها غير مصمّمة لتوفير دعم للمهام المعقدة والمكثفة من حيث الأداء والتي تشمل البث بدقة عالية وبسرعة عالية والواقع المعزّز والتحكّم اليدوي في وحدة التحكّم في الصورة (ISP) أو أداة الاستشعار أو العدسة.

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

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

لمزيد من المعلومات حول كيفية استخدام كاميرات USB، يُرجى الاطّلاع على مرجع تنفيذ كاميرا خارجية المقدَّم من موفِّر الكاميرا على الرابط ExternalCameraProvider. يتم تضمين عمليات تنفيذ جلسة وجهاز الكاميرا الخارجية في ExternalCameraDevice و ExternalCameraDeviceSession. اعتبارًا من المستوى 28 من واجهة برمجة التطبيقات، تتضمّن واجهة برمجة التطبيقات Java Client 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>
    
  • (اختياري) إذا كان الجهاز يعمل في وضع Treble passthrough، عدِّل 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)، ولكن يمكنك استبدال ذلك باستخدام تحسينات خاصة بالجهاز.

تنسيق إخراج HAL

تستخدِم عمليات التنفيذ العامة تنسيقات الإخراج التالية:

  • YUV_420_888 لفيديوهات IMPLEMENTATION_DEFINED التي تتضمّن ميزة التخزين المؤقت
  • YUV12 لجميع ذاكرات التخزين المؤقت IMPLEMENTATION_DEFINED الأخرى

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

التحقُّق

يجب أن تجتاز الأجهزة التي تتيح استخدام كاميرا خارجية اختبار التوافق مع معيار CTS للكاميرا. يجب إبقاء كاميرا الويب USB الخارجية plugged في الجهاز المحدّد أثناء تنفيذ الاختبار بالكامل، وإلا ستتعذّر بعض حالات الاختبار.