2010-11-27 6 views
19

私が必要とするのは、現在入手可能なビデオキャプチャデバイス(Webカメラ)のリストです。私は単純なCまたはC++のコンソールアプリケーションでそれが必要です。リストによって私は、このようなコンソール出力のようなものを意味しません: - ネイティブOSのAPIの使用を可能な限り -Linux(ubuntu)でビデオキャプチャデバイス(Webカメラ)のリストを取得するには? (C/C++)

1) Asus Web Camera 
2) Sony Web Camera 

だから、それは簡単なようだが、私は1つの要件を持っているのは外部LIBSに - 結局のところ - 私たちが望むすべてが印刷しますアウトリスト - 月に飛ぶことはありません!)

このようなことを行う方法?

このシリーズからも

:正しいと

+1

あなたは – chrisaycock

+1

procの/バス/入力/デバイス/からそれを得ることができる質問は、コードからそれを行うにはどのように正確ですか? – Rella

答えて

11

これは私が転がっていたコードスニペットです。おそらく本から。あなたはすべての/ dev/videoNノードを反復して情報を得ることができると思います。

#include <stdio.h> 
#include <unistd.h> 
#include <fcntl.h> 
#include <sys/ioctl.h> 
#include <linux/videodev.h> 

int main(){ 
    int fd; 
    struct video_capability video_cap; 
    struct video_window  video_win; 
    struct video_picture video_pic; 

    if((fd = open("/dev/video0", O_RDONLY)) == -1){ 
     perror("cam_info: Can't open device"); 
     return 1; 
    } 

    if(ioctl(fd, VIDIOCGCAP, &video_cap) == -1) 
     perror("cam_info: Can't get capabilities"); 
    else { 
     printf("Name:\t\t '%s'\n", video_cap.name); 
     printf("Minimum size:\t%d x %d\n", video_cap.minwidth, video_cap.minheight); 
     printf("Maximum size:\t%d x %d\n", video_cap.maxwidth, video_cap.maxheight); 
    } 

    if(ioctl(fd, VIDIOCGWIN, &video_win) == -1) 
     perror("cam_info: Can't get window information"); 
    else 
     printf("Current size:\t%d x %d\n", video_win.width, video_win.height); 

    if(ioctl(fd, VIDIOCGPICT, &video_pic) == -1) 
     perror("cam_info: Can't get picture information"); 
    else 
     printf("Current depth:\t%d\n", video_pic.depth); 

    close(fd); 
    return 0; 
} 
+0

と繰り返してNを繰り返しますか? (我々はNが我々を行うに知っていない?) – Rella

+0

権を我々は0..Nからn個とは/ dev /ビデオ・ノードが存在するかどうか確認するために受け入れる()関数を使用して十分に大きいN.を推測する必要があります。ここでは、HTTP経由で受け入れ答えを参照してください:// stackoverflowの。com/questions/230062/whats-the-best-way-to-a-file-if-c-cross-platformにあります – BlueDog

+0

カメラ名の取得方法は? – Rella

25

sysfsデバイスを特定のクラスでトラバースするだけで簡単です。 1つのライナーがそうでしょう、次のコマンドライン:

for I in /sys/class/video4linux/*; do cat $I/name; done 

あなたはC/C++アプリケーションで同じことを行うことができ、ちょうど/sys/class/video4linuxディレクトリを開くことで、それはvideo4linuxデバイスなど、すべてのウェブカメラにシンボリックリンクを持っています。

$ ls -al /sys/class/video4linux       
drwxr-xr-x 2 root root 0 Ноя 27 12:19 ./ 
drwxr-xr-x 34 root root 0 Ноя 26 00:08 ../ 
lrwxrwxrwx 1 root root 0 Ноя 27 12:19 video0 -> ../../devices/pci0000:00/0000:00:13.2/usb2/2-5/2-5:1.0/video4linux/video0/ 

あなたはすべてのデバイスのディレクトリにすべてのシンボリックリンクをたどると名前を取得するには、そのディレクトリにnameファイルの完全な内容を読み取ることができます。

+0

лол=)コンパイル可能なコードはどうですか(main関数includeなど)。 – Rella

+0

@Kabumbus上記の1-linerはかなり良いコードで、簡単にCコードに変換できます。 +1私から –

+0

私のためのワンライナーに最適です。ありがとう!任意のコードに簡単に挿入できます。 – Daniel

0

V4L2のドキュメントによれば、各タイプには64個のデバイスが許可されています。例えばパス/ dev/videoの場合、/ dev/video0、/ dev/video1、/ dev/video2のようにアドレス指定された64個のデバイスが存在する可能性があります...

ioctl retuens ENIVAL木。あなたは、次のbashコマンドを使用することができます

25

:上記のコマンドを使用するためには

v4l2-ctl --list-devices 

を、あなたは前のv4l-utilsのパッケージをインストールする必要があります。 Ubuntuの/ Debianでは、このコマンドを使用することができます。

sudo apt-get install v4l-utils 
+0

Arch Linuxの場合、 'v4l2-ctl'は' v4l-utils'パッケージで提供されています。 – ElDog

+0

私は、 '' '' v4l2-ctl --list-devices'''を使って、私の特定の問題に対する最良の答えとなることを発見しました。私は単純なpythonのコンフィギュレータのためにそれを使用して終了しました。 Gist [ここ](https://gist.github.com/kphretiq/e5b95e7fc2b11819121e)。 – lysdexia