如果是搭載 Android 14-QPR1 以上版本的裝置,Android 支援使用
錄製成 USB 網路攝影機。宣傳支援這項功能的 Android 裝置
視為 UVC 裝置,讓各種不同版本的 USB 主機
作業系統 (例如 Linux、macOS、Windows 和 ChromeOS) 會使用
把裝置相機當做網路攝影機使用DeviceAsWebcam
服務
支援這項功能,即可將裝置當做網路攝影機使用。
DeviceAsWebcam 服務
Android 開放原始碼計畫中的 DeviceAsWebcam
服務包含預覽活動
(DeviceAsWebcamPreview.java
) 可讓使用者針對場景指定影格。預覽
活動可讓使用者執行下列操作:
在直播前預覽網路攝影機畫面在主機機器上呈現的樣貌 就可以開始
透過下列方式自訂傳送給主辦人的網路攝影機動態消息:
- 選取要串流播放的攝影機 (前置或後置)。
- 使用滑桿或按鈕選取縮放等級。
- 輕觸預覽畫面的特定區域即可聚焦或移除焦點 單一區域
預覽活動可與 Android 的一般無障礙功能搭配使用,例如 例如 TalkBack、切換控制功能,以及 Voice Access:
圖 1. 透過主機直播觀看的網路攝影機直播, 動態饋給
建築
使用裝置做為網路攝影機的支援架構如
圖 2.以下說明 DeviceAsWebcam
的互動流程
與其他 Android 架構一起服務:
- 使用者在「設定」應用程式中選取 USB 網路攝影機選項。
- 「設定」應用程式透過
system_server
UsbManager
類別,通知其已選取FUNCTION_UVC
。 - 系統伺服器會執行下列操作:
- 通知 USB 小工具 HAL,以透過
setUsbFunctions
HAL 介面呼叫。 - 通知 USB 小工具 HAL 以使用 ConfigF。
- 通知 USB 小工具 HAL,以透過
- 收到來自小工具 HAL 的回呼後,
system_server
會傳送 傳送到DeviceAsWebcam
服務所使用的架構。 - USB 小工具驅動程式在接收設定時啟動網路攝影機串流
透過
/dev/video*
的 V4L2 節點從主機發出指令。
圖 2. DeviceAsWebcam 架構。
實作
本節說明如何將 Android 裝置當做網路攝影機使用。
核心支援
在 Android 14 以上版本中,一般核心映像檔 (GKI) 會啟用 UVC 小工具 驅動程式 (詳情請參閱 Android 開放原始碼計畫修補程式)。
在小工具 HAL 中支援 UVC
自 Android 14 起,UVC 函式已包含在
GadgetFunction.aidl
HAL 介面。UVC:小工具 HAL
小工具的掛接方式與其他 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 邏輯都位於供應商 init 或 DeviceAsWebcam
外加 UVC 專屬邏輯,除非將 UVC 函數符號連結至該函式
ConfigFS,小工具 HAL 為必要項目。
如需實作的進一步指引,請參閱下列 Android 開放原始碼計畫的程式碼範例:
使用 UVC 設定進行 ConfigFS 設定
告知 UVC 小工具驅動程式採用哪些格式、大小和畫面更新率 支援使用 UVC 設定 ConfigFS 功能。適用對象 詳情請參閱 ConfigFS UVC 的上游 Linux 說明文件 小工具 ABI。
以下範例說明廠商 init 如何設定 UVC 小工具驅動程式 (Android 開放原始碼計畫的程式碼片段):
# 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 小工具驅動程式,通告 1080p MJPEG 串流 30 fps。這些功能會在查詢時提供給 USB 主機 支援的解析度和畫面更新率
以下是選擇網路攝影機設定的通用指南 廣告:
DeviceAsWebcam
服務支援的兩種串流格式為 MJPEG 和 未壓縮的 YUYV- USB 2.0 支援 480 Mbps (60 MB) 的資料傳輸方式。這個
表示每個影格的大小上限為 30 fps,且大小上限為 2 MB;
且影格速率為 60 fps,大小上限為 1 MB
- 未壓縮串流 (YUYV):能以 30 fps 播放,達到支援的影格上限 因為 YUYV 是每像素 2 位元組 720p
- 經過壓縮的 MJPEG 串流:假設 YUV 的壓縮比為 1:10 USB 2.0 可支援 4K (每影格 1.18 MB)。
- 主要前置與後置鏡頭裝置必須支援 這是因為使用者可以使用 預覽使用者介面針對 MJPEG 串流,我們建議供應商通告 480p (640 x) 480)、720p (1280 x 820) 和 1080p (1920 x 1080) 的影格大小,因為這些畫面大小 代管應用程式常用的大小
- 主要前置與後置鏡頭裝置必須支援 廣告。強烈建議供應商支援 30 fps。
如需新增網路攝影機串流設定 (ConfigFS) 的範例,請參閱 Android 開放原始碼計畫範例修補程式。
在版本中啟用網路攝影機
如要啟用 DeviceAsWebcam
服務,請設定 ro.usb.uvc.enabled
套用至 device.mk
檔案中的 true
。
# Enable UVC support
PRODUCT_VENDOR_PROPERTIES += \
ro.usb.uvc.enabled=true
啟用這項系統資源後,「網路攝影機」選項會顯示在 USB 偏好設定底下的「設定」應用程式 (如圖 3 所示)。如果選項是 選取後,Android 裝置會顯示為 USB 網路攝影機,連至主機裝置。
圖 3. 「設定」應用程式中的 USB 偏好設定。
您也可以使用 ADB 在裝置上設定 USB 網路攝影機功能。 指令:
adb shell svc usb setFunctions uvc
考量電力和熱力疑慮
網路攝影機操作意味著裝置攝影機可能在多個同時開啟 所以建議您採取措施來確保 裝置的溫度和熱力仍低於特定限制 以下建議解決方案能避免耗電量受到限制:
- 如要獲得更優異的相機 HAL 效能,請啟用
DeviceAsWebcam
服務中的STREAM_USE_CASE_VIDEO_CALL
。 如果啟用
STREAM_USE_CASE_VIDEO_CALL
後仍有疑慮,DeviceAsWebcam
服務提供進一步降低耗電量的選項 減少資源用量別擔心!您可以使用 執行階段資源疊加層 (RRO),用於指定要用於 相關單位會如何運用資料,並讓他們覺得自己 獲得充分告知,且能夠針對該使用方式表示同意實體直播畫面大幅降低影片畫質,導致 使用者體驗不佳,建議僅在不得已時才使用這項解決方案。正在最佳化 建議使用STREAM_USE_CASE_VIDEO_CALL
做為電源 疑慮。如要進一步瞭解DeviceAsWebcam
支援的 RRO 架構,請參閱相關文章 服務,請參閱 readme.md。以下範例說明如何透過 RRO 設定使用實體相機 ID 3 而不是邏輯 ID 0如需 Android 開放原始碼計畫範例,請參閱 DeviceAsWebcamRaven。
// For logical camera id 0 - use physical camera id 3 {"0": {"3" : "UW"}}
驗證
如要在裝置上測試 DeviceAsWebcam
服務的實作情形,請使用
下列測試:
- CTS 驗證器測試網路攝影機:可測試特定格式、大小和 裝置支援影格速率。
- 手動測試:測試網路攝影機功能能否搭配各種主機應用程式運作 以及各種主機作業系統上
已知問題
以下是 DeviceAsWebcam
服務的已知問題:
UVC 小工具的串流有時會閃爍 會顯示看起來損毀的因素這個問題已修正並合併 以及 GKI 中
處於網路攝影機模式的 Android 裝置無法與 USB 3.0 以上的傳輸線搭配使用 Apple 的 UVC 驅動程式發生錯誤而造成的 macOS 主機。