Linux版OBSのV4L2ソースの固定化について

2025-11-09 oss linux device

わかる人向け 

OBSの Video Capture Device (V4L2)/dev/video0 などのパスで覚えていて、 よく取り違えるので、Media Source/dev/v4l/by-id/* などを渡した方が良いということです。

#作戦その3-メディアソースを使う-成功

そもそも何が問題なのか 

Linux版OBSの Video Capture Device (V4L2) のプロパティー上は、 一見、デバイスが固定化できているように見えます。

以下は実際に、キャプチャーカードを設定した状態です。

しかし、当該デバイス (キャプチャーカード) を引き抜くと…?

/dev/video1という表示になってしまいました。

嫌な予感はしつつ、カメラデバイスを挿入すると?

キャプチャーカードの映像を映していたはずの Video Capture Device (V4L2) が、カメラ映像に差し替わってしまいました。

これでは放送事故ですね。

補足1: キャプチャーカードの使用していた /dev/video1 が抜かれることにより開放され、 また、カメラが挿入されたことにより、/dev/video1にカメラが再割り当てられたことにより発生します。

補足2: この現象には Reina Sakiria が気づきました。

作戦その1: 固定的なSYMLINKを作る (失敗) 

sudo udevadm info --query=all /dev/video1

の結果を参考に、 /etc/udev/rules.d/99-webcam.rules に以下のようなファイルを作成し、 udevを用いて自動的にSYMLINKを作ってみることにしました。

SUBSYSTEM=="video4linux", ATTR{name}=="EMEET SmartCam C60E 4K: EMEET S", ATTR{index}=="0", SYMLINK+="my-webcam"

これで安定的に /dev/my-webcam を得られます!

しかしOBSは、任意のデバイスパスを入力できるインターフェースになっておらず、 そもそも設定できませんでした。

冷静になってみると、デバイスを一意に識別するためのSYMLINKは 最初から存在することを思い出しました。

もし、任意パスが設定可能ならば、それを最初から入力すればよいのです。

$ ls /dev/v4l/by-id/
usb-EMEET_EMEET_SmartCam_C60E_4K_A250401000104353-video-index0
usb-EMEET_EMEET_SmartCam_C60E_4K_A250401000104353-video-index1
usb-MACROSILICON_USB3.0_UHD_20210623-video-index0
usb-MACROSILICON_USB3.0_UHD_20210623-video-index1

注意として、Apple Facetime HDの様な、PCIeデバイスは列挙されません。

そのようなデバイスについては、by-path を使うと良いでしょう。

$ ls /dev/v4l/by-path/
/dev/v4l/by-path/pci-0000:02:00.0-video-index0

これらのようなパスがどこにあるかも、先程のudevadmコマンドで確認できます。

作戦その2: OBSのシーンファイルをいじる (半成功) 

OBSは、シーンの情報をJSONファイル (~/.config/obs-studio/basic/scenes/Untitled.json など) に保存します。

そこにある /dev/video1 をこっそり、 /dev/v4l/by-id/usb-EMEET_EMEET_SmartCam_C60E_4K_A250401000104353-video-index1 に書き換えてみました。

デバイスを取り違えることはなくなり、「起動直後は」 期待通りに動作しました!

しかし、デバイスを抜き差しすると、映像が止まり、復帰しません。 これは、ソースを有効化・無効化しても改善しませんでした。 これでは困りますね。

OBSの Video Capture Device (V4L2) の挙動 

どうやら、ソースの有効・無効関係なく、カメラを掴みっぱなしにする挙動をするようです。

また、 なにやらudevを使って抜き差し検知 しているようで、しかしながら、SYMLINKを食わせることによりその挙動を破壊してしまったみたいです。

Video Capture Device (V4L2) を使うこと自体を諦めたほうが良さそうです。

作戦その3: メディアソースを使う (成功) 

ところでOBSは、Media Source という名前で、ffmpegによる任意入力をサポートしていることを思い出しました。

GUIでWrapされていて分かりづらいですが、このように設定すれば、V4L2ソースを映すことができました!

もしカメラが接続断しても、Reconnect Delay毎に再試行されるようです。

めでたしめでたし。