2010-11-27 95 views
19

所以我需要的只是簡單 - 一個當前可用的視頻捕捉設備(網絡攝像頭)列表。我需要它在簡單的C或C++控制檯應用程序。通過列表我的意思是像這樣的控制檯輸出:如何獲取Linux(ubuntu)上的視頻捕捉設備(網絡攝像頭)列表? (C/C++)

1) Asus Web Camera 
2) Sony Web Camera 

所以它似乎很簡單,但我有一個條件 - 使用本地OS API的儘可能多的 - 沒有外部庫 - 畢竟 - 所有我們想要的是打印出去的名單 - 不要飛上月球!)

如何做這樣的事情?


也從這個系列:

+1

你能得到它從/ proc /總線/輸入/設備 – chrisaycock 2010-11-27 09:03:03

+1

問題是究竟如何從代碼做呢? – Rella 2010-11-27 09:03:44

回答

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

和ho重複thrue N? (我們不知道N是否是我們的?) – Rella 2010-11-27 21:31:25

+0

對,我們必須猜測一個足夠大的N.使用accept()函數來檢查哪些/ dev/video節點存在n..n。請參閱這裏接受的答案http:// stackoverflow。com/questions/230062 /最好的方式來檢查,如果一個文件存在於C - 跨平臺 – BlueDog 2010-11-28 08:00:47

25

通過給定的類遍歷sysfs設備很容易。下面的命令行一個襯墊會這樣做:

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

V4L2文檔說明每個類型可以有64個允許的設備。例如,對於路徑/ dev/video,可以有64個設備尋址爲/ dev/video0,/ dev/video1,/ dev/video2 ...

迭代64個設備,直到ioctl重新規定ENIVAL,樹。 爲v41-utils的

v4l2-ctl --list-devices 

爲了使用上面的命令,則必須安裝包:

25

您可以使用下面的bash命令。在Ubuntu/Debian的你可以使用命令:

sudo apt-get install v4l-utils 
相關問題