שימוש במכשיר כמצלמת אינטרנט

במכשירים עם 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. אפליקציית ההגדרות שולחת קריאה לאיגוד ל-system_server דרך המחלקה UsbManager כדי להודיע לה ש-FUNCTION_UVC נבחר.
  3. שרת המערכת מבצע את הפעולות הבאות:
    1. הפונקציה מודיעה ל-USB gadget HAL לאחזר את פונקציית ה-UVC gadget באמצעות קריאה לממשק 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 ב-Gadget HAL

החל מ-Android 14, פונקציית ה-UVC כלולה בממשק HAL‏ GadgetFunction.aidl. ב-Gadget HAL, גאדג'ט ה-UVC מותקן ב-ConfigFS באותו אופן כמו פונקציות אחרות של ConfigFS, כמו MTP או ADB.

כדי להטמיע את Gadget 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 נמצאת באתחול הספק או בDeviceAsWebcam service, לא נדרשת לוגיקה ספציפית של UVC ב-Gadget HAL, מלבד קישור סימבולי של פונקציית UVC ל-ConfigFS.

לקבלת הנחיות נוספות לגבי הטמעה, אפשר לעיין בדוגמת הקוד הבאה ב-AOSP:

הגדרה של ConfigFS עם הגדרות UVC

כדי להודיע למנהל ההתקן של גאדג'ט UVC אילו פורמטים, גדלים וקצבי פריימים נתמכים על ידי מצלמת האינטרנט של Android, צריך להגדיר את ConfigFS עם הגדרות UVC. מידע נוסף זמין במסמכי העזרה של Linux upstream בנושא ConfigFS UVC gadget ABI.

בדוגמה הבאה אפשר לראות איך פונקציית vendor 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 כשהוא שולח שאילתה לגבי רזולוציות וקצב פריימים נתמכים.

אלה הנחיות כלליות לבחירת ההגדרות שהמצלמה האינטרנטית מפרסמת:

  • שני פורמטי הסטרימינג שנתמכים בשירות 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 לכל פריים).
  • המכשירים של המצלמה הקדמית והאחורית העיקריות צריכים לתמוך בכל גדלי המסגרות שמפורסמים. הסיבה לכך היא שהמשתמש יכול לעבור בין מזהי מצלמה באמצעות ממשק המשתמש של התצוגה המקדימה. לגבי סטרימינג של MJPEG, מומלץ לספקים לפרסם גדלים של פריימים באיכות 480p ‏ (640 x 480),‏ 720p ‏ (1280 x 820) ו-1080p ‏ (1920 x 1080), כי אלה גדלים שנפוצים בשימוש באפליקציות מארחות.
  • המכשירים העיקריים של המצלמה הקדמית והמצלמה האחורית חייבים לתמוך בכל קצבי הפריימים שמפורסמים. מומלץ מאוד לספקים לתמוך ב-30 fps.

דוגמה להוספת הגדרות של שידור ממצלמת אינטרנט (ConfigFS) מופיעה בתיקון לדוגמה של AOSP.

הפעלת מצלמת האינטרנט ב-build

כדי להפעיל את השירות 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) כדי לציין באיזו מצלמה פיזית רוצים להשתמש. הזרמה פיזית מורידה באופן משמעותי את איכות הסרטון ומובילה לחוויית משתמש מבלבלת, ולכן מומלץ להשתמש בפתרון הזה רק כמוצא אחרון. אופטימיזציה של STREAM_USE_CASE_VIDEO_CALL היא הפתרון המועדף לבעיות שקשורות לצריכת חשמל. מידע נוסף על RROs שנתמכים על ידי שירות DeviceAsWebcam זמין בקובץ readme.md.

    הדוגמה הבאה מציגה RRO שהוגדר לשימוש במזהה מצלמה פיזי 3 במקום במזהה מצלמה לוגי 0. דוגמה ב-AOSP מופיעה במאמר בנושא DeviceAsWebcamRaven.

    // For logical camera id 0 - use physical camera id 3
    {"0": {"3" : "UW"}}
    

אימות

כדי לבדוק את ההטמעה של שירות DeviceAsWebcam במכשיר, משתמשים בבדיקות הבאות:

  • בדיקת מצלמת אינטרנט ב-CTS verifier: בדיקה של הפורמטים, הגדלים וקצבי הפריימים שנתמכים במכשיר.
  • בדיקות ידניות: בדיקה של תכונת מצלמת האינטרנט עם מגוון אפליקציות מארחות במגוון מערכות הפעלה מארחות.

בעיות מוכרות

אלה בעיות ידועות בשירות DeviceAsWebcam: