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

במכשירים עם Android 14-QPR1 ואילך, מערכת Android תומכת בשימוש במכשיר כמצלמת USB. מכשירי Android שתומכים בתכונה הזו מפרסמים כמכשיר UVC, שמאפשר למגוון רחב של מארחי USB עם מערכות הפעלה שונות (לדוגמה, Linux, macOS, Windows ו-ChromeOS) להשתמש במצלמה של המכשיר כמצלמת אינטרנט. השירות DeviceAsWebcam תומך בתכונה הזו כדי להשתמש במכשיר כמצלמת אינטרנט.

שירות DeviceAsמצלמת אינטרנט

שירות DeviceAsWebcam ב-AOSP כולל פעילות של תצוגה מקדימה (DeviceAsWebcamPreview.java) שמאפשרת למשתמשים למסגר את הסצנה. פעילות התצוגה המקדימה מאפשרת למשתמש:

  • ניתן לצפות בתצוגה מקדימה של הפיד של מצלמת האינטרנט במכונה המארחת לפני התחלת השידור.

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

    • בחירת המצלמה לשידור, הקדמית או האחורית.
    • בחירת רמת הזום באמצעות פס הזזה או לחצנים.
    • כדי להתמקד באזור מסוים או להסיר אותו, מקישים על אזור מסוים בתצוגה המקדימה.

פעילות התצוגה המקדימה פועלת עם תכונות נגישות כלליות ב-Android, כמו TalkBack, גישה באמצעות מתג ו-Voice Access.

פיד מצלמת אינטרנט משודרת למארח

איור 1. פיד ממצלמת אינטרנט מועבר למארח עם תצוגה מקדימה ששולטת בפיד.

אדריכלות

הארכיטקטורה לתמיכה בשימוש במכשיר כמצלמת אינטרנט מובאת באיור 2. בהמשך מתואר תהליך האינטראקציה של השירות DeviceAsWebcam עם שאר ה-framework של Android:

  1. המשתמש בוחר באפשרות מצלמת ה-USB באפליקציית ההגדרות.
  2. אפליקציית ההגדרות שולחת קריאה ל-Binder ל-system_server דרך הכיתה UsbManager, ומיידעת אותה שנבחרת FUNCTION_UVC.
  3. שרת המערכת מבצע את הפעולות הבאות:
    1. שולח הודעה לגאדג'ט ה-USB מסוג HAL כדי לאחזר את פונקציית הגאדג'ט UVC באמצעות קריאה לממשק HAL של setUsbFunctions.
    2. שולחת לגאדג'ט ה-USB HAL כדי להגדיר את מנהל ההתקן של הגאדג'ט UVC באמצעות ConfigF.
  4. כשמקבלים קריאה חוזרת מהגאדג'ט HAL, system_server שולח שידור למסגרת כדי לאסוף אותו משירות DeviceAsWebcam.
  5. מנהל התקן הגאדג'ט מסוג USB מפעיל את הסטרימינג במצלמת האינטרנט בעת קבלת פקודות הגדרה מהמארח דרך צומתי V4L2 ב-/dev/video*.

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

איור 2. הארכיטקטורה של DeviceAsWebcam.

הטמעה

בקטע הזה נסביר איך לתמוך בשימוש במכשיר Android כמצלמת אינטרנט.

תמיכה בליבה

ב-Android מגרסה 14 ואילך, תמונת ליבה גנרית (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
       ...
   }
   ...
}

כאשר המכשיר פועל כמצלמת אינטרנט, יש לוודא שגאדג'ט ה-USB HAL מפרסם את השילובים המתאימים של VID/PID.

מכיוון שכל לוגיקת UVC נמצאת באתחול של הספק או בשירות DeviceAsWebcam, לא נדרשת לוגיקה ספציפית של UVC, מלבד קישור סימבולי של פונקציית UVC ל-ConfigFS, בגאדג'ט HAL.

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

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

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

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

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

  • שני הפורמטים של השידורים שנתמכים בשירות DeviceAsWebcam הם MJPEG ו-YUYV לא דחוס.
  • USB 2.0 תומך בהעברת נתונים במהירות של 480 Mbps (60 MBps). כלומר, בקצב של 30FPS, כל פריים צריך להיות בגודל מקסימלי של 2MB, ובגודל של 60fps, ובגודל מקסימלי של 1MB.
    • שידורים לא דחוסים (YUYV): בקצב של 30FPS, גודל הפריימים המקסימלי הנתמך הוא 720p כי YUYV הוא 2 בייטים לפיקסל.
    • שידורי MJPEG דחוסים: בהנחה ביחס דחיסה של 1:10 מ-YUV, USB 2.0 יכול לתמוך ב-4K (1.18MB לכל פריים).
  • המצלמה הראשית והמצלמה הראשית צריכות לתמוך בכל גודלי הפריים שמתפרסמים. הסיבה לכך היא שהמשתמשים יכולים לעבור בין מזהי המצלמות באמצעות ממשק המשתמש של התצוגה המקדימה. אנחנו ממליצים לספקים לפרסם גדלים של פריימים ברזולוציית 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 במכשיר המארח.

איור 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: בדיקה שהפורמטים, הגדלים וקצבי הפריימים נתמכים במכשיר.
  • בדיקות ידניות: בדיקה שתכונת מצלמת האינטרנט פועלת עם מגוון אפליקציות מארחים במגוון מערכות הפעלה למארחים.

בעיות מוכרות

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