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

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

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

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

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

لمزيد من المعلومات حول طريقة تركيب كاميرات USB، راجِع الكاميرا الخارجية. مرجع التطبيق المرجعي ExternalCameraProvider يتم تضمين جهاز الكاميرا الخارجي وعمليات تنفيذ الجلسات في ExternalCameraDevice أو ExternalCameraDeviceSession بدءًا من المستوى 28 من واجهة برمجة التطبيقات، تشتمل واجهة برمجة تطبيقات عميل 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>

التخصيص

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

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

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

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

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

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

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

نسخ المخزن المؤقت أو تغيير حجمها وفك ترميز أو ترميز JPEG

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

تنسيق إخراج HAL

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

  • YUV_420_888 للتخزين المؤقت للفيديو IMPLEMENTATION_DEFINED
  • YUV12 لجميع المخازن الاحتياطية الأخرى البالغ عددها IMPLEMENTATION_DEFINED

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

التحقُّق

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