แพลตฟอร์ม Android รองรับการใช้กล้อง USB แบบปลั๊กแอนด์เพลย์ (นั่นคือเว็บแคม) โดยใช้ Android Camera2 API มาตรฐานและอินเทอร์เฟ ซ HAL ของกล้อง โดยทั่วไปเว็บแคมรองรับไดรเวอร์ USB video class (UVC) และบน Linux ไดรเวอร์ Video4Linux (V4L) มาตรฐานใช้เพื่อควบคุมกล้อง UVC
ด้วยการรองรับเว็บแคม ทำให้สามารถใช้อุปกรณ์ในกรณีการใช้งานขนาดเล็ก เช่น วิดีโอแชทและตู้ถ่ายรูป คุณลักษณะนี้ไม่ได้แทนที่ 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
เพิ่มชื่อผู้ให้บริการกล้องภายนอกลงในรายการ 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
โดยเฉพาะ ลูกค้าสามารถปรับแต่งพารามิเตอร์ต่อไปนี้ได้:
- ไม่รวมโหนดวิดีโอของกล้องภายใน
- ขนาดภาพและอัตราเฟรมที่รองรับขอบเขตบน
- จำนวนบัฟเฟอร์บนเครื่องบิน (jank เทียบกับการแลกเปลี่ยนหน่วยความจำ)
นอกจากพารามิเตอร์เหล่านี้แล้ว คุณยังสามารถเพิ่มพารามิเตอร์ของคุณเองหรือพัฒนาการกำหนดค่าของคุณเองได้
การเพิ่มประสิทธิภาพเฉพาะอุปกรณ์
คุณยังสามารถปรับปรุงประสิทธิภาพได้ด้วยการเพิ่มการเพิ่มประสิทธิภาพเฉพาะอุปกรณ์
การคัดลอก/ปรับขนาดบัฟเฟอร์ และการถอดรหัส/เข้ารหัส JPEG
การใช้งานทั่วไปใช้ CPU (libyuv/libjpeg) แต่คุณสามารถแทนที่สิ่งนี้ด้วยการเพิ่มประสิทธิภาพเฉพาะอุปกรณ์ได้
รูปแบบเอาต์พุต HAL
การใช้งานทั่วไปใช้รูปแบบเอาต์พุตต่อไปนี้:
-
YUV_420_888
สำหรับบัฟเฟอร์วิดีโอIMPLEMENTATION_DEFINED
-
YUV12
สำหรับบัฟเฟอร์IMPLEMENTATION_DEFINED
อื่นๆ ทั้งหมด
เพื่อปรับปรุงประสิทธิภาพ คุณสามารถแทนที่รูปแบบเอาต์พุตด้วยรูปแบบที่มีประสิทธิภาพเฉพาะอุปกรณ์ได้ คุณยังรองรับรูปแบบเพิ่มเติมในการใช้งานที่กำหนดเองได้อีกด้วย
การตรวจสอบ
อุปกรณ์ที่รองรับกล้องภายนอกจะต้องผ่าน กล้อง CTS เว็บแคม USB ภายนอกจะต้องเสียบปลั๊กอยู่กับอุปกรณ์เฉพาะในระหว่างการทดสอบทั้งหมด ไม่เช่นนั้นกรณีทดสอบบางกรณีจะล้มเหลว