5

为什么我无法读取此文件。我尝试用 cat 读取这个文件:

cat /dev/video0 

但它说

cat: /dev/video0 : invalid arguments

同样,如果我尝试使用 dd as :

dd if=/dev/video0 ~/vid

它仍然无法读取它。

请注意,video0 是我的网络摄像头的设备文件。

4

3 回答 3

6

在这种情况下,了解更多信息的一种方法是在strace中运行命令

strace cat /dev/video0

这将显示故障点的更多详细信息:

....
open("/dev/video0", O_RDONLY)           = 3
fstat(3, {st_mode=S_IFCHR|0660, st_rdev=makedev(81, 0), ...}) = 0
fadvise64(3, 0, 0, POSIX_FADV_SEQUENTIAL) = 0
read(3, 0x2379000, 65536)               = -1 EINVAL (Invalid argument)
....

在我的情况下,这似乎是说我的 /dev/video0 设备不支持所需的操作:所以在这种情况下,'cat' 正在尝试从设备读取 64k 字节。

但是,我发现使用 nc (netcat) 代替 cat 确实可以达到这个目的:

nc -l 1234 </dev/video0

有相应的:

nc 127.0.0.1 1234 | mplayer tv://device=/dev/stdin

在本地显示;SSH 隧道端口也可以在这里工作。

于 2017-09-22T10:07:48.610 回答
2

我用:

dd if=/dev/video0 of=~/movie.mpg

然后

vlc movie.mpg

但我使用 PVRUSB2 mpg 编码器/解码器作为源。

在您的 dd 调用中,您可能会考虑使用“of”构造的重定向“>”。

于 2016-06-10T14:14:39.110 回答
1

我认为您在驱动程序中创建的设备节点“video0”的显示功能可能是错误的。

下面举个例子。

static DEVICE_ATTR(video0, S_IRUGO|S_IWUSR|S_IWGRP|S_IWOTH, video0_show, video0_store);

static ssize_t video0_show(struct device *dev, struct device_attribute *attr, char *buf);

static ssize_t video0_store(struct device *dev, struct device_attribute *attr, char *buf, size_t count);

当您在运行时 cat 设备节点“video0”时,它会调用“video0_show”函数来打印一些东西。错误消息“cat: /dev/video0 : invalid arguments”表示 video0_show 函数的参数错误。您应该调试驱动程序。

于 2013-11-29T06:23:13.330 回答