กล้อง USB ภายนอก

แพลตฟอร์ม Android รองรับการใช้กล้อง USB แบบเสียบแล้วใช้งานได้ทันที (นั่นคือเว็บแคม) โดยใช้มาตรฐาน Android Camera2 API และอินเทอร์เฟซ HAL ของกล้อง โดยทั่วไปแล้ว เว็บแคมจะรองรับไดรเวอร์ USB Video Class (UVC) และใน Linux ระบบจะใช้ไดรเวอร์ Video4Linux (V4L) มาตรฐานเพื่อควบคุมกล้อง UVC

การรองรับเว็บแคมช่วยให้อุปกรณ์ใช้งานได้ใน Use Case ที่ไม่ซับซ้อน เช่น วิดีโอแชทและตู้ถ่ายภาพ ฟีเจอร์นี้ไม่ได้ใช้แทน HAL กล้องภายในทั่วไปในโทรศัพท์ Android และไม่ได้ออกแบบมาเพื่อรองรับงานที่ต้องใช้ประสิทธิภาพสูงและซับซ้อนซึ่งเกี่ยวข้องกับการสตรีมความละเอียดสูงและความเร็วสูง, 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
    
  • เพิ่มชื่อผู้ให้บริการกล้องภายนอกลงในไฟล์ Manifest ของ 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 ให้อัปเดต 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 ภายนอกต้องเสียบอยู่กับอุปกรณ์ที่ต้องการตลอดการทดสอบ มิเช่นนั้นเฟรมทดสอบบางรายการจะดำเนินการไม่สำเร็จ