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

สำหรับอุปกรณ์ที่ใช้ 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 โดยใช้ ConfigF
  4. เมื่อได้รับการติดต่อจาก HAL ของแกดเจ็ต system_server จะส่งประกาศไปยังเฟรมเวิร์กเพื่อรับโดยบริการของ DeviceAsWebcam
  5. ไดรเวอร์แกดเจ็ต USB จะเริ่มสตรีมเว็บแคมเมื่อได้รับคำสั่งการกำหนดค่าจากโฮสต์ผ่านโหนด V4L2 ที่ /dev/video*

อุปกรณ์เป็นสถาปัตยกรรมเว็บแคม

รูปที่ 2 สถาปัตยกรรม DeviceAsWebcam

การใช้งาน

หัวข้อนี้จะอธิบายวิธีรองรับการใช้อุปกรณ์ Android เป็นเว็บแคม

การรองรับเคอร์เนล

สําหรับ Android 14 ขึ้นไป ไฟล์ Kernel ทั่วไป (GKI) จะเปิดใช้ไดรเวอร์แกดเจ็ต UVC โดยค่าเริ่มต้น (ดูรายละเอียดในแพตช์ AOSP)

รองรับ UVC ใน HAL ของแกดเจ็ต

ใน Android 14 เป็นต้นไป ฟังก์ชัน UVC จะรวมอยู่ในอินเทอร์เฟซ HAL ของ GadgetFunction.aidl สำหรับ 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 ในแกดเจ็ต ABI สำหรับ UVC ของ ConfigFS

ต่อไปนี้เป็นตัวอย่างวิธีที่ผู้ให้บริการ 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 (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 มีดังนี้