במכשירים עם 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:
- המשתמש בוחר באפשרות מצלמת ה-USB באפליקציית ההגדרות.
- אפליקציית ההגדרות שולחת קריאה ל-Binder ל-
system_server
דרך הכיתהUsbManager
, ומיידעת אותה שנבחרתFUNCTION_UVC
. - שרת המערכת מבצע את הפעולות הבאות:
- שולח הודעה לגאדג'ט ה-USB מסוג HAL כדי לאחזר את פונקציית הגאדג'ט UVC באמצעות קריאה לממשק HAL של
setUsbFunctions
. - שולחת לגאדג'ט ה-USB HAL כדי להגדיר את מנהל ההתקן של הגאדג'ט UVC באמצעות ConfigF.
- שולח הודעה לגאדג'ט ה-USB מסוג HAL כדי לאחזר את פונקציית הגאדג'ט UVC באמצעות קריאה לממשק HAL של
- כשמקבלים קריאה חוזרת מהגאדג'ט HAL,
system_server
שולח שידור למסגרת כדי לאסוף אותו משירותDeviceAsWebcam
. - מנהל התקן הגאדג'ט מסוג 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
:
הסטרימינג של מנהל ההתקן של הגאדג'ט UVC מהבהב לפעמים ומראה איך נראה פריימים פגומים. הבעיה הזו תוקנה ומוזגה ב-upstream וב-GKI.
מכשירי Android במצב מצלמת אינטרנט לא פועלים עם כבלי USB 3.0 ואילך במארחי macOS בגלל באג במנהל התקן UVC של Apple.