v4l2loopback – matoken's blog https://matoken.org/blog Is there no plan B? Tue, 29 Mar 2022 11:25:55 +0000 ja hourly 1 https://wordpress.org/?v=6.7.2 https://matoken.org/blog/wp-content/uploads/2025/03/cropped-1865f695c4eecc844385acef2f078255036adccd42c254580ea3844543ab56d9-32x32.jpeg v4l2loopback – matoken's blog https://matoken.org/blog 32 32 snap版scrcpyでAndroidデバイス画面をビデオデバイスに出力 https://matoken.org/blog/2022/03/29/output-android-device-screen-to-video-device-with-snap-version-scrcpy/ https://matoken.org/blog/2022/03/29/output-android-device-screen-to-video-device-with-snap-version-scrcpy/#comments Tue, 29 Mar 2022 11:20:37 +0000 http://matoken.org/blog/?p=3559

Androidアプリの画面をsnap版のscrcpyでビデオデバイスに流し込もうとしたら少しハマったのでメモしておきます.

Debian Bullseye amd64のscrcpyでAndroidの画面をビデオデバイスに出力してみようと --v4l2-sink オプションを指定したところバージョンが古く未対応でした.

$ /bin/scrcpy --v4l2-sink /dev/video8
/bin/scrcpy: unrecognized option '--v4l2-sink'

Debian sidの 1.23-1 だと存在するオプションなのですがそれを入れると依存関係がおかしくなりそうなので避けたいところ.

Androidアプリの画面をsnap版のscrcpyでビデオデバイスに流し込もうとしたら少しハマったのでメモしておきます.


Debian Bullseye amd64のscrcpyでAndroidの画面をビデオデバイスに出力してみようと --v4l2-sink オプションを指定したところバージョンが古く未対応でした.

$ /bin/scrcpy --v4l2-sink /dev/video8
/bin/scrcpy: unrecognized option '--v4l2-sink'

Debian sidの 1.23-1 だと存在するオプションなのですがそれを入れると依存関係がおかしくなりそうなので避けたいところ.

$ rmadison scrcpy
scrcpy     | 1.17-1        | stable         | source, amd64, arm64, armel, armhf, i386, mips64el, mipsel, ppc64el, s390x
scrcpy     | 1.23-1        | unstable       | source, amd64, arm64, armel, armhf, i386, mips64el, mipsel, ppc64el, s390x
scrcpy     | 1.23-1        | unstable-debug | source

snapを確認すると1.23のようなのでこれを導入してみました.

$ snap find scrcpy
Name       Version  Publisher   Notes  Summary
scrcpy     v1.23    sisco311    -      Display and control your Android device
guiscrcpy  v4.9.0   srevinsaju  -      An opensource graphical user interface for Android screen mirroring
$ snao install scrcpy
$ snap info scrcpy
name:      scrcpy
summary:   Display and control your Android device
publisher: sisco311
store-url: https://snapcraft.io/scrcpy
contact:   https://github.com/sisco311/scrcpy-snap/issues
license:   Apache-2.0
description: |
  This application provides display and control of Android devices connected on USB (or over
  TCP/IP). It does not require any root access.

  This is an unofficial snap. The code of scrcpy can be found at:
  https://github.com/Genymobile/scrcpy
commands:
  - scrcpy.adb
  - scrcpy
snap-id:      M7yvgnqOvyQj64bolfpawIAEwHv7dQ5G
tracking:     latest/stable
refresh-date: today at 01:27 JST
channels:
  latest/stable:    v1.23             2022-03-03 (379)  87MB -
  latest/candidate: ↑
  latest/beta:      v1.23-2-gadbe7908 2022-03-02 (376)  87MB -
  latest/edge:      v1.21-2-g5704ec6  2021-12-07 (358) 101MB -
installed:          v1.23                        (379)  87MB -

1.23です.

$ which scrcpy
/snap/bin/scrcpy
$ scrcpy --version
scrcpy 1.23 <https://github.com/Genymobile/scrcpy>

Dependencies (compiled / linked):
 - SDL: 2.0.8 / 2.0.8
 - libavcodec: 57.107.100 / 57.107.100
 - libavformat: 57.83.100 / 57.83.100
 - libavutil: 55.78.100 / 55.78.100
 - libavdevice: 57.10.100 / 57.10.100
 - libusb: - / 1.0.21

早速使おうと思いましたがエラーとなってしまいました.

$ scrcpy --v4l2-sink /dev/video8
scrcpy 1.23 <https://github.com/Genymobile/scrcpy>
INFO: Video orientation is locked for v4l2 sink. See --lock-video-orientation.
/usr/local/share/scrcpy/scrcpy-server: 1 file pushed. 6.8 MB/s (41123 bytes in 0.006s)
[server] INFO: Device: motorola moto g31(w) (Android 11)
INFO: Renderer: opengl
INFO: OpenGL version: 3.0 Mesa 20.0.8
INFO: Trilinear filtering enabled
INFO: Initial texture: 1080x2400
ERROR: Failed to open output device: /dev/video8
ERROR: Could not open frame sink 1
ERROR: Could not open decoder sinks
ERROR: Could not open packet sink 0
ERROR: Could not open demuxer sinks
WARN: Device disconnected
WARN: Killing the server...

このデバイスは存在するし,別のアプリケーションから動画を流し込むと動作します.

issueを検索すると以下のコメントを見つけました.

以下のコマンドでsnapのscrcpyにビデオデバイスを接続する必要があるようです.

$ snap connect scrcpy:camera

認識させたあと実行するとうまく行きました.

$ scrcpy --v4l2-sink /dev/video8 --lock-video-orientation --max-size=720 -N
scrcpy 1.23 <https://github.com/Genymobile/scrcpy>
/usr/local/share/scrcpy/scrcpy-server: 1 file pushed. 10.6 MB/s (41123 bytes in 0.004s)
[server] INFO: Device: motorola moto g31(w) (Android 11)
INFO: v4l2 sink started to device: /dev/video8

scrcpy snap2video

環境
$ snap info scrcpy | grep installed:
installed:          v1.23                        (379)  87MB -
$ dpkg-query -W snap v4l2loopback-dkms v4l2loopback-source v4l2loopback-utils
snap
v4l2loopback-dkms       0.12.5-1
v4l2loopback-source     0.12.5-1
v4l2loopback-utils      0.12.5-1
$ lsb_release -dr
Description:    Debian GNU/Linux 11 (bullseye)
Release:        11
$ uname -a
Linux yoga-260 5.16.15-le9 #10 SMP PREEMPT Sat Mar 19 01:52:06 JST 2022 x86_64 GNU/Linux
$ arch
x86_64
$ rmadison scrcpy
scrcpy     | 1.17-1        | stable         | source, amd64, arm64, armel, armhf, i386, mips64el, mipsel, ppc64el, s390x
scrcpy     | 1.23-1        | unstable       | source, amd64, arm64, armel, armhf, i386, mips64el, mipsel, ppc64el, s390x
scrcpy     | 1.23-1        | unstable-debug | source

snapを確認すると1.23のようなのでこれを導入してみました.

$ snap find scrcpy
Name       Version  Publisher   Notes  Summary
scrcpy     v1.23    sisco311    -      Display and control your Android device
guiscrcpy  v4.9.0   srevinsaju  -      An opensource graphical user interface for Android screen mirroring
$ snao install scrcpy
$ snap info scrcpy
name:      scrcpy
summary:   Display and control your Android device
publisher: sisco311
store-url: https://snapcraft.io/scrcpy
contact:   https://github.com/sisco311/scrcpy-snap/issues
license:   Apache-2.0
description: |
  This application provides display and control of Android devices connected on USB (or over
  TCP/IP). It does not require any root access.

  This is an unofficial snap. The code of scrcpy can be found at:
  https://github.com/Genymobile/scrcpy
commands:
  - scrcpy.adb
  - scrcpy
snap-id:      M7yvgnqOvyQj64bolfpawIAEwHv7dQ5G
tracking:     latest/stable
refresh-date: today at 01:27 JST
channels:
  latest/stable:    v1.23             2022-03-03 (379)  87MB -
  latest/candidate: ↑
  latest/beta:      v1.23-2-gadbe7908 2022-03-02 (376)  87MB -
  latest/edge:      v1.21-2-g5704ec6  2021-12-07 (358) 101MB -
installed:          v1.23                        (379)  87MB -

1.23です.

$ which scrcpy
/snap/bin/scrcpy
$ scrcpy --version
scrcpy 1.23 <https://github.com/Genymobile/scrcpy>

Dependencies (compiled / linked):
 - SDL: 2.0.8 / 2.0.8
 - libavcodec: 57.107.100 / 57.107.100
 - libavformat: 57.83.100 / 57.83.100
 - libavutil: 55.78.100 / 55.78.100
 - libavdevice: 57.10.100 / 57.10.100
 - libusb: - / 1.0.21

早速使おうと思いましたがエラーとなってしまいました.

$ scrcpy --v4l2-sink /dev/video8
scrcpy 1.23 <https://github.com/Genymobile/scrcpy>
INFO: Video orientation is locked for v4l2 sink. See --lock-video-orientation.
/usr/local/share/scrcpy/scrcpy-server: 1 file pushed. 6.8 MB/s (41123 bytes in 0.006s)
[server] INFO: Device: motorola moto g31(w) (Android 11)
INFO: Renderer: opengl
INFO: OpenGL version: 3.0 Mesa 20.0.8
INFO: Trilinear filtering enabled
INFO: Initial texture: 1080x2400
ERROR: Failed to open output device: /dev/video8
ERROR: Could not open frame sink 1
ERROR: Could not open decoder sinks
ERROR: Could not open packet sink 0
ERROR: Could not open demuxer sinks
WARN: Device disconnected
WARN: Killing the server...

このデバイスは存在するし,別のアプリケーションから動画を流し込むと動作します.

issueを検索すると以下のコメントを見つけました.

以下のコマンドでsnapのscrcpyにビデオデバイスを接続する必要があるようです.

$ snap connect scrcpy:camera

認識させたあと実行するとうまく行きました.

$ scrcpy --v4l2-sink /dev/video8 --lock-video-orientation --max-size=720 -N
scrcpy 1.23 <https://github.com/Genymobile/scrcpy>
/usr/local/share/scrcpy/scrcpy-server: 1 file pushed. 10.6 MB/s (41123 bytes in 0.004s)
[server] INFO: Device: motorola moto g31(w) (Android 11)
INFO: v4l2 sink started to device: /dev/video8

scrcpy snap2video

環境
$ snap info scrcpy | grep installed:
installed:          v1.23                        (379)  87MB -
$ dpkg-query -W snap v4l2loopback-dkms v4l2loopback-source v4l2loopback-utils
snap
v4l2loopback-dkms       0.12.5-1
v4l2loopback-source     0.12.5-1
v4l2loopback-utils      0.12.5-1
$ lsb_release -dr
Description:    Debian GNU/Linux 11 (bullseye)
Release:        11
$ uname -a
Linux yoga-260 5.16.15-le9 #10 SMP PREEMPT Sat Mar 19 01:52:06 JST 2022 x86_64 GNU/Linux
$ arch
x86_64
]]>
https://matoken.org/blog/2022/03/29/output-android-device-screen-to-video-device-with-snap-version-scrcpy/feed/ 2
v4l2loopbackモジュールで作られるビデオデバイスへの名前の付け方 https://matoken.org/blog/2021/01/11/how-to-name-video-devices-created-with-the-v4l2loopback-module/ https://matoken.org/blog/2021/01/11/how-to-name-video-devices-created-with-the-v4l2loopback-module/#respond Mon, 11 Jan 2021 10:44:58 +0000 http://matoken.org/blog/?p=2912

v4l2loopback moduleを利用して仮想カメラなどを利用しています.

このモジュールを呼び出すときにオプションを指定して複数のデバイスにしたり,それぞれにデバイスに名前をつけたり出来ます.

If you need several independent loopback devices, you can pass the “devices” option, when loading the module; e.g.

# modprobe v4l2loopback devices=4
Will give you 4 loopback devices (e.g. /dev/video1 …​ /dev/video5)

You can also specify the device IDs manually; e.g.

# modprobe v4l2loopback video_nr=3,4,7
Will create 3 devices (/dev/video3, /dev/video4 & /dev/video7)

# modprobe v4l2loopback video_nr=3,4,7 card_label=”device number 3″,”the number four”,”the last one”
Will create 3 devices with the card names passed as the second parameter:

/dev/video3 → device number 3
/dev/video4 → the number four
/dev/video7 → the last one

お手本通りモジュールを呼び出すと,

$ sudo modprobe v4l2loopback video_nr=3,4,7 card_label="device number 3","the number four","the last
one"

想定通りに設定されました.(最後のIntegrated Cameraは内蔵カメラでこのモジュールとは無関係)

$ v4l2-ctl --list-devices
device number 3" (platform:v4l2loopback-000):
        /dev/video3

"the number four" (platform:v4l2loopback-001):
        /dev/video4

"the last one (platform:v4l2loopback-002):
        /dev/video7

Integrated Camera: Integrated C (usb-0000:00:1a.0-1.6):
        /dev/video0
        /dev/video1
        /dev/media0

しかしこの設定を永続化しようと,
/etc/modprobe.d/v4l2loopback.conf
というファイルを用意してこの設定を書いて呼び出すとおかしなことになります.

$ sudo rmmod v4l2loopback (1)
$ echo 'options v4l2loopback video_nr=3,4,7 card_label="device number 3","the number four","the last one"' | sudo tee /etc/modprobe.d/v4l2loopback.conf (2)
options v4l2loopback video_nr=3,4,7 card_label="device number 3","the number four","the last one"
$ sudo modprobe -v v4l2loopback (3)
insmod /lib/modules/5.10.0-1-amd64/updates/dkms/v4l2loopback.ko video_nr=3,4,7 card_label="device number 3","the number four","the last one"
$ v4l2-ctl --list-devices | grep v4l2loopback -A1 (4)
device number 3" (platform:v4l2loopback-000):
        /dev/video3
--
"the number four" (platform:v4l2loopback-001):
        /dev/video4
--
"the last one (platform:v4l2loopback-002):
        /dev/video7
  1. モジュールのアンロード
  2. 設定ファイルへ書き込み
  3. モジュールの再読込
  4. デバイス名の確認

ダブルクオーテーションの扱いが変わってしまうようです.更に名前自体にダブルクオーテーションが含まれてしまいます.

とりあえず全体を1セットのダブルクオーテーションで囲むと大丈夫なようです.

$ echo 'options v4l2loopback video_nr=3,4,7 card_label="device number 3,the number four,the last one"' | sudo tee /etc/modprobe.d/v4l2loopback.conf
options v4l2loopback video_nr=3,4,7 card_label="device number 3,the number four,the last one"
$ sudo modprobe -v v4l2loopback
insmod /lib/modules/5.10.0-1-amd64/updates/dkms/v4l2loopback.ko video_nr=3,4,7 card_label="device number 3,the number four,the last one"
$ v4l2-ctl --list-devices | grep v4l2loopback -A1
device number 3 (platform:v4l2loopback-000):
        /dev/video3
--
the number four (platform:v4l2loopback-001):
        /dev/video4
--
the last one (platform:v4l2loopback-002):
        /dev/video7

ちなみにダブルクオーテーションなしだとこうなりました.

$ sudo modprobe -v v4l2loopback
insmod /lib/modules/5.10.0-1-amd64/updates/dkms/v4l2loopback.ko video_nr=3,4,7 card_label=device number 3,the number four,the last one
$ v4l2-ctl --list-devices | grep v4l2loopback -A1
device (platform:v4l2loopback-000):
        /dev/video3
--
Dummy video device (0x0001) (platform:v4l2loopback-001):
        /dev/video4
--
Dummy video device (0x0002) (platform:v4l2loopback-002):
        /dev/video7

最近リリースされた OBS Studio 26.1でLinux版, macOS版にも仮想カメラ機能が入りました.
これも v4l2loopback を利用しているのですが,ダブルクオーテーションが含まれる場合うまく動かないようです.

環境
$ dpkg-query -W v4l2loopback-* v4l-utils
v4l-utils       1.20.0-2
v4l2loopback-dkms       0.12.5-1
v4l2loopback-modules
v4l2loopback-utils      0.12.5-1
$ lsb_release -dr
Description:    Debian GNU/Linux bullseye/sid
Release:        unstable
$ uname -mv
#1 SMP Debian 5.10.4-1 (2020-12-31) x86_64

]]>
https://matoken.org/blog/2021/01/11/how-to-name-video-devices-created-with-the-v4l2loopback-module/feed/ 0