สำหรับอุปกรณ์ที่ใช้ 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 โดยใช้ ConfigF
- แจ้ง HAL ของแกดเจ็ต USB ให้เรียกฟังก์ชันแกดเจ็ต UVC ผ่าน
การเรียกใช้อินเทอร์เฟซ HAL
- เมื่อได้รับการติดต่อกลับจาก HAL ของแกดเจ็ต
system_server
จะส่ง ออกอากาศสดไปยังเฟรมเวิร์ก เพื่อรับโดยบริการของDeviceAsWebcam
- ไดรเวอร์แกดเจ็ต USB จะเริ่มสตรีมจากเว็บแคมเมื่อได้รับการกำหนดค่า
คำสั่งจากโฮสต์ผ่านโหนด V4L2 ที่
/dev/video*
รูปที่ 2 สถาปัตยกรรม DeviceAsWebcam
การใช้งาน
หัวข้อนี้จะอธิบายวิธีรองรับการใช้อุปกรณ์ Android เป็นเว็บแคม
การรองรับเคอร์เนล
สําหรับ Android 14 ขึ้นไป รูปภาพ Kernel ทั่วไป (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 ว่ามีรูปแบบ ขนาด และอัตราเฟรมใด ตั้งค่า ConfigFS ด้วยการกำหนดค่า UVC ที่รองรับจากเว็บแคม Android สำหรับ โปรดดูข้อมูลเพิ่มเติมจากเอกสารประกอบเกี่ยวกับอัปสตรีม Linux ใน ConfigFS UVC แกดเจ็ต 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 ที่บีบอัด: สมมติว่าอัตราส่วนการบีบอัดภาพ 1:10 จาก YUV USB 2.0 รองรับ 4K (1.18 MB ต่อเฟรม)
- อุปกรณ์กล้องหน้าและกล้องหลังหลักต้องรองรับเฟรมทุกขนาดที่ ที่มีการโฆษณา เนื่องจากผู้ใช้สามารถสลับระหว่างรหัสกล้องโดยใช้ UI ตัวอย่าง สำหรับสตรีม MJPEG เราแนะนำให้ผู้ให้บริการโฆษณาความละเอียด 480p (640x 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
เป็นโซลูชันที่แนะนำในการใช้พลังงาน ของ Google ดูข้อมูลเพิ่มเติมเกี่ยวกับ 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
ไม่สามารถใช้สาย USB 3.0 ขึ้นไปบนอุปกรณ์ Android ในโหมดเว็บแคม โฮสต์ macOS เนื่องจากข้อบกพร่องในไดรเวอร์ UVC ของ Apple