แพลตฟอร์ม Android รองรับการใช้กล้อง USB แบบเชื่อมต่อแล้วเล่น (ซึ่งก็คือ เว็บแคม) โดยใช้มาตรฐาน API กล้อง 2 ของ Android และกล้อง ครึ่งวัน ของ Google โดยทั่วไปแล้ว เว็บแคมรองรับ คลาสวิดีโอ USB (UVC) และบน Linux มาตรฐาน Video4Linux (V4L) ไดรเวอร์ใช้ในการควบคุมกล้อง UVC
ด้วยการรองรับเว็บแคม อุปกรณ์สามารถใช้ในกรณีการใช้งานที่มีน้ำหนักเบา เช่น การแชทผ่านวิดีโอและซุ้มรูปภาพ ฟีเจอร์นี้ไม่ได้มาแทนที่ฟังก์ชันภายใน HAL ของกล้องในโทรศัพท์ Android และไม่ได้ออกแบบมาเพื่อ รองรับงานที่ซับซ้อนและเข้มงวดซึ่งต้องอาศัยประสิทธิภาพ รวมไปถึงงานที่มีความละเอียดสูง การสตรีมความเร็วสูง, AR และการควบคุม ISP/เซ็นเซอร์/เลนส์ด้วยตนเอง
กระบวนการ HAL ของกล้อง USB เป็นส่วนหนึ่งของผู้ให้บริการกล้องภายนอกที่ ฟังความพร้อมใช้งานของอุปกรณ์ USB และแจกแจงอุปกรณ์กล้องภายนอก ตามนั้น กระบวนการมีสิทธิ์และนโยบาย SE ที่คล้ายกับ กระบวนการ HAL ของกล้องในตัว แอปเว็บแคมของบุคคลที่สามที่สื่อสาร โดยตรงด้วยอุปกรณ์ USB ต้องใช้สิทธิ์เข้าถึงกล้องเดียวกันเพื่อเข้าถึง UVC อุปกรณ์เช่นเดียวกับแอปกล้องทั่วไป
ตัวอย่างและแหล่งที่มา
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีใช้กล้อง USB โปรดดูที่กล้องภายนอก
การใช้งานข้อมูลอ้างอิงจากผู้ให้บริการที่
ExternalCameraProvider
อุปกรณ์กล้องภายนอกและการใช้งานเซสชันจะรวมอยู่ใน
ExternalCameraDevice
และ
ExternalCameraDeviceSession
เริ่มต้นใน API ระดับ 28, Java Client API จะรวม
EXTERNAL
ระดับฮาร์ดแวร์
การใช้งาน
การติดตั้งใช้งานต้องสนับสนุน
android.hardware.usb.host
ฟีเจอร์ของระบบ
ต้องเปิดใช้การรองรับเคอร์เนลสำหรับอุปกรณ์ UVC ด้วย คุณสามารถเปิดดำเนินการได้โดย
กำลังเพิ่มข้อมูลต่อไปนี้ลงในไฟล์ defconfig
ของเคอร์เนลที่เกี่ยวข้อง
+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y
เพื่อเปิดใช้ผู้ให้บริการกล้องภายนอกในบิลด์ของอุปกรณ์ที่เกี่ยวข้อง เพิ่มสิทธิ์ SELinux ที่จำเป็น การกำหนดค่ากล้องภายนอก และ ทรัพยากร Dependency จากผู้ให้บริการกล้องภายนอก ให้ทำตามขั้นตอนต่อไปนี้
เพิ่มไฟล์การกำหนดค่ากล้องภายนอกและไลบรารีกล้องภายนอกไปยัง
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 ภายนอก ต้องเสียบเว็บแคมกับอุปกรณ์ที่เฉพาะเจาะจงตลอดการทดสอบ ไม่เช่นนั้น กรอบการทดสอบบางรายการอาจล้มเหลว