Android 14、スマートフォンをUSBウェブカメラとして使える機能を追加
(esper.io)- Android 14では、PC用ウェブカメラのために別アプリを使う流れを減らし、OSレベルで USBウェブカメラモード を提供できるようになった
- 新しい USB Preferences オプションにより、デバイスを UVC(USB Video Class) モードに切り替え、Windows、macOS、Linux PC が標準 USB ウェブカメラとして認識できる
- ただし機能は自動では有効にならず、カーネル設定、UVC 構成、USB HAL の更新、Webcam Service システムアプリがそろう必要がある
- Webcam Service は Camera2 API のフレームを
/dev/videoノードに渡し、ユーザーは通知からプレビュー・ズーム・レンズ切り替えを操作できる - Android 14 に更新されたデバイスでも、古いカーネルや HAL の制約があると対象外になる可能性があり、実際の対応可否はメーカー実装に左右される
Android 14のUSBウェブカメラモード
- Android 14から、スマートフォンをPC用ウェブカメラとして使う機能が Android OS 自体に組み込まれる可能性がある
- COVID期には Zoom や Google Meet のようなビデオ会議プラットフォームの利用が増えたが、良いウェブカメラは手に入りにくいか高価で、ノートPC内蔵ウェブカメラの画質にも限界があった
- スマートフォンのカメラは多くのウェブカメラより画質が良いため、これまでは多くのユーザーが サードパーティ製ソフトウェア でスマートフォンをウェブカメラのように使っていた
- Android 14では USB Preferences に USB webcam オプションが表示される場合がある
- 従来の USB モードにはファイル転送/Android Auto(MTP)、USB テザリング(NCM)、MIDI、PTP などがある
- USB webcam を選ぶと、デバイスが対応している場合は USB モードが UVC に切り替わる
- 接続先の Windows、macOS、Linux PC は Android デバイスを標準 USB ウェブカメラとして認識する
- 他の Android デバイスでも利用できる可能性がある
機能の有効化に必要な条件
- Android 14のウェブカメラ対応は、デフォルトで有効になる機能ではない
- 実際に動作させるには4つの条件が必要
- Linux カーネル設定の有効化
- UVC gadget の構成
- USB HAL の更新
- 新しいシステムアプリのプリインストール
カーネル設定の要件
- 必要な Linux カーネル設定は
CONFIG_USB_CONFIGFS_F_UVC - この設定は、Android デバイスを UVC gadget としてマウントできるようにするために必要
- Android 14にアップグレードされる多くのデバイスと、Android 14で発売されるほぼすべてのデバイスは、この設定が有効なカーネルを持つ可能性が高い
- Generic Kernel Image(GKI) では
android12-5.10からこの設定がデフォルトで有効 - Android 12以降で発売され、Linux kernel 5.10以上を使うデバイスは GKI カーネルを搭載する必要がある
- Generic Kernel Image(GKI) では
- Android エコシステムではメジャーカーネルバージョンの更新がまれで、Google Requirements Freeze(GRF) プログラムによって古いベンダー実装でも認証可能なため、一部の Android 14 アップグレード端末は USB ウェブカメラ機能をサポートできない可能性がある
- 対応可否は、カーネルバージョンと設定の有効化状況を確認するのが最も直接的
- カーネルバージョンの確認:
adb shell "cat /proc/version"
- カーネル設定の確認:
adb shell "zcat /proc/config.gz | grep 'CONFIG_USB_CONFIGFS_F_UVC'"
- カーネルバージョンの確認:
- 例として、Android 13を実行する Galaxy Z Fold 5 は
android13-5.15GKI を使用し、CONFIG_USB_CONFIGFS_F_UVC=yがあるため、Android 14 にアップグレードされた際に他の前提条件も満たせば USB ウェブカメラ機能をサポートできる
Webcam Serviceシステムアプリ
- 一部の Pixel デバイス向け Android 14 QPR1 ベータには、Webcam Service という新しいシステムアプリが含まれる
- パッケージ名は
com.android.deviceaswebcam libjni_deviceAsWebcam.so共有ライブラリに依存する- このアプリとライブラリは、Android 14 の今後予定されているソースコードリリースに含まれる予定
- パッケージ名は
- Webcam Service アプリは、Android デバイスをウェブカメラに変える DeviceAsWebcam サービスを実装する
- このサービスは、ホストデバイスが読み取れる
/dev/videoノードにカメラフレームを渡す - SELinux policy によると、
/dev/videoノードにはdevice_as_webcamドメインのプロセスだけがアクセスできる- 実際にアクセスする主体は Webcam Service システムアプリのみ
- したがって、Android 14 のネイティブ USB ウェブカメラ対応はデバイスメーカーが活用できるが、サードパーティアプリが直接利用することはできない
USBウェブカメラの開始方法とユーザー制御
- USB Preferences で新しい USB webcam オプションが有効になると、システムは
android.hardware.usb.action.USB_STATEインテントをブロードキャストする- インテントには
connectedとuvcの extras が含まれる
- インテントには
- Webcam Service はこのインテントを受け取る receiver を持つ
uvcextra がtrueに設定されているandroid.hardware.usb#isUvcSupportEnabled()フレームワークメソッドがtrueを返す- この2条件がそろうとシステムサービスを開始する
isUvcSupportEnabled()は、システムプロパティro.usb.uvc.enabledがtrueのときtrueを返す- このプロパティは OEM がビルド時に設定する必要がある
- 設定されていない場合、USB Preferences に USB webcam オプションは表示されず、Webcam Service も開始されない
- このプロパティは Settings や Webcam Service のようなシステムアプリだけが読み取れる
- Webcam Service が開始されると、ユーザーがウェブカメラを設定できる新しい通知が表示される
- 通知をタップするとカメラプレビューが開く
- ユーザーはズームイン/ズームアウトやレンズ切り替えができる
- 内部的には、Webcam Service アプリはシステムに終了されないよう foreground service を開始する
- Camera2 API を使い、720p(1280×720) または 1080p(1920×1080) のストリーミングをサポートする
- 接続先ホストにはウェブカメラのデバイス名が Android Webcam として表示される
ConfigFSとUSB HAL
- ホストに表示される名前、動画パラメータ、正確なエンコード方式は、デバイスメーカーが configfs で UVC gadget をどう構成するかによって変わる
- Tensor ベースの Pixel デバイスでは、Google の UVC gadget function 構成が
/vendor/etc/init/hw内のinit.gs[101|201].usb.rcファイルにある - Android が Settings で選択された USB モードを UVC に切り替えるには、更新済みの USB HAL が必要
- GRF プログラムのため、Android 14 にアップグレードされる多くのデバイスは更新された USB HAL を受け取れない可能性があり、その場合この機能は動作しない
プラットフォーム対応と限界
- Google が Android にネイティブ USB ウェブカメラ機能を実装したことで、この機能を望むデバイスメーカーは採用できるようになる
- Webcam Service アプリが予想どおり AOSP に含まれれば、デバイスメーカーはウェブカメラ機能の実装に活用できる
- Apple の Continuity Camera と比較されるかもしれないが、Android の方式は複数のプラットフォームで動作する
- Android 14 を実行し要件を満たすスマートフォンは、標準 USB ウェブカメラに切り替わり、あらゆる PC で使用できる
1件のコメント
Hacker News の意見
scrcpy はすでにこの用途に非常に優れている: https://github.com/Genymobile/scrcpy
OBS でスマートフォンのカメラをストリーミングするには、
adbでデバイスを待ち受け、wlan0の IP を取得し、adb tcpip 5555とadb connectで接続してから、scrcpy -e --v4l2-sink=/dev/video0 --lock-video-orientation=1 -n -Nを実行すればよいソースからビルドできるなら、その PR の上に追加コミットも載せてあり、Android の制限付き高速キャプチャモードに対応することで 120fps/240fps のカメラストリーミングが可能になる。会議用途ではあまり役に立たないが、高フレームレートの複合現実 VR 映像をキャプチャするには有用。私の知る限り、プロプライエタリかオープンソースかを問わず、60fps を超える Android ウェブカメラアプリはない
adbツール群はかなり揃っているようなので、こちらで足りていない 2 点について助言がほしい。1 つは ADB/TCP の固定ポートを設定するか、PC へ自動転送する方法で、Android は今では毎回ポートを変える。もう 1 つはモバイルホットスポットで ADB/TCP を有効にする方法で、Android が “Please connect to WiFi” と文句を言うこの 2 つを除けば、scrcpy、KDE Connect、Waydroid のおかげで Linux-Android 統合はほぼ完璧で、Apple ユーザーもうらやむほどだ
少し横道にそれるが、ロックダウン中に iPhone をウェブカメラとして使う方法を探していて VDO.Ninja を見つけた: https://vdo.ninja/
最初は OBS に映像フィードを送る手段で、それでウェブカメラ入力を作っていた。プロジェクトが大きくなるにつれ、ブラウザ内でデスクトップ映像と音声共有を直接立ち上げる、Zoom のような用途にも使えるようになり、そのおかげでリモートのバーチャル映画鑑賞会を運営できた
ルーム作成 UI でも可能だが、URL パラメータだけですべて構成できるので、はるかに柔軟で堅牢だった: https://docs.vdo.ninja/master/how-does-it-work
送信者と受信者の URL を作ると、WebRTC で自動接続される。たとえば VLC ウィンドウをキャプチャして映像と音声を送るソースを作り、2 つの宛先 URL がその映像・音声を受け取りつつ、それぞれのマイク音声も互いに送るようにできた。だからブラウザ内で一緒に映画を見聞きしながら会話もできた。このプロジェクトとは何の関係もなく、ただ本当に素晴らしいと思っている
OBS はコンピュータ画面を Twitch などへストリーミングするときに使うツール: https://obsproject.com/
うれしい追加機能だ。各社はトラッキング機能やポートレートモードのようなものを備えたカメラを作ろうと、時間と労力を費やしてきた
ただ、パンデミックであらゆるものが突然リモートに切り替わり、ウェブカメラを手に入れようと大騒ぎしていた時期に比べると、少し遅れて出てきた感じはする。そのときにサードパーティアプリを買わせるのではなく、この機能を提供してくれていればよかったと思う
自分にとっては少なすぎるし、遅すぎた。こういう「ホットテイク」をする人間にはなりたくないが、少し聞いてほしい。2013年まで携帯電話なしで固定電話だけを使っていて、Nexus 4から始め、2〜3年ごとにPixel 6まで買い替えてきた。ところが明日、初めてのiPhoneが届く
理由はいろいろある。Googleのスマホを外部ディスプレイに挿してミラーリングできないし、DisplayPort出力は理由もなくソースコード上で明示的に無効化されている: https://twitter.com/MishaalRahman/status/1189998588023234560 他のスマホでは普通にできる機能だ
Androidスマホのテキストメッセージにも、別アプリなしではアクセスできない。
adb backupを試してもだめで、root化すれば可能かもしれないが、普通はroot化の過程で全部消えるものだと理解しているスマホのバックアップにもアクセスできない。Googleのサーバーにしか保存されず、それに近づく唯一の方法はスマホに復元することだけだ。物理的に自分が買った端末を手に持っているのに、その中のすべてにアクセスできない。iPhoneならWindowsやMacにつないでバックアップをコンピューターにダンプでき、メッセージ、システム設定、連絡先、写真、データベースなど、ほとんどすべてが入っている。例外があるとすればハードウェア保護キーくらいかもしれない
Googleのふざけた振る舞いについても言うまでもない。メッセンジャーの乱立、複数サービスの終了、貧弱なサポート、広告とトラッキングのより強い統合といったものだ。Appleも完璧ではないが、しばらくは壁に囲まれた庭の中に入ってみる価値があると感じている。iOSにはディスプレイ出力、自分のデバイスへのアクセス、筋の通ったメッセージング、そして少なくともプライバシーを気にしているような感じがある。逆説的だが、Google製品よりApple製品を使っているときのほうが、自分にコントロール権があると感じる
たとえば充電速度や予想充電時間が分からないので、複数の充電器の中からiPhone対応の急速充電器とケーブルを選べているか確認しにくいし、ChromeやFirefoxが入っていても、テキストを選択してWeb検索を押すとSafariに飛ぶ。こういう小さなイライラが多く、OSが閉じすぎていてできることがない
Androidははるかにカスタマイズしやすいし、iPhoneでGBAエミュレーターを動かすようなサイドロードもずっと簡単だ。Samsungの折りたたみスマホのような、より面白い端末もAndroidエコシステムには多い。Macとのエコシステム統合は良いが、どちらか一方が明確に優れているとは言いにくい
Googleが終了したサービスの中で自分に影響したものはないし、メッセンジャーの乱立が何を指しているのかもよく分からない。どのサポートが不足しているという話なのかも明確ではない
Pixel 1 XLは素晴らしかったが、2年ほど経つとカメラが頻繁に失敗し、起動に3秒以上かかったり、よく落ちたりした。結局バッテリー持ちも悪くなり、交換バッテリーも数カ月で劣化したので乗り換えた
Pixel 3aはセキュリティアップデート終了の2カ月前にポケットから落ちて壊れた。全体としては悪くないスマホだったが、Googleは期待したほど長くサポートしてくれなかった。Pixel 6 Proは今のところ問題ないが、妻のPixel 5には遅い性能や不安定なセルラー接続などの問題がある
「Pixelスマホを買うな」というのが教訓なのかもしれないが、代替はセキュリティ面でもっと悪夢に近い可能性がある。Galaxyスマホには、削除すべきゴミアプリが信じられないほど大量にプリインストールされていた。PixelはGoogleアプリだけで、その多くは削除できるので、30社分のアプリがあらかじめ入っていて消せないかもしれない状況よりは、プライバシーとセキュリティの不安が小さい
何年もAppleをかなり批判してきたので、結局プラットフォーム移行が最善に見えてしまうのは残念だ
いくつかの不便はかなり腹立たしく見えるが、好きなコンピューターでコードを書いて自分のスマホや友人のスマホで実行するために定期購読料を払い、どんな理由でも拒否できる審査担当者に提出しなければならないという制約を受け入れるほどではない
こうしたシステムではroot
adbアクセスが可能で、そうすればSQLiteのメッセージデータベースにもアクセスできる。USB-CのDP代替モードによる画面ミラーリングは標準で動作し、Androidの「デスクトップモード」も有効にできるが、かなり基本的で実験的な状態だFairphoneは長期サポートがあり、修理しやすく、メインラインカーネルも動かせる(postmarketOSなど)。もちろん、どのAndroidスマホであっても、OSの面では依然としてGoogleに依存している
Googleに対する多くの不満には同意するが、Appleへ行くのは一つの悪を別の悪に替えるような感じだ。Appleの携帯電話を絶対に「自分のもの」とは呼ばないし、Appleが「自分のデバイスへのアクセス」を提供しているとも感じない
1年以上Camoアプリを使っている。非常によく動作し、Wi-Fiでカメラを見ることにも対応しているのでケーブルが不要だ。基本アカウントは無料: https://reincubate.com/camo/
これは数年前からやっていたこと。どういう意味でまだサポートがないと言っているのか分からない
この機能が入れば、現在 250 ドルの Pixel 6a が市場でコスパ最高のウェブカメラになる可能性が高い
6か月後には自動的にキャリアロックが解除される、とある非常に鬱陶しい割引サイトに書いてあった。リンクはそのサイトがあまりに鬱陶しいので貼らない。6か月のタイマーを開始するには、必ず端末をアクティベートする必要がある
私の知る限り、Nokia N900 では 2009年に gstreamer でこれが可能だった。実際にビデオデバイスを作って使ったわけではないが、
v4l2sinkはその頃には既にあったはずだと思う。リモートウィンドウや OpenCV でストリーミングするのにはかなり何度も使った今まで持った中で唯一良いと思えたスマートフォンだった。Android 端末でも物事がそれくらい簡単ならいいのだが、不思議なことにほとんどいつもそうではない
それも難しいことで、尊重されるべきだ。だが、ソフトウェアに対するこうした強硬で保守的な見方が、長い間、作られるものを完全に支配してきたように感じる。パワーユーザーにしっかりした足場を与えようとするコンピューティングはますます減っている。技術は距離を広げ続け、より難解になっている。皮肉なことに、より深く入り込み、専門家や探検者になろうとする入口を失い続けているからだ
Android スマートフォンをドライブレコーダーとして使えたらいいのに。いつ可能になるのだろう。当然できそうな機能に見える
あれば便利な機能ではあるが、多くの人は Zoom 中でもスマートフォンを手元に置いておきたがる気がする。それでも予備のスマートフォンを持っている人は多いかもしれない