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

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

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

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

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

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

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

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

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

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

ארכיטקטורה

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

  1. המשתמש בוחר באפשרות מצלמת ה-USB באפליקציית ההגדרות.
  2. אפליקציית ההגדרות שולחת קריאה של binder אל system_server דרך כיתה אחת (UsbManager) שמודיעה לה שנבחרת 'FUNCTION_UVC'.
  3. שרת המערכת מבצע את הפעולות הבאות:
    1. שולח הודעה לגאדג'ט ה-USB באמצעות HAL כדי לאחזר את פונקציית הגאדג'ט UVC באמצעות קריאה לממשק HAL בsetUsbFunctions.
    2. שולח הודעה לגאדג'ט ה-USB HAL כדי להגדיר את מנהל ההתקן של הגאדג'ט UVC באמצעות הגדרות אישיות.
  4. עם קבלת קריאה חוזרת מהגאדג'ט HAL, system_server שולח שידור ל-framework כדי לאסוף את השירות 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
       ...
   }
   ...
}

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

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

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

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

כדי ליידע את מנהל התקן של הגאדג'ט UVC מהם הפורמטים, הגדלים וקצבי הפריימים שנתמך במצלמת האינטרנט של Android, צריך להגדיר את ConfigFS עם הגדרות UVC. עבור מידע נוסף זמין במסמכי התיעוד של upstream ל-Linux בנושא ConfigFS UVC. 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 לכל מסגרת).
  • המצלמה הראשית והמצלמה האחורית צריכות לתמוך בכל הגדלים של הפריים מתפרסמים במודעות. הסיבה לכך היא שהמשתמשים יכולים לעבור בין מזהי המצלמות באמצעות ממשק המשתמש של התצוגה המקדימה. בשידורי MJPEG, אנחנו ממליצים לספקים לפרסם מודעות באיכות 480p (640 x) פריימים של 480p (1280 x 820) ו-1080p (1920x1080) כי הם בגדלים נפוצים של אפליקציות מארחות.
  • המכשירים של המצלמה הראשית והאחורית צריכים לתמוך בכל קצבי הפריימים שפורסמו. אנחנו ממליצים מאוד לספקים שתומכים ב-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: