2010-11-27 27 views
19

Vì vậy, tất cả những gì tôi cần là đơn giản - một danh sách các thiết bị quay video hiện có (máy ảnh web). Tôi cần nó trong ứng dụng giao diện điều khiển C hoặc C++ đơn giản. Bởi danh sách tôi có nghĩa là một cái gì đó giống như giao diện điều khiển đầu ra ví dụ:Cách lấy danh sách các thiết bị quay video (máy ảnh web) trên linux (ubuntu)? (C/C++)

1) Asus Web Camera 
2) Sony Web Camera 

Vì vậy, Có vẻ như đơn giản nhưng tôi có một yêu cầu - sử dụng apis OS mẹ đẻ càng nhiều càng tốt - không có libs bên ngoài - sau khi tất cả - tất cả chúng tôi muốn là để in trong danh sách aa - không bay lên mặt trăng!)

Làm thế nào để làm điều đó?


cũng từ loạt bài này:

+1

Bạn có thể lấy nó từ/proc/bus/input/devices – chrisaycock

+1

Câu hỏi đặt ra là làm thế nào để làm điều đó từ mã? – Rella

Trả lời

11

Đây là đoạn mã tôi đã đặt xung quanh. Có lẽ là từ một cuốn sách. Tôi đoán bạn chỉ có thể lặp qua tất cả các nút/dev/videoN và nhận thông tin.

#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

và ho để lặp lại Thrue N? (chúng ta không biết N phải không?) – Rella

+0

Phải, chúng ta phải đoán đủ lớn N. Sử dụng hàm accept() để kiểm tra các nút/dev/video có n từ 0..N tồn tại. Xem câu trả lời được chấp nhận ở đây http: // stackoverflow.com/questions/230062/whats-the-best-way-to-check-if-a-file-tồn tại-in-c-cross-platform – BlueDog

+0

Cách lấy tên máy ảnh? – Rella

25

Thật dễ dàng bằng cách duyệt qua thiết bị sysfs của một lớp nhất định. Sau đây dòng lệnh lót sẽ làm như vậy:

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

Bạn có thể làm điều tương tự trong C/C++ ứng dụng, bằng cách chỉ mở ra /sys/class/video4linux thư mục, nó sẽ có liên kết tượng trưng cho tất cả các máy ảnh web của bạn như các thiết bị 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/ 

Bạn có thể theo dõi mọi liên kết đến một thư mục của mọi thiết bị và đọc toàn bộ nội dung của thư mục đó để nhận tên.

+0

лол =) Làm thế nào về một số mã compilable (như với chức năng chính bao gồm và như vậy)? – Rella

+0

@Kabumbus 1-liner ở trên khá tốt và dễ chuyển thành mã c. +1 từ tôi –

+0

Một lớp lót hoàn hảo cho tôi. Cảm ơn! Dễ dàng peasy để chèn vào bất kỳ mã nào. – Daniel

0

Tài liệu V4L2 cho biết rằng có thể có 64 thiết bị được phép cho từng loại. Ví dụ cho đường dẫn/dev/video có thể có 64 thiết bị được gán địa chỉ là/dev/video0,/dev/video1,/dev/video2 ...

Lặp lại 64 thiết bị cho đến khi ioctl retuens ENIVAL chỉ định phần cuối của cây.

25

Bạn có thể sử dụng lệnh bash sau:

v4l2-ctl --list-devices 

Để sử dụng lệnh trên, bạn phải cài đặt gói V4L-utils trước. Trong Ubuntu/Debian, bạn có thể sử dụng lệnh:

sudo apt-get install v4l-utils 
+0

Đối với những người dùng trên Arch Linux, 'v4l2-ctl' được cung cấp trong gói' v4l-utils'. – ElDog

+0

Tôi tìm thấy bằng cách sử dụng '' 'v4l2-ctl --list-devices''' để có câu trả lời tốt nhất cho vấn đề cụ thể của tôi. Tôi đã kết thúc bằng cách sử dụng nó cho một cấu hình python đơn giản. Gist [ở đây] (https://gist.github.com/kphretiq/e5b95e7fc2b11819121e). – lysdexia

Các vấn đề liên quan