สำหรับอุปกรณ์ที่ใช้ Android 14-QPR1 ขึ้นไป Android รองรับการใช้อุปกรณ์เป็นเว็บแคม USB อุปกรณ์ Android ที่รองรับฟีเจอร์นี้จะโฆษณา
เป็นอุปกรณ์ UVC ซึ่งช่วยให้โฮสต์ USB จำนวนมากที่มีระบบปฏิบัติการ
ต่างๆ (เช่น Linux, macOS, Windows และ ChromeOS) ใช้กล้องของอุปกรณ์เป็นเว็บแคมได้
บริการ DeviceAsWebcam
รองรับฟีเจอร์นี้เพื่อใช้อุปกรณ์เป็นเว็บแคม
บริการ DeviceAsWebcam
บริการ DeviceAsWebcam
ใน AOSP มีกิจกรรมแสดงตัวอย่าง
(DeviceAsWebcamPreview.java
) ที่ช่วยให้ผู้ใช้จัดเฟรมฉากได้ กิจกรรมแสดงตัวอย่างช่วยให้ผู้ใช้ทำสิ่งต่อไปนี้ได้
ดูตัวอย่างฟีดเว็บแคมบนเครื่องโฮสต์ก่อนเริ่มสตรีม
ปรับแต่งฟีดจากเว็บแคมที่ส่งไปยังโฮสต์ได้ดังนี้
- เลือกกล้องที่จะสตรีม ไม่ว่าจะเป็นกล้องหน้าหรือกล้องหลัง
- การเลือกระดับการซูมโดยใช้แถบเลื่อนหรือปุ่ม
- การแตะภูมิภาคใดภูมิภาคหนึ่งของตัวอย่างเพื่อโฟกัสหรือยกเลิกการโฟกัส ในภูมิภาค
กิจกรรมแสดงตัวอย่างใช้ได้กับฟีเจอร์การช่วยเหลือพิเศษทั่วไปใน Android เช่น TalkBack, การเข้าถึงด้วยสวิตช์ และการเข้าถึงด้วยเสียง
รูปที่ 1 ฟีดจากเว็บแคมที่สตรีมไปยังโฮสต์พร้อมตัวอย่างที่ควบคุมฟีด
สถาปัตยกรรม
สถาปัตยกรรมที่รองรับการใช้อุปกรณ์เป็นเว็บแคมแสดงอยู่ใน
รูปที่ 2 ต่อไปนี้จะอธิบายขั้นตอนการโต้ตอบของDeviceAsWebcam
บริการกับเฟรมเวิร์ก Android ที่เหลือ
- ผู้ใช้เลือกตัวเลือกเว็บแคม USB ในแอปการตั้งค่า
- แอปการตั้งค่าจะส่งการเรียก Binder ไปยัง
system_server
ผ่านคลาสUsbManager
เพื่อแจ้งให้ทราบว่ามีการเลือกFUNCTION_UVC
- เซิร์ฟเวอร์ระบบจะดำเนินการต่อไปนี้
- แจ้ง HAL ของอุปกรณ์ USB ให้เรียกฟังก์ชันอุปกรณ์ UVC ผ่านการเรียกใช้
setUsbFunctions
HAL interface - แจ้ง HAL ของอุปกรณ์ USB ให้กำหนดค่าไดรเวอร์อุปกรณ์ UVC โดยใช้ ConfigFs
- แจ้ง HAL ของอุปกรณ์ USB ให้เรียกฟังก์ชันอุปกรณ์ UVC ผ่านการเรียกใช้
- เมื่อได้รับโปรแกรมเรียกกลับจาก HAL ของแกดเจ็ต
system_server
จะส่งการออกอากาศไปยังเฟรมเวิร์กเพื่อให้บริการDeviceAsWebcam
รับไป - ไดรเวอร์แกดเจ็ต USB จะเริ่มสตรีมเว็บแคมเมื่อได้รับคำสั่งการกำหนดค่าจากโฮสต์ผ่านโหนด V4L2 ที่
/dev/video*
รูปที่ 2 สถาปัตยกรรม DeviceAsWebcam
การใช้งาน
ส่วนนี้จะอธิบายวิธีรองรับการใช้อุปกรณ์ Android เป็นเว็บแคม
การสนับสนุนเคอร์เนล
สำหรับ Android 14 ขึ้นไป Generic Kernel Image (GKI) จะเปิดใช้ไดรเวอร์ แกดเจ็ต UVC โดยค่าเริ่มต้น (ดูรายละเอียดในแพตช์ AOSP)
รองรับ UVC ใน HAL ของอุปกรณ์
ตั้งแต่ Android 14 เป็นต้นไป ฟังก์ชัน UVC จะรวมอยู่ในอินเทอร์เฟซ HAL ของ
GadgetFunction.aidl
สำหรับ Gadget HAL ระบบจะติดตั้ง UVC
gadget ไปยัง ConfigFS ในลักษณะเดียวกับฟังก์ชัน ConfigFS อื่นๆ เช่น MTP หรือ ADB
หากต้องการใช้ Gadget HAL ให้แก้ไขเพื่อติดตั้งฟังก์ชัน UVC ไปยัง ConfigFS ต่อไปนี้เป็นตัวอย่างข้อมูลโค้ดของการติดตั้งใช้งาน HAL ของ Gadget ที่รองรับฟังก์ชัน UVC
UsbGadget::setCurrentUsbFunctions(long functions) {
...
// Existing functions
if ((functions & GadgetFunction::MTP) != 0) {
...
linkFunction("ffs.mtp"); // Mount to ConfigFS
...
}
...
// UVC function follows the same pattern!
if ((functions & GadgetFunction::UVC) != 0) {
...
linkFunction("uvc.0"); // Mount to ConfigFS
...
}
...
}
เมื่ออุปกรณ์ทำหน้าที่เป็นเว็บแคม ให้ตรวจสอบว่า HAL ของอุปกรณ์ USB กำลังโฆษณา ชุดค่า VID/PID ที่เหมาะสม
เนื่องจากตรรกะ UVC ทั้งหมดอยู่ใน init ของผู้ให้บริการหรือในDeviceAsWebcam
บริการ จึงไม่จำเป็นต้องมีตรรกะเฉพาะของ UVC อื่นนอกเหนือจากการลิงก์สัญลักษณ์ฟังก์ชัน UVC ไปยัง ConfigFS ใน HAL ของอุปกรณ์
ดูคำแนะนำเพิ่มเติมเกี่ยวกับการติดตั้งใช้งานได้ที่โค้ดตัวอย่างต่อไปนี้ใน AOSP
ตั้งค่า ConfigFS ด้วยการกำหนดค่า UVC
หากต้องการแจ้งให้ไดรเวอร์แกดเจ็ต UVC ทราบว่ารูปแบบ ขนาด และอัตราเฟรมใดที่เว็บแคม Android รองรับ ให้ตั้งค่า ConfigFS ด้วยการกำหนดค่า UVC ดูข้อมูลเพิ่มเติมได้ในเอกสารประกอบ Linux ต้นทางเกี่ยวกับ ConfigFS UVC gadget ABI
ตัวอย่างต่อไปนี้แสดงวิธีที่ init ของผู้ให้บริการสามารถตั้งค่าไดรเวอร์แกดเจ็ต UVC (โค้ดใน AOSP)
# uvc function
mkdir /configfs_path/functions/uvc.0
write /configfs_path/functions/uvc.0/function_name "Android Webcam"
write /configfs_path/functions/uvc.0/streaming_maxpacket 3072
# setup control params
mkdir /configfs_path/functions/uvc.0/control/header/h
symlink /configfs_path/functions/uvc.0/control/header/h \
/configfs_path/functions/uvc.0/control/class/fs/h
symlink /configfs_path/functions/uvc.0/control/header/h \
/configfs_path/functions/uvc.0/control/class/ss/h
# advertise 1080p resolution for webcam encoded as mjpeg
mkdir /configfs_path/functions/uvc.0/streaming/mjpeg/m/1080p
write /configfs_path/functions/uvc.0/streaming/mjpeg/m/1080p/wHeight 1080
write /configfs_path/functions/uvc.0/streaming/mjpeg/m/1080p/wWidth 1920
write /configfs_path/functions/uvc.0/streaming/mjpeg/m/1080p/dwMaxVideoFrameBufferSize 4147200
# advertise 30 fps support for 1080p.
write /configfs_path/functions/uvc.0/streaming/mjpeg/m/1080p/dwDefaultFrameInterval 333333
write /configfs_path/functions/uvc.0/streaming/mjpeg/m/1080p/dwFrameInterval "333333"
# setup streaming params
mkdir /configfs_path/functions/uvc.0/streaming/header/h
symlink /configfs_path/functions/uvc.0/streaming/mjpeg/m \
/configfs_path/functions/uvc.0/streaming/header/h/m
symlink /configfs_path/functions/uvc.0/streaming/header/h \
/configfs_path/functions/uvc.0/streaming/class/fs/h
symlink /configfs_path/functions/uvc.0/streaming/header/h \
/configfs_path/functions/uvc.0/streaming/class/hs/h
symlink /configfs_path/functions/uvc.0/streaming/header/h \
/config/usb_gadget/g1/functions/uvc.0/streaming/class/ss/h
# ...
ข้อมูลโค้ดนี้ตั้งค่าไดรเวอร์แกดเจ็ต UVC เพื่อโฆษณาสตรีม MJPEG 1080p ที่ 30 FPS ความสามารถเหล่านี้จะสื่อสารกับโฮสต์ USB เมื่อโฮสต์ค้นหา ความละเอียดและอัตราเฟรมที่รองรับ
ต่อไปนี้เป็นหลักเกณฑ์ทั่วไปในการเลือกการกำหนดค่าที่เว็บแคมแสดง
- รูปแบบสตรีม 2 รูปแบบที่บริการ
DeviceAsWebcam
รองรับคือ MJPEG และ YUYV ที่ไม่มีการบีบอัด - USB 2.0 รองรับการโอนข้อมูลที่ 480 Mbps (60 MBps) ซึ่งหมายความว่าที่ 30 FPS แต่ละเฟรมต้องมีขนาดสูงสุด 2 MB และที่ 60 FPS ต้องมีขนาดสูงสุด 1 MB
- สตรีมที่ไม่ได้บีบอัด (YUYV): ที่ 30 fps ขนาดเฟรมสูงสุดที่รองรับคือ 720p เนื่องจาก YUYV มีขนาด 2 ไบต์ต่อพิกเซล
- สตรีม MJPEG ที่บีบอัด: สมมติว่าอัตราส่วนการบีบอัดจาก YUV คือ 1:10 USB 2.0 รองรับ 4K (1.18 MB ต่อเฟรม)
- อุปกรณ์กล้องหน้าและกล้องหลังหลักต้องรองรับขนาดเฟรมทั้งหมดที่ โฆษณา เนื่องจากผู้ใช้สามารถสลับระหว่างรหัสกล้องได้โดยใช้ UI แสดงตัวอย่าง สำหรับสตรีม MJPEG เราขอแนะนำให้ผู้ให้บริการโฆษณาขนาดเฟรม 480p (640 x 480), 720p (1280 x 820) และ 1080p (1920 x 1080) เนื่องจากเป็น ขนาดที่แอปโฮสต์ใช้กันโดยทั่วไป
- อุปกรณ์กล้องหน้าและกล้องหลังหลักต้องรองรับอัตราเฟรมทั้งหมดที่ โฆษณา เราขอแนะนำให้ผู้ให้บริการรองรับ 30 FPS
ดูตัวอย่างการเพิ่มการกำหนดค่าสตรีมเว็บแคม (ConfigFS) ได้ที่ แพตช์ตัวอย่าง AOSP
เปิดใช้เว็บแคมในการสร้าง
หากต้องการเปิดใช้บริการ DeviceAsWebcam
คุณต้องตั้งค่าพร็อพเพอร์ตี้ของระบบ ro.usb.uvc.enabled
เป็น true
ในไฟล์ device.mk
# Enable UVC support
PRODUCT_VENDOR_PROPERTIES += \
ro.usb.uvc.enabled=true
เมื่อเปิดใช้พร็อพเพอร์ตี้ของระบบนี้ ตัวเลือกเว็บแคมจะปรากฏใน แอปการตั้งค่าในการตั้งค่า USB ดังที่แสดงในรูปที่ 3 เมื่อเลือกตัวเลือกนี้ อุปกรณ์ Android จะปรากฏเป็นเว็บแคม USB ในอุปกรณ์โฮสต์
รูปที่ 3 ค่ากำหนด USB ในแอปการตั้งค่า
นอกจากนี้ คุณยังตั้งค่าอุปกรณ์ให้เป็นฟังก์ชันเว็บแคม USB ผ่าน ADB ได้โดยใช้คำสั่งต่อไปนี้
adb shell svc usb setFunctions uvc
พิจารณาเรื่องกำลังไฟและความร้อน
การทำงานของเว็บแคมหมายความว่ากล้องของอุปกรณ์อาจเปิดอยู่หลายชั่วโมงต่อวัน เราจึงขอแนะนำให้คุณใช้มาตรการเพื่อให้มั่นใจว่าการใช้พลังงานและความร้อนของอุปกรณ์จะยังคงอยู่ภายใต้ขีดจำกัดที่กำหนด วิธีแก้ปัญหาที่แนะนำต่อไปนี้จะช่วยให้การใช้พลังงานไม่เกินขีดจำกัด
- หากต้องการให้ HAL ของกล้องมีประสิทธิภาพด้านพลังงานดียิ่งขึ้น ให้เปิดใช้
STREAM_USE_CASE_VIDEO_CALL
ในบริการDeviceAsWebcam
หากคุณกังวลเรื่องแบตเตอรี่แม้จะเปิดใช้
STREAM_USE_CASE_VIDEO_CALL
แล้ว บริการDeviceAsWebcam
ก็มีตัวเลือกในการลดการใช้แบตเตอรี่เพิ่มเติม โดยใช้สตรีมจริง คุณใช้การซ้อนทับทรัพยากรขณะรันไทม์ (RRO) เพื่อระบุกล้องจริงที่จะใช้ได้ การสตรีมแบบมีสายจะลดคุณภาพวิดีโอลงอย่างมากและทำให้ UX สับสน ดังนั้นให้ใช้โซลูชันนี้เป็นทางเลือกสุดท้ายเท่านั้น การเพิ่มประสิทธิภาพSTREAM_USE_CASE_VIDEO_CALL
เป็นวิธีแก้ปัญหาที่แนะนำสำหรับข้อกังวล ดูข้อมูลเพิ่มเติมเกี่ยวกับ RRO ที่บริการDeviceAsWebcam
รองรับได้ที่ readme.mdต่อไปนี้คือตัวอย่างการตั้งค่า RRO เพื่อใช้รหัสกล้องจริง 3 แทนรหัสกล้องเชิงตรรกะ 0 ตัวอย่างใน AOSP โปรดดู DeviceAsWebcamRaven
// For logical camera id 0 - use physical camera id 3 {"0": {"3" : "UW"}}
การยืนยัน
หากต้องการทดสอบการใช้งานบริการ DeviceAsWebcam
ในอุปกรณ์ ให้ใช้การทดสอบต่อไปนี้
- การทดสอบโปรแกรมตรวจสอบ CTS เว็บแคม: ทดสอบว่าอุปกรณ์รองรับรูปแบบ ขนาด และ อัตราเฟรมหรือไม่
- การทดสอบด้วยตนเอง: ทดสอบว่าฟีเจอร์เว็บแคมทำงานร่วมกับแอปโฮสต์ต่างๆ ในระบบปฏิบัติการโฮสต์ต่างๆ ได้
ปัญหาที่ทราบ
ปัญหาที่ทราบเกี่ยวกับบริการ DeviceAsWebcam
มีดังนี้
บางครั้งสตรีมของไดรเวอร์แกดเจ็ต UVC จะกะพริบและ แสดงสิ่งที่ดูเหมือนเฟรมที่เสียหาย ปัญหานี้ได้รับการแก้ไขและผสานรวม อัปสตรีมและใน GKI แล้ว
อุปกรณ์ Android ในโหมดเว็บแคมใช้กับสาย USB 3.0 ขึ้นไปในโฮสต์ macOS ไม่ได้เนื่องจากมีข้อบกพร่องในไดรเวอร์ UVC ของ Apple