3. 访问视频设备

以下章节适用于所有连接类型。

3.1. 视频设备节点

Linux 内核需要创建虚拟设备节点,以便访问和控制相关设备。它可能已经在启动时为您创建;可以使用 ls -l /dev/video* (带星号) 或 find /dev -name video* 命令,甚至可以使用您喜欢的文件管理器目视检查/dev目录,以了解视频设备是否存在。如果存在,您可以继续阅读 3.2 节;如果不存在,您需要手动创建它们。

如果您的 Linux 发行版提供了MAKEDEV脚本,这是一种创建它们的简便方法。该脚本可能位于/dev或通常用于存储可执行命令的位置 (/bin,/sbin等等)。关于MAKEDEV(man MAKEDEV) 的手册页可以进一步指导您,但请注意特定于设备的命令选项。如果MAKEDEV不起作用或不存在,或者您只是喜欢用更复杂的方式做事,请继续阅读下一段。

设备可以创建为块设备(例如驱动器)、fifo(先进先出文件或管道,如 xconsole)或字符设备,字符设备代表其他硬件。每个设备都有一个主设备号和一个次设备号 “坐标”,以告知内核它是什么以及在哪里访问它。这些数字不是任意的。按照惯例,主设备号 81 以及次设备号 0、1、2 等分配给 Video4linux 设备,包括电视调谐器卡和网络摄像头。为了创建视频设备/dev/video0,请在命令行中使用 mknod

   #  mknod /dev/video0 c 81 0

其中 c 代表字符设备。

您可以使用以下脚本,该脚本来自内核源代码(位于linux/Documentation/video4linux/bttv/MAKEDEV的源代码树中)

   #!/bin/bash
   function makedev () {
	for dev in 0 1 2 3; do echo "/dev/$1$dev:
	char 81 $[ $2 + $dev ]" rm -f /dev/$1$dev
	mknod /dev/$1$dev c 81 $[ $2 + $dev ] chmod
	666 /dev/$1$dev
   	done

   	# symlink for default device
	rm -f /dev/$1 ln -s /dev/${1}0 /dev/$1
   	}

	# see http://roadrunner.swansea.uk.linux.org/v4lapi.shtml
	echo "*** new device names ***" makedev video
	0 makedev radio 64 makedev vtx 192 makedev vbi 224
	# "*** old device names (for compatibility only) ***"
	#makedev bttv 0 #makedev bttv-fm 64 #makedev bttv-vbi 224

只需将以上内容复制并粘贴到您喜欢的编辑程序中,将其保存为 MAKEDEV 或您喜欢的任何名称,使其可执行(即 chmod u+x MAKEDEV),然后以 root 身份执行它

   #  ./MAKEDEV

3.2. 用户组和权限

确保您的用户帐户在加载所有模块并创建设备节点后可以访问该设备,这是一个好主意。最注重安全性的方法是为特定用户组添加访问权限。在我的系统上,'video' 组的成员可以Be allowed to use网络摄像头、扫描仪和其他摄影设备。实现此目的的方法是首先更改设备的所有权/dev如下所示(以 root 身份)

   #  chown root.video /dev/usb/video*

...其中 root.video 是设备现在所属的所有者和用户组。显然,具体命令将因您的系统和设备类型而异。重要的是,您要更改设备节点本身的Ownership,而不是符号链接;符号链接的Ownership 仅通过更改它们指向的父设备或文件来影响。

要查看您的用户帐户是否是相关用户组的成员,请以 root 身份发出以下命令:grep -e video /etc/group。您应该看到类似以下内容

   video:x:44:

...其中 '44' 是用户组编号。由于 'video' 组中最后一个冒号后没有成员,我们可以添加它们,例如使用以下命令添加用户 'jhs'

   #  adduser jhs  video

之后,只需允许相关用户对设备进行读写访问,如下所示

   #  chmod g+rw /dev/v4l/video0

...其中 g+rw 表示为用户组添加读写访问权限。有关更多信息,请参阅 chmod 的文档(man chmodinfo chmod)。