במכשירים עם Android מגרסה 14-QPR1 ואילך, מערכת Android תומכת בשימוש
בתור מצלמת אינטרנט בחיבור USB. מכשירי Android שתומכים בתכונה זו מפרסמים
בתור מכשיר UVC, שמאפשר שימוש במגוון רחב של מארחי USB
במערכות ההפעלה (לדוגמה, Linux , macOS , Windows ו-ChromeOS) משתמשות ב-
של המכשיר כמצלמת אינטרנט. השירות DeviceAsWebcam
יש תמיכה בתכונה הזו כדי להשתמש במכשיר כמצלמת אינטרנט.
שירות DeviceAsמצלמת אינטרנט
השירות DeviceAsWebcam
ב-AOSP כולל פעילות של תצוגה מקדימה
(DeviceAsWebcamPreview.java
) שמאפשר למשתמשים למסגר את הסצנה. התצוגה המקדימה
פעילות מאפשרת למשתמש לבצע את הפעולות הבאות:
אפשר לראות תצוגה מקדימה של הפיד של מצלמת האינטרנט במחשב המארח לפני השידור מתחיל.
אפשר להתאים אישית את הפיד של מצלמת האינטרנט שנשלח למארח בדרכים הבאות:
- בחירת המצלמה לשידור, הקדמית או האחורית.
- בחירת רמת הזום באמצעות פס הזזה או לחצנים.
- כדי להתמקד או להסיר את המיקוד, מקישים על אזור מסוים בתצוגה המקדימה. באזור מסוים.
פעילות התצוגה המקדימה פועלת עם תכונות נגישות כלליות ב-Android, בתור TalkBack, גישה באמצעות מתג, וגם גישה קולית.
איור 1. פיד ממצלמת אינטרנט מועבר למארח עם תצוגה מקדימה ששולטת שבפיד.
ארכיטקטורה
הארכיטקטורה לתמיכה בשימוש במכשיר כמצלמת אינטרנט מודגמת
איור 2. בהמשך מתואר תהליך האינטראקציה ב-DeviceAsWebcam
עם שאר המסגרת של Android:
- המשתמש בוחר באפשרות מצלמת ה-USB באפליקציית ההגדרות.
- אפליקציית ההגדרות שולחת קריאה של binder אל
system_server
דרך כיתה אחת (UsbManager
) שמודיעה לה שנבחרת 'FUNCTION_UVC
'. - שרת המערכת מבצע את הפעולות הבאות:
- שולח הודעה לגאדג'ט ה-USB באמצעות HAL כדי לאחזר את פונקציית הגאדג'ט UVC באמצעות
קריאה לממשק HAL ב
setUsbFunctions
. - שולח הודעה לגאדג'ט ה-USB HAL כדי להגדיר את מנהל ההתקן של הגאדג'ט UVC באמצעות הגדרות אישיות.
- שולח הודעה לגאדג'ט ה-USB באמצעות HAL כדי לאחזר את פונקציית הגאדג'ט UVC באמצעות
קריאה לממשק HAL ב
- עם קבלת קריאה חוזרת מהגאדג'ט HAL,
system_server
שולח שידור ל-framework כדי לאסוף את השירותDeviceAsWebcam
. - מנהל ההתקן של גאדג'ט ה-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
:
לפעמים, הסטרימינג של הגאדג'ט UVC מהבהב שמציג מה שנראה כמו פריימים פגומים. הבעיה הזו תוקנה ומוזגה ב-upstream וב-GKI.
מכשירי Android במצב מצלמת אינטרנט לא פועלים עם כבלי USB 3.0 ואילך המארחים ב-macOS עקב באג במנהל התקן UVC של Apple.