如何從 Linux 命令列透過序號識別 USB 網路攝影機

如何從 Linux 命令列透過序號識別 USB 網路攝影機

如何從 Linux 命令列取得 USB 網路攝影機的序號?

我有多個 USB 網路攝影機連接到 Ubuntu 機器。它們都顯示為/dev/video0/dev/video1/dev/video2等,但我似乎找不到任何方法來以程式方式區分哪個是哪個。多台相機的型號相同,因此僅取得型號名稱是不夠的。

注意,我是不是詢問如何使用lsusb。是的,我知道您可以使用或lsusblibusb 來獲取設備序號、產品 ID、製造商名稱等。lsusb/dev/video*

例如,如果有人插入兩個相同的網路攝影機,它們顯示為/dev/video1/dev/video2然後拔下它們並將它們重新插入完全不同的端口,這樣就/dev/video2變成/dev/video3和,我可以立即知道當前的「曾經是/dev/video1」。/dev/video4/dev/video3/dev/video2

我發現的唯一類似問題僅建議在掃描 dmesg 時拔出並重新插入之類的黑客行為。我正在尋找一種純編程解決方案,不需要任何硬體操作來識別網路攝影機。

答案1

可辨識所有攝影機。命令

 $ sudo lsusb -v -d 046d:082d | grep -i serial
   iSerial                 1 05C6D16F

返回我的相機的序號(Logitech HD Pro 網路攝影機,用作範例,其中包含從之前使用 獲得的正確供應商:產品代碼lsusb)。請注意,使用sudo是絕對必要的:非特權使用者無法透過該命令存取所有可用資訊。

序號通常(但並非總是)是唯一的。如果它不唯一(只需比較具有相同供應商:產品代碼的兩個設備的上述命令的輸出),您可以使它們與眾不同。谷歌上到處都有這樣做的指南,為了徹底起見,我只會指出其中的幾個:這裡這裡。但請記住,這是一個依賴設備程序,所以你必須找出如何做為自己的相機

現在命令

$ sudo udevadm info --query=all /dev/video1 | grep 'VENDOR_ID\|MODEL_ID\|SERIAL_SHORT'
  E: ID_MODEL_ID=082d
  E: ID_SERIAL_SHORT=05C6D16F
  E: ID_VENDOR_ID=046d

傳回此特定相機的適當代碼。對所有設備進行反覆試驗/dev/videoX可以對所有設備進行分類。

答案2

我也有同樣的問題。我需要識別連接到樹莓派的 6 個 USB 相機以及 1 個以上的 USB 集線器。 6 台攝影機均具有相同的供應商 ID、型號名稱和序號。每當我關閉和打開時,我都可以使用“/dev/video0”...“/dev/video5”來處理攝影機。但我發現“/dev/videoX”並不總是分配給同一台攝影機。所以我花了一些時間來解決這個問題,最終透過使用bus#解決了它。下面是我的樹莓派的命令結果。

v4l2-ctl --列表設備

USB 2.0 相機:高清 USB 攝影機 (usb-3f980000.usb-1.2):
     /dev/video0
USB 2.0 相機: 高清 USB 攝影機 (usb-3f980000.usb-1.3):
     /dev/video1
USB 2.0 相機: 高畫質 USB 攝影機 (usb-3f980000.usb-1.4):
     /dev/video2
USB 2.0 相機: 高清 USB 攝影機 (usb-3f980000.usb-1.5.1):
     /dev/video3
USB 2.0 相機: 高畫質 USB 攝影機 (usb-3f980000.usb-1.5.2):
     /dev/video4
USB 2.0 相機: 高畫質 USB 攝影機 (usb-3f980000.usb-1.5.3):
     /dev/video5

我發現總線號碼(1.2、1.3、1.4、1.5.1、1.5.2、1.5.3)始終與實體 USB 連接埠相符。因此,我解析結果以找到每個總線#的相機路徑,以識別每個相機。現在看起來工作完美。我使用下面的命令來解析結果。

v4l2-ctl --列表設備 | awk '{split($0,a,"-"); gsub(/[):]/,"",a[3]);獲取線路;名稱=子字串($0,2);印出[3]“-”名稱;取得線路}'

答案3

我有同樣的願望從命令行獲取特定的攝像頭,這樣我就可以得到一個快捷方式來查看我的視頻,無論我插入哪個端口,等等。 這裡的答案有幫助,但並沒有完全給我完整的食譜,所以我將發布完整的解決方案。

我有一個 USB 攝像頭,用於透過與同事共享螢幕來展示我正在做的工作。我使用 VLC 將視訊來源放在一個視窗中,這樣就可以在我正在開發的程式碼旁邊看到它。這是一個具體範例,但此處的命令適用於任何程式設計用例。

基於這個答案和其他幾個答案,我想出了這個,它可以作為桌面啟動器(xfce):

bash -c "VID=$(v4l2-ctl --list-devices | grep 'H264 USB Camera' -A4 | sed -n '4p' | xargs) ; vlc v4l2://$VID --live-caching=250 --v4l2-width=1920 --v4l2-height=1080 "

分解這一切:

首先,包裝在 bash 中,以便您可以從啟動器使用管道和環境變數等:

bash -c "..."

接下來,找到正確的視訊設備並將名稱放入變數中

VID=$(...)

首先列出所有設備...

vfl2-ctl ...

符合您關心的內容,包括足夠的行來顯示所有 /dev/video* 名稱...

grep ... -A4

然後取得具有正確解析度/設定的裝置編號...

sed -n ...

修剪空格...

參數

最後,傳遞給 vlc 設定以最小化延遲並設定解析度:

vlc v4l2://$VID --live-caching=250 --v4l2-width=1920 --v4l2-height=1080

參考:

https://stackoverflow.com/questions/6022384/bash-tool-to-get-nth-line-from-a-file

https://unix.stackexchange.com/questions/493081/how-to-create-an-environment-variable-that-is-the-output-of-a-command

https://stackoverflow.com/questions/369758/how-to-trim-whitespace-from-a-bash-variable

https://askubuntu.com/questions/214977/how-can-i-find-out-the-supported-webcam-resolutions

答案4

您也可以查看其中/dev/v4l/by-id包括短連續劇的內容。

ls -l /dev/v4l/by-id/ | sort

相關內容