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