[Linux Mint 20]カメラ無しPCで古いiPadをカメラにする(droidcam)

※2021/05/02：v1.6→v1.72へのアップデートを追記

先日、[Ubuntu18.04LTSに入れた「droidcam」](https://qiita.com/faz479704/items/f3745d209c8032d29555)をLinux Mint 20にも入れようと思ったら、バージョンが1.5→1.6に上がっている上、公式サイトの手順が若干だが変わっていた(zip解凍したら、ファイルの日付が2020/11/5になってた)。

DroidCam(Dev47Apps)
https://www.dev47apps.com/

## 材料
- PC：FMV-BIBLO MG70W(2007年製、Core2Duo T7100@1.80GHz、4GBメモリ)
- タブレット：iPad 3(iOS 9.3.5)、Sharp SH-02M(Android 10)
- アプリ：Droidcam

## インストール
iPad/Androidは公式のアプリストアから「Droidcam」をインストールする。

一方、PC＝クライアントについては、公式手順に沿って進める。

Droidcam Linux
https://www.dev47apps.com/droidcam/linux/

### Droidcamクライアント
まず、クライアントパッケージのダウンロード、解凍、インストール。

```
cd /tmp/
wget https://files.dev47apps.net/linux/droidcam_latest.zip
unzip droidcam_latest.zip -d droidcam
cd droidcam && sudo ./install-client
```

前回は「sudo ./install」だったので、ここからして若干変化あり。

### 標準のv4l2loopbackドライバ
次に、手順が更新されていたv4l2loopbackドライバ周り。

Droidcamカスタマイズなv4l2loopbackドライバがどうのこうのと書かれているものの、標準のv4l2loopbackドライバとやらが入っていればよさげなので、ここはすっ飛ばして良さそう・・・

```
$ sudo apt list | grep v4l2

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

gem-plugin-v4l2/focal 1:0.94-1build2 amd64
libv4l2rds0/focal 1.18.0-2build1 amd64
libv4l2rds0/focal 1.18.0-2build1 i386
qv4l2/focal 1.18.0-2build1 amd64
qv4l2/focal 1.18.0-2build1 i386
v4l2loopback-dkms/focal-updates,focal-updates 0.12.3-1ubuntu0.1 all
v4l2loopback-source/focal-updates,focal-updates 0.12.3-1ubuntu0.1 all
v4l2loopback-utils/focal-updates,focal-updates 0.12.3-1ubuntu0.1 all

```

って、入って無いし！(Ubuntu18.04LTSでは入ってた)

ということでv4l2loopbackドライバをインストールする。

```
$ sudo apt install v4l2loopback-dkms
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
提案パッケージ:
  v4l2loopback-utils
以下のパッケージが新たにインストールされます:
  v4l2loopback-dkms
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 1 個。
27.2 kB のアーカイブを取得する必要があります。
この操作後に追加で 109 kB のディスク容量が消費されます。
：
：
Loading new v4l2loopback-0.12.3 DKMS files...
Building for 5.4.0-53-generic
Building initial module for 5.4.0-53-generic
Done.

v4l2loopback.ko:
Running module version sanity check.
 - Original module
   - No original module exists within this kernel
 - Installation
   - Installing to /lib/modules/5.4.0-53-generic/extra/

depmod.....

DKMS: install completed.
$ sudo modprobe v4l2loopback
$ lsmod | grep v4l2loopback
v4l2loopback           40960  0
videodev              225280  1 v4l2loopback
$
```

Droidcamクライアントを起動すると

```
$ droidcam
Device /dev/video0 is 'Dummy video device (0x0000)' @ platform:v4l2loopback-000
Device /dev/video0 is 'Dummy video device (0x0000)' @ platform:v4l2loopback-000
Opened /dev/video0, fd:12
Audio loopback device not found.
Is snd_aloop loaded?
Audio: 

```
とログが流れて
![qiita_20201114_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552413/c80d5143-597f-69e5-f942-8fa7ce546447.png)
DroidCamのクライアントアプリのウインドウが開いた。

ここでiPad側のDroidcamを起動し、表示されたiPadのIPアドレスを入力してConnectを押したところ、Droidcamの接続は成功した。しかし、VLCやCheeseで確認しようとしてもエラーになったり、そもそもデバイスが見つからないと言われてしまい、カメラの映像を見ることはできなかった。

### Droidcamカスタムのv4l2loopbackドライバ
どこが気に入らないのかはわからないけれど、ひとまずは手順に新しく追加された「Droidcamカスタマイズドライバ」を追うことにした。

```
$ sudo apt install linux-headers-`uname -r` gcc make
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
gcc はすでに最新バージョン (4:9.3.0-1ubuntu2) です。
make はすでに最新バージョン (4.2.1-1.2) です。
linux-headers-5.4.0-53-generic はすでに最新バージョン (5.4.0-53.59) です。
linux-headers-5.4.0-53-generic は手動でインストールしたと設定されました。
アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 1 個。
$ sudo ./install-video 
Webcam parameters: '640' and '480'
Building v4l2loopback-dc.ko
：
(ずらずらとmakeが走る)
：
Adding options v4l2loopback_dc width=640 height=480 to /etc/modprobe.d/droidcam.conf
Adding videodev to /etc/modules-load.d/droidcam.conf
Adding v4l2loopback_dc to /etc/modules-load.d/droidcam.conf
Done
$ lsmod | grep v4l2
v4l2loopback_dc        24576  0
v4l2loopback           40960  0
videodev              225280  2 v4l2loopback_dc,v4l2loopback
$
```

ということで手順にある通り、モジュールに「v4l2loopback_dc」が追加された。

## 動作確認(IP接続)
再度、CLIから「droidcam」を起動する。

```
$ droidcam
Device /dev/video0 is 'Dummy video device (0x0000)' @ platform:v4l2loopback-000
Device /dev/video1 is 'Droidcam' @ platform:v4l2loopback_dc-000
Opened /dev/video1, fd:12
Audio loopback device not found.
Is snd_aloop loaded?
Audio: 

```

同じくdroidcamクライアントのアプリが起動するが、先程とは少しログの内容が変わった。

iPad側のIPアドレスを入力してDroidcamを接続した状態とし、Mint側で「VLC」を起動すると、プレイリストで[デバイス]→[ビデオキャプチャー]に「Droidcam」が表示された。

![qiita_20201114_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552413/e24c314a-43b0-24eb-eb09-0e6f11df9528.png)

Ubuntu(＝Droidcam Ver1.5)のときは毎回デバイスを選ぶ必要があったが、Droidcamカスタムv4l2loopbackドライバを登録したことで、アプリでリストに表示されるようになったのだろう(公式にもそんな風に書かれている)。

そして、このDroidcamを選んで再生すると、iPadのカメラの映像をVLCで見ることができた。

![qiita_20201114_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552413/29150cca-b600-0826-434b-5ced06125d26.png)

なお、試した範囲では以下の通り。

- VLC：ビデオキャプチャーでカメラの映像が表示・録画できた
- zoom：カメラのテストで表示された
- skype：カメラのテストで表示された
- cheese：表示されるのだが、すぐにエラーになってしまった

Ubuntu18.04LTSではCheeseでも問題なく表示されていたのだが、Mintではうまくいかなかったのはちょっと残念だった(Cheeseのバージョンが違うのかも？)。

## USB接続
DroidcamはIP接続の他、USB接続の2通りの接続が可能である。

### iPad(iOS)の場合
今回のターゲットである「古いiPad」はUSB接続でも問題なくDroidcamを使用できた。

READMEを見る限り、iOSとは「usbmuxd」を利用して接続しているようだが、確認したところusbmuxdは導入済みだったので、追加作業せずに済んだ。

ちなみにiPadとUSB接続した上で以下のコマンドの実行でActiveとなっていた。

```
$ sudo systemctl status usbmuxd
● usbmuxd.service - Socket daemon for the usbmux protocol used by Apple devices
     Loaded: loaded (/lib/systemd/system/usbmuxd.service; static; vendor preset: enabled)
     Active: active (running) since Fri 2020-11-13 16:05:37 JST; 2s ago
       Docs: man:usbmuxd(8)
   Main PID: 21824 (usbmuxd)
      Tasks: 2 (limit: 4602)
：
```

### Androidの場合
一方、Androidについては、Android側を開発者モードにした上で、Androidの開発ツールである「adb」を利用しての接続となり、ちょっとだけ敷居が高い。

- adbのインストール

```
$ sudo apt install adb
```

- Android端末

モード変更は機種やOSバージョンによって異なるだろうから、参考程度(自分はSH-02M)。

1. [設定]→[デバイス情報]の「ビルド番号」を連打して開発者モードに移行
2. [設定]→[システム]→[詳細設定]→[開発者向けオプション]→デバッグの[USBデバッグ]をONにする
3. PCとAndroid端末をUSBで接続。接続してよいかと問われたらOKを押す
4. PCの端末から以下のコマンドを実行し、Android端末を認識しているか確認

```
$ adb devices
List of devices attached
999999999999999	device
$
```

ここまでやった上でAndroidのDroidcamアプリを起動→PCのDroidcamクライアント起動→USB(Android)を選んでConnectを押す、でようやくAndroid端末とのUSB接続でDroidcamを利用できた。

なお、アプリや環境にも依るだろうが、やはりIP接続よりUSB接続の方が表示が早く感じられたので、自分が使う場合はUSB接続を選ぶことになるだろう。

## その他
### 音声
Ubuntuで試したときはアレヤコレヤした結果で繋がったものの、変なドライバ情報が残ったりしてしまったので、今回は実施していない(すみません)。

### ランチャー登録
Ubuntuと同じ手順で実施。

１点追加として、desktopファイルに「Categories=AudioVideo」を追記することで、Droidcamアイコンを「サウンドとビデオ」配下に配置できた。
![qiita_20201115_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552413/21e67ca1-db3b-ba62-9ead-8c77a347f7cf.png)


## 雑感
- Droidcamのバージョンが上がっているとは思っておらず、自分のメモが役に立たなくなっているとは・・・
- 今時、カメラなしPCなんてほとんど無いだろうから、Droidcamを使うとしたら遠隔監視なのかなと。ただ、遠隔監視だとクラウドサービス(Alfred Cameraとか)があったりするので、やっぱり古いPCで使うことになるのかなぁ・・・。

## 追記(2021/05/02)
久々に立ち上げたらなんか使えなくなってしまった。Ver1.72になっていたので、ついでにアップデートした。

```
# 古いバージョンのディレクトリにて
$ sudo ./uninstall-dkms
$ sudo ./uninstall

# 新しいバージョンのディレクトリにて
$ sudo ./install-client
$ sudo apt install linux-headers-`uname -r` gcc make
$ sudo ./install-video
$ lsmod | grep v4l2
v4l2loopback_dc        24576  0
videodev              225280  1 v4l2loopback_dc
```

Linuxのdroidcamを起動し、スマホのdroidcamも起動して接続したところ、無事画像が映ったのでOK。