สำหรับอุปกรณ์ที่ใช้ 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 ผ่านการเรียกอินเทอร์เฟซ HAL
setUsbFunctions - แจ้งให้ HAL ของอุปกรณ์ USB กำหนดค่าไดรเวอร์อุปกรณ์ UVC โดยใช้ ConfigFs
- แจ้งให้ HAL ของอุปกรณ์ USB ดึงฟังก์ชันอุปกรณ์ UVC ผ่านการเรียกอินเทอร์เฟซ HAL
- เมื่อได้รับฟังก์ชันเรียกกลับจาก HAL ของอุปกรณ์
system_serverจะส่งการออกอากาศไปยังเฟรมเวิร์กเพื่อให้บริการDeviceAsWebcamรับ - ไดรเวอร์อุปกรณ์ USB จะเริ่มสตรีมเว็บแคมเมื่อได้รับคำสั่งการกำหนดค่าจากโฮสต์ผ่านโหนด V4L2 ที่
/dev/video*
รูปที่ 2 สถาปัตยกรรม DeviceAsWebcam
การใช้งาน
ส่วนนี้อธิบายวิธีรองรับการใช้อุปกรณ์ Android เป็นเว็บแคม
การรองรับเคอร์เนล
สำหรับ Android 14 ขึ้นไป รูปภาพเคอร์เนลทั่วไป (GKI) จะเปิดใช้ไดรเวอร์อุปกรณ์ UVC โดยค่าเริ่มต้น (ดูรายละเอียดในแพตช์ AOSP)
รองรับ UVC ใน HAL ของอุปกรณ์
ตั้งแต่ Android 14 เป็นต้นไป ฟังก์ชัน UVC จะรวมอยู่ใน
GadgetFunction.aidl อินเทอร์เฟซ HAL สำหรับ HAL ของอุปกรณ์ อุปกรณ์ UVC จะติดตั้งใช้งาน ConfigFS ในลักษณะเดียวกับฟังก์ชัน ConfigFS อื่นๆ เช่น MTP หรือ ADB
หากต้องการติดตั้งใช้งาน HAL ของอุปกรณ์ ให้ทำการแก้ไขเพื่อติดตั้งใช้งานฟังก์ชัน UVC กับ ConfigFS ต่อไปนี้เป็นตัวอย่างข้อมูลโค้ดของการติดตั้งใช้งาน HAL ของอุปกรณ์ที่รองรับฟังก์ชัน 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 ต่อเฟรม)
- อุปกรณ์กล้องหน้าและกล้องหลังหลักต้องรองรับขนาดเฟรมทั้งหมดที่โฆษณา เนื่องจากผู้ใช้สามารถสลับระหว่างรหัสกล้องโดยใช้อินเทอร์เฟซผู้ใช้แสดงตัวอย่าง สำหรับการสตรีม 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