במכשירים עם Android מגרסה 14-QPR1 ואילך, אפשר להשתמש במכשיר כמצלמת אינטרנט מסוג USB. מכשירי Android שתומכים בתכונה הזו מפורסמים בתור מכשיר UVC, שמאפשר למגוון רחב של מארחי USB עם מערכות הפעלה שונות (למשל, Linux, macOS, Windows ו-ChromeOS) להשתמש במצלמה של המכשיר כמצלמת אינטרנט. השירות DeviceAsWebcam
תומך בתכונה הזו, שמאפשרת להשתמש במכשיר כמצלמת אינטרנט.
השירות DeviceAsWebcam
השירות DeviceAsWebcam
ב-AOSP כולל פעילות תצוגה מקדימה (DeviceAsWebcamPreview.java
) שמאפשרת למשתמשים לבחור את הפריים של התמונה. פעילות התצוגה המקדימה מאפשרת למשתמש לבצע את הפעולות הבאות:
תוכלו לצפות בתצוגה מקדימה של הפיד של מצלמת האינטרנט במכונה המארחת לפני התחלת השידור.
אתם יכולים להתאים אישית את הפיד של מצלמת האינטרנט שנשלח למארח בדרכים הבאות:
- בחירת המצלמה שבה רוצים לבצע את השידור, קדמית או אחורית.
- בחירת רמת הזום באמצעות פס הזזה או לחצנים.
- כדי להתמקד באזור מסוים או להסיר אותו, מקישים על אזור מסוים בתצוגה המקדימה.
פעילות התצוגה המקדימה פועלת עם תכונות נגישות כלליות ב-Android, כמו TalkBack, גישה באמצעות מתג וגישה קולית.
איור 1. פיד של מצלמת אינטרנט שמשודר למארח עם תצוגה מקדימה של הפיד.
ארכיטקטורה
הארכיטקטורה שתומכת בשימוש במכשיר כמצלמת אינטרנט מופיעה באיור 2. בהמשך מתואר תהליך האינטראקציה של שירות DeviceAsWebcam
עם שאר מסגרת Android:
- המשתמש בוחר באפשרות של מצלמת ה-USB באפליקציית ההגדרות.
- אפליקציית ההגדרות שולחת קריאה ל-binder ל-
system_server
דרך הכיתהUsbManager
, ומעדכנת אותו ש-FUNCTION_UVC
נבחר. - שרת המערכת מבצע את הפעולות הבאות:
- מודיע ל-HAL של גאדג'ט ה-USB לאחזר את פונקציית הגאדג'ט של UVC באמצעות קריאה לממשק HAL
setUsbFunctions
. - מודיע ל-HAL של גאדג'ט ה-USB להגדיר את מנהל ההתקן של גאדג'ט ה-UVC באמצעות ConfigFs.
- מודיע ל-HAL של גאדג'ט ה-USB לאחזר את פונקציית הגאדג'ט של UVC באמצעות קריאה לממשק HAL
- כשמקבלים קריאה חוזרת מ-HAL של הגאדג'ט,
system_server
שולח שידור ל-framework כדי שהשירותDeviceAsWebcam
יזהה אותו. - מנהל ההתקן של גאדג'ט ה-USB מתחיל את הסטרימינג של מצלמת האינטרנט לאחר שהוא מקבל פקודות הגדרה מהמארח דרך צמתים של V4L2 ב-
/dev/video*
.
איור 2. הארכיטקטורה של DeviceAsWebcam.
הטמעה
בקטע הזה נסביר איך לתמוך בשימוש במכשיר Android כמצלמת אינטרנט.
תמיכה בליבה
ב-Android מגרסה 14 ואילך, קובץ האימג' של הליבה הגנרית (GKI) מפעיל את הדרייבר של גאדג'ט UVC כברירת מחדל (פרטים נוספים זמינים בתיקון AOSP).
תמיכה ב-UVC ב-HAL של Gadget
החל מגרסה 14 של Android, הפונקציה UVC כלולה בממשק HAL GadgetFunction.aidl
. ב-Gadget HAL, ההתקן מסוג UVC מצורף ל-ConfigFS באותו אופן שבו מצורפות פונקציות אחרות של ConfigFS, כמו MTP או ADB.
כדי להטמיע את Gadget HAL, צריך לבצע שינויים כדי לטעון את פונקציית ה-UVC ל-ConfigFS. קטע קוד לדוגמה של הטמעת HAL של Gadget שתומכת בפונקציית 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
, לא נדרשת לוגיקה ספציפית של UVC, מלבד קישור סימבולי של פונקציית UVC ל-ConfigFS, בגאדג'ט HAL.
לקבלת הנחיות נוספות להטמעה, אפשר לעיין בדוגמת הקוד הבאה ב-AOSP:
הגדרת ConfigFS עם הגדרות UVC
כדי להודיע למנהל הגאדג'ט של UVC אילו פורמטים, גדלים ושיעור מסגרות נתמכים במצלמת האינטרנט של Android, צריך להגדיר את ConfigFS עם הגדרות UVC. למידע נוסף, קראו את המסמכים של Linux בנושא ConfigFS UVC gadget ABI.
בדוגמה הבאה מוסבר איך אפשר להגדיר את מנהל הגאדג'ט של UVC באמצעות vendor init (קטע קוד ב-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): בקצב של 30 fps, גודל המסגרת המקסימלי שנתמך הוא 720p כי הפורמט YUYV הוא 2 בייטים לכל פיקסל.
- שידורי MJPEG דחוסים: בהנחה שיחס דחיסה של 1:10 מ-YUV, USB 2.0 יכול לתמוך ב-4K (1.18MB לכל פריים).
- המצלמה הראשית והמצלמה הראשית צריכות לתמוך בכל גודלי הפריים שמתפרסמים. הסיבה לכך היא שהמשתמש יכול לעבור בין מזהי המצלמות באמצעות ממשק המשתמש של התצוגה המקדימה. לשידורי MJPEG, אנחנו ממליצים לספקים לפרסם גדלי פריימים של 480p (640 x 480), 720p (1,280 x 820) ו-1080p (1,920 x 1,080), כי אלה הגדלים שבהם אפליקציות המארח משתמשות בדרך כלל.
- המכשירים עם המצלמה הקדמית והאחורית הראשיות חייבים לתמוך בכל קצב הפריימים שמפורסמים. אנחנו ממליצים מאוד לספקים שתומכים ב-30 fps.
דוגמה להוספת הגדרות של סטרימינג ממצלמת אינטרנט (ConfigFS) מופיעה בתיקון לדוגמה ב-AOSP.
הפעלת מצלמת אינטרנט בגרסה היציבה
כדי להפעיל את השירות 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
היא הפתרון המועדף לבעיות חשמל. מידע נוסף על קובצי RRO שנתמכים בשירות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.