У меня возникла проблема с V4L (API, который обеспечивает унифицированный доступ к различным видеозахватам для Linux). Я пытаюсь сделать вызов VIDIOCGCAP ioctl, но получаю ошибку INVALID ARGUMENT. Вот Трассирование:Проблема V4L с вызовом VIDIOCGCAP ioctl
execve("./test", ["./test"], [/* 26 vars */]) = 0 brk(0) = 0x8d5c000 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7fc9000 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) open("/etc/ld.so.cache", O_RDONLY) = 3 fstat64(3, {st_mode=S_IFREG|0644, st_size=29703, ...}) = 0 mmap2(NULL, 29703, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7fc1000 close(3) = 0 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) open("/lib/i686/cmov/libc.so.6", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\260e\1\0004\0\0\0\4"..., 512) = 512 fstat64(3, {st_mode=S_IFREG|0755, st_size=1413540, ...}) = 0 mmap2(NULL, 1418864, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7e66000 mmap2(0xb7fbb000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x155) = 0xb7fbb000 mmap2(0xb7fbe000, 9840, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7fbe000 close(3) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7e65000 set_thread_area({entry_number:-1 -> 6, base_addr:0xb7e656b0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0 mprotect(0xb7fbb000, 4096, PROT_READ) = 0 munmap(0xb7fc1000, 29703) = 0 open("/dev/video0", O_RDONLY) = 3 ioctl(3, EXT2_IOC_GETVERSION or VIDIOCGCAP, 0xbf8e4ca4) = -1 EINVAL (Invalid argument) fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7fc8000 write(1, "err"..., 3err) = 3 exit_group(3) = ? = ?
Вот код:
#include "linux/videodev.h" #include "fcntl.h" #include "stdio.h" int main() { int fd = open("/dev/video0", O_RDONLY); struct video_capability chan; if (ioctl(fd, VIDIOCGCAP, &chan) == -1) printf("err"); }
И:
gcc -o test test.c
Подробнее: У меня есть другое программное обеспечение захвата видео в этой машине, которые используют V4L без проблем. Итак, я делаю что-то неправильно.
Это работает! Не знаю, почему версия 1 не ... Но все в порядке с версией 2: D Спасибо! – 2009-05-22 19:53:38
FYI, V4L - устаревший интерфейс, и большинство новых устройств поддерживают поддержку V4L2. – TheCodeArtist