在 OBS 中將攝像頭鎖定到特定的 USB 埠
如果在 Linux 上用多個攝像頭 使用 OBS 進行直播,你可能會注意到攝像頭會在開機時按照它們被檢測到的順序載入。通常情況下你不需要特別在意,但如果你有一個固定的直播設置和複雜的 OBS 模板,你需要知道現實世界中哪個攝像頭將會顯示在虛擬世界的哪個屏幕上。換句話說,你不希望今天將一個設備分配為「攝像頭 A」,而明天它卻成為「攝像頭 B」。
為了使複雜的攝像頭設置標準化,你可以對 Linux 文件系統中攝像頭的位置分配施加一些特殊規則。
udev 子系統
在 Linux 上處理硬體外設的系統稱為 udev。它檢測和管理你接入計算機的所有設備。你可能沒有意識到它的存在,因為它不會吸引太多注意力。儘管當你插入 USB 快閃記憶體驅動器以在桌面上打開它或連接印表機時,你肯定與它交互過。
硬體檢測
假設你有兩個 USB 攝像頭:一個在電腦左側,另一個在右側。左側攝像頭拍攝近景,右側攝像頭拍攝遠景,並且在直播過程中你需要切換兩個攝像頭。在 OBS 中,你將每個攝像頭添加到 源 面板中,並直觀地將它們命名為 「camLEFT」 和 「camRIGHT」。
設想一種最壞的場景,你有兩個 相同的 攝像頭:它們是同一品牌、同一型號。這是最壞的情況,因為當兩個硬體設備完全相同時,它們幾乎不可能有任何獨特的 ID,以便你的電腦能夠將它們區分開來。
不過,這個難題有解決辦法,只需要一些簡單的終端命令進行一些調查。
1、獲取廠商和產品 ID
首先,將一個攝像頭插入你想要它分配到的 USB 埠。然後輸入以下命令:
$ lsusb
Bus 006 Device 002: ID 0951:1666 Kingston Technology DataTraveler G4
Bus 005 Device 003: ID 03f0:3817 Hewlett-Packard LaserJet P2015 series
Bus 003 Device 006: ID 045e:0779 Microsoft Corp. LifeCam HD-3000
Bus 003 Device 002: ID 8087:0025 Intel Corp.
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 003: ID 046d:c216 Logitech, Inc. Dual Action Gamepad
Bus 001 Device 002: ID 048d:5702 Integrated Technology Express, Inc.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
[...]
你通常可以專門搜索字元串 cam
以縮小結果範圍,因為大多數(但不是所有)攝像頭都會報告為 「camera」。
$ lsusb | grep -i cam
Bus 003 Device 006: ID 045e:0779 Microsoft Corp. LifeCam HD-3000
這裡有很多信息。ID 被列為 045e:0779
。第一個數字是供應商 ID,第二個數字是產品 ID。把它們寫下來,因為稍後你會需要它們。
2、獲取 USB 標識符
你還獲取了攝像頭的設備路徑:匯流排 3,設備 6。在 Linux 中有一句話:「一切皆文件」,實際上,USB 設備被描述為以 /dev/bus/usb/
開始,以匯流排(本例中為 003)和設備(本例中為 006)結尾的文件路徑。查看 lsusb
輸出中的匯流排和設備號。它們告訴你該攝像頭位於 /dev/bus/usb/003/006
。
你可以使用 udevadm
命令獲取此 USB 設備的內核代號:
$ sudo udevadm info --attribute-walk /dev/bus/usb/003/006 | grep "KERNEL="
KERNEL=="3-6.2.1"
這個例子中的內核 USB 標識符是 3-6.2.1
。把你系統中的標識符記下來,因為之後也會用到它。
3、為每個攝像頭重複該過程
將另一個攝像頭(如果你有多個攝像頭,則為每個攝像頭)連接到要分配給它的 USB 埠。這與你用於另一個攝像頭的 USB 埠是不同的!
重複該過程,獲取供應商和產品 ID(如果攝像頭是相同的品牌和型號,則應與第一個攝像頭相同)以及內核 USB 標識符。
$ lsusb | grep -i cam
Bus 001 Device 004: ID 045e:0779 Microsoft Corp. LifeCam HD-3000
$ sudo udevadm info --attribute-walk dev/bus/usb/001/004 | grep "KERNEL="
KERNEL=="1-6"
在這個例子中,我已經確定我的攝像頭連接到了 1-6 和 3-6.2.1(第一個是我的機器上的 USB 埠,另一個是插在我的機器上的顯示器插口的集線器,這就是為什麼一個比另一個更複雜的原因)。
編寫一個 udev 規則
你已經有了所需的一切,因此現在可以編寫一個規則,告訴 udev 在特定的 USB 埠找到一個攝像頭時給它一個一致的標識符。
創建並打開一個名為 /etc/udev/rules.d/50-camera.conf
的文件,並輸入這兩個規則,使用適合你自己系統的廠商和產品 ID 和內核標識符:
SUBSYSTEM=="usb", KERNEL=="1-6", ATTR{idVendor}=="045e", ATTR{idProduct}=="0779", SYMLINK+="video100"
SUBSYSTEM=="usb", KERNEL=="3-6.2.1", ATTR{idVendor}=="045e", ATTR{idProduct}=="0779", SYMLINK+="video101"
這些規則告訴 udev,當在特定的 USB 位置找到與特定供應商和產品 ID 匹配的設備時,創建一個名為 video100
和 video101
的符號鏈接(有時也稱為「別名」)。符號鏈接大多是任意的。我使用較大的數字,這樣它們就容易被發現,並且數字不能與現有設備衝突。如果實際上有超過 101 個攝像頭連接到計算機上,請使用 video200
和 video201
以確保安全(記得聯繫我!我很想了解 該 項目的情況)。
重啟
重新啟動計算機。你現在可以讓攝像頭保持連接在計算機上,但實際上這並不重要。一旦 udev 載入了規則,它就會遵循這些規則,無論設備是否在啟動期間附加或稍後插入。
許多人說 Linux 從不需要重啟,但是 udev 在引導期間載入其規則,而且此外,你想保證你的 udev 規則在重新啟動時也起作用。
計算機重新啟動後,請查看攝像頭註冊的 /dev/video
目錄:
$ ls -1 /dev/video*
/dev/video0
/dev/video1
/dev/video100
/dev/video101
/dev/video2
/dev/video3
正如你所看到的,在 video100
和 video101
有條目。今天,這些是指向 /dev/video2
和 /dev/video3
的符號鏈接,但明天它們可能是指向 /dev/video1
和 /dev/video2
或任何其他基於 Linux 檢測和分配文件的組合。
![兩個攝像頭角度](/data/attachment/album/202305/06/233106tmjqyjqh4x48eu4p.jpg "Two camera angles")
你可以在 OBS 中使用這些符號鏈接,這樣 camLEFT 始終是 camLEFT,camRIGHT 始終是 camRIGHT。
(題圖:MJ/9bb70b6d-9f49-493a-8daf-5546d207781f)
via: https://opensource.com/article/22/1/cameras-usb-ports-obs
作者:Seth Kenlon 選題:lujun9972 譯者:hanszhao80 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive