ใช้อุปกรณ์เป็นเว็บแคม

สำหรับอุปกรณ์ที่ใช้ Android 14 QPR1 ขึ้นไป Android รองรับการใช้อุปกรณ์เป็นเว็บแคม USB อุปกรณ์ Android ที่รองรับฟีเจอร์นี้จะโฆษณา เป็นอุปกรณ์ UVC ซึ่งช่วยให้โฮสต์ USB ที่หลากหลายซึ่งใช้ ระบบปฏิบัติการต่างๆ (เช่น Linux, macOS, Windows และ ChromeOS) ใช้ กล้องของอุปกรณ์เป็นเว็บแคมได้ บริการ DeviceAsWebcam รองรับฟีเจอร์นี้เพื่อให้ใช้อุปกรณ์เป็นเว็บแคมได้

บริการ DeviceAsWebcam

บริการ DeviceAsWebcam ใน AOSP มีกิจกรรมแสดงตัวอย่าง (DeviceAsWebcamPreview.java) ที่ช่วยให้ผู้ใช้จัดเฟรมฉากได้ กิจกรรมแสดงตัวอย่างช่วยให้ผู้ใช้ทำสิ่งต่อไปนี้ได้

  • ดูตัวอย่างลักษณะของฟีดเว็บแคมในเครื่องโฮสต์ก่อนที่จะเริ่มสตรีม

  • ปรับแต่งฟีดเว็บแคมที่ส่งไปยังโฮสต์ได้ดังนี้

    • เลือกกล้องที่จะสตรีม ไม่ว่าจะเป็นกล้องหน้าหรือกล้องหลัง
    • เลือกระดับการซูมโดยใช้แถบเลื่อนหรือปุ่ม
    • แตะภูมิภาคใดภูมิภาคหนึ่งในตัวอย่างเพื่อโฟกัสหรือนำการโฟกัสออกจากภูมิภาค

กิจกรรมแสดงตัวอย่างทำงานร่วมกับฟีเจอร์การช่วยเหลือพิเศษทั่วไปใน Android เช่น TalkBack, การเข้าถึงด้วยสวิตช์ และ การเข้าถึงด้วยเสียง

ฟีดจากเว็บแคมที่สตรีมไปยังโฮสต์

รูปที่ 1 ฟีดเว็บแคมที่สตรีมไปยังโฮสต์โดยมีตัวอย่างควบคุมฟีด

สถาปัตยกรรม

สถาปัตยกรรมที่รองรับการใช้อุปกรณ์เป็นเว็บแคมแสดงอยู่ในรูปที่ 2 คำอธิบายต่อไปนี้แสดงขั้นตอนการโต้ตอบของบริการ DeviceAsWebcam กับเฟรมเวิร์ก Android ที่เหลือ

  1. ผู้ใช้เลือกตัวเลือกเว็บแคม USB ในแอปการตั้งค่า
  2. แอปการตั้งค่าจะส่งการเรียก Binder ไปยัง system_server ผ่านคลาส UsbManager เพื่อแจ้งให้ทราบว่ามีการเลือก FUNCTION_UVC
  3. เซิร์ฟเวอร์ระบบจะทำสิ่งต่อไปนี้
    1. แจ้งให้ HAL ของอุปกรณ์ USB ดึงฟังก์ชันอุปกรณ์ UVC ผ่านการเรียกอินเทอร์เฟซ HAL setUsbFunctions
    2. แจ้งให้ HAL ของอุปกรณ์ USB กำหนดค่าไดรเวอร์อุปกรณ์ UVC โดยใช้ ConfigFs
  4. เมื่อได้รับฟังก์ชันเรียกกลับจาก HAL ของอุปกรณ์ system_server จะส่งการออกอากาศไปยังเฟรมเวิร์กเพื่อให้บริการ DeviceAsWebcam รับ
  5. ไดรเวอร์อุปกรณ์ 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 ในอุปกรณ์โฮสต์

ค่ากำหนด 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