ได้รับอนุญาตภายใต้ใบอนุญาต Apache เวอร์ชัน 2.0 ("ใบอนุญาต") คุณไม่สามารถใช้ไฟล์นี้เว้นแต่จะเป็นไปตามใบอนุญาต คุณสามารถขอรับสำเนาใบอนุญาตได้ที่
http://www.apache.org/licenses/LICENSE-2.0
เว้นแต่กฎหมายที่เกี่ยวข้องจะกำหนดไว้หรือตกลงเป็นลายลักษณ์อักษร ซอฟต์แวร์ที่เผยแพร่ภายใต้ใบอนุญาตจะเผยแพร่ "ตามที่เป็นอยู่" โดยไม่มีการรับประกันหรือเงื่อนไขใดๆ ไม่ว่าจะโดยชัดแจ้งหรือโดยนัย ดูใบอนุญาตสำหรับภาษาที่เฉพาะเจาะจงซึ่งควบคุมสิทธิ์และข้อจำกัดภายใต้ใบอนุญาต -->
แพลตฟอร์ม Android รองรับการใช้กล้อง USB แบบ Plug-and-Play (นั่นคือเว็บแคม) โดยใช้ 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, การกำหนดค่ากล้องภายนอก และทรัพยากร 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>เชื่อมโยงอินสแตนซ์ผู้ให้บริการกล้อง AIDL
external/0กับhal_camera_serviceในไฟล์sepolicy/service_contextsของอุปกรณ์ ดูข้อมูลเพิ่มเติมได้ที่นโยบาย SEPolicy สำหรับ AIDL HALandroid.hardware.camera.provider.ICameraProvider/external/0 u:object_r:hal_camera_service:s0(ไม่บังคับ) หากอุปกรณ์ทำงานในโหมด 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
การติดตั้งใช้งานทั่วไปจะใช้ CPU (libyuv/libjpeg) แต่คุณสามารถแทนที่ด้วยการเพิ่มประสิทธิภาพเฉพาะอุปกรณ์ได้
รูปแบบเอาต์พุต HAL
การติดตั้งใช้งานทั่วไปจะใช้รูปแบบเอาต์พุตต่อไปนี้
YUV_420_888สำหรับวิดีโอIMPLEMENTATION_DEFINEDบัฟเฟอร์YUV12สำหรับบัฟเฟอร์IMPLEMENTATION_DEFINEDอื่นๆ ทั้งหมด
หากต้องการปรับปรุงประสิทธิภาพ คุณสามารถแทนที่รูปแบบเอาต์พุตด้วยรูปแบบที่มีประสิทธิภาพเฉพาะอุปกรณ์ได้ นอกจากนี้ คุณยังรองรับรูปแบบอื่นๆ ในการติดตั้งใช้งานที่กำหนดเองได้ด้วย
การตรวจสอบ
อุปกรณ์ที่รองรับกล้องภายนอกต้องผ่าน CTS ของกล้อง เว็บแคม USB ภายนอกต้องเสียบอยู่กับอุปกรณ์ที่เฉพาะเจาะจงตลอดการทดสอบ มิฉะนั้นกรอบการทดสอบบางรายการจะล้มเหลว