最近更新: 2017-02-13

List device path and product name of USB video devices

UVC (USB video class - wikipedia) 泛指使用 USB 連接介面的影像產品。一般使用者最熟悉的 UVC 設備就是 WebCam 。除了 WebCam ,還有數位攝影機、電視卡、或具有照相功能的設備。故一台電腦接了兩台以上的 UVC 設備並非罕見。

在 Linux 核心中,會為可用的 UVC 設備各自分配一個 dev 路徑,檔名為 video 編號。例如 /dev/video0, /dev/video1 。但是當你的電腦接了兩台以上不同的 UVC 設備時,你將發現系統缺乏清楚的訊息告訴你這些 dev 路徑與 UVC 設備的關係。你不知道這些 dev 路徑各自代表哪一台 UVC 設備。當你的應用軟體需要用 dev 路徑開啟特定設備時,這會帶給你一些小麻煩。

本文以 shell script 和 python 分別實作了一個列出 dev 路徑與其代表的 UVC 設備名稱的小工具。

shell script

ls-uvc.sh

#!/bin/sh
# list device path and product name of USB video devices (WebCam).
UVCROOT=/sys/bus/usb/drivers/uvcvideo

if [ ! -d $UVCROOT ]; then
    echo "No UVC device!"
    exit 0
fi

for FILE in `ls $UVCROOT`; do
    V4LPATH=$UVCROOT/$FILE/video4linux
    if [ -d $V4LPATH ]; then
        # there should be only one folder.
        DEVNAME=`ls $V4LPATH | grep video`
        PRODUCT_NAME=`cat $V4LPATH/$DEVNAME/name`
        echo "* /dev/$DEVNAME is \"${PRODUCT_NAME}\""
    fi
done

python

ls-uvc.py

#!/usr/bin/python
'''
List device path and product name of USB video devices (WebCam).
'''
import os
from glob import glob

def list_uvc_devices():
    uvc_root = '/sys/bus/usb/drivers/uvcvideo'

    results = []
    for fn in glob('%s/*' % uvc_root):
        v4l_path = '%s/video4linux' % fn
        if not os.path.isdir(v4l_path):
            continue

        _ = glob('%s/video*' % v4l_path)
        dev_name = os.path.basename(_[0])
        dev_path = '/dev/%s' % dev_name

        _ = '%s/%s/name' % (v4l_path, dev_name)
        product_name = open(_).readline().strip()

        results.append((dev_path, product_name))

    return results


for dev_path, product_name in list_uvc_devices():
    print '* %s is "%s"' % (dev_path, product_name)