7.13. 飞利浦网络摄像头 (pwc 驱动)

本文件包含飞利浦及 OEM 网络摄像头的一些附加信息。电子邮件: webcam@smcc.demon.nl 最后更新: 2004-01-19 网站: http://www.smcc.demon.nl/webcam/

截至目前,支持以下摄像头:

  • Philips PCA645

  • Philips PCA646

  • Philips PCVC675

  • Philips PCVC680

  • Philips PCVC690

  • Philips PCVC720/40

  • Philips PCVC730

  • Philips PCVC740

  • Philips PCVC750

  • Askey VC010

  • Creative Labs Webcam 5

  • Creative Labs Webcam Pro Ex

  • Logitech QuickCam 3000 Pro

  • Logitech QuickCam 4000 Pro

  • Logitech QuickCam Notebook Pro

  • Logitech QuickCam Zoom

  • Logitech QuickCam Orbit

  • Logitech QuickCam Sphere

  • Samsung MPC-C10

  • Samsung MPC-C30

  • Sotec Afina Eye

  • AME CU-001

  • Visionite VCS-UM100

  • Visionite VCS-UC300

飞利浦驱动的主页位于上述地址。它包含大量额外信息、一个常见问题解答 (FAQ) 和二进制插件 'PWCX'。此插件包含解压缩例程,可让您使用更高的图像尺寸和帧率;此外,网络摄像头在 USB 总线上占用的带宽更少(如果您想同时运行多于 1 个摄像头,这会很有用)。这些例程受 NDA 约束,因此不能以源代码形式分发;但是,其使用是完全可选的。

您可以将此代码构建到内核中,或作为一个模块。我推荐后者,因为它使故障排除更容易。内置麦克风通过 USB 音频类支持。

加载模块时,您可以为摄像头设置一些默认设置;某些程序依赖特定的图像尺寸或格式,并且不知道如何在驱动中正确设置。选项如下:

尺寸 (size)

可以是 'sqcif', 'qsif', 'qcif', 'sif', 'cif' 或 'vga' 之一,分别对应图像尺寸 128x96, 160x120, 176x144, 320x240, 352x288 和 640x480 (当然,仅适用于支持这些分辨率的摄像头)。

帧率 (fps)

指定所需的帧率。是一个整数,范围在 4-30 之间。

fbufs

此参数指定用于存储来自摄像头帧的内部缓冲区数量。如果从摄像头读取图像的进程有点慢或暂时繁忙,这将有所帮助。但是,在慢速机器上它只会引入延迟,因此请谨慎选择。默认值为 3,这是合理的。您可以将其设置为 2 到 5 之间。

mbufs

这是一个介于 1 和 10 之间的整数。它将告诉模块为 mmap()、VIDIOCCGMBUF、VIDIOCMCAPTURE 及相关函数预留的缓冲区数量。默认值为 2,对于大多数应用程序(双缓冲)来说已足够。

如果您在使用 mmap() 的工具抓取图像时遇到大量“Dumping frame...”消息,您可能需要增加它。然而,它并不会真正缓冲图像,它只是在您的程序落后时给您更多的余地。但是您需要一个多线程或分叉的程序才能真正利用这些缓冲区。

绝对最大值是 10,但不要设置过高!每个缓冲区占用 460 KB 内存,因此除非您有很多内存,否则将此值设置为大于 4 绝对是浪费。此内存仅在 open() 期间分配,因此当摄像头不使用时不会浪费任何东西。

节能 (power_save)

当启用节能 (设置为 1) 时,模块会尝试在 close() 时关闭摄像头,并在 open() 时重新激活。这将节省电量并关闭 LED。但是并非所有摄像头都支持此功能 (645 和 646 完全没有节能功能),有些型号也无法工作 (它们会关闭,但永不唤醒)。请将其视为实验性功能。默认情况下此选项禁用。

压缩 (compression) (仅与插件配合使用有用)

使用此选项,您可以控制摄像头用于通过 USB 总线传输图像的压缩系数。您可以将参数设置在 0 到 3 之间

0 = prefer uncompressed images; if the requested mode is not available
    in an uncompressed format, the driver will silently switch to low
    compression.
1 = low compression.
2 = medium compression.
3 = high compression.

高压缩当然会占用较少带宽,但它也可能引入一些不必要的伪影。默认值为 2,中等压缩。请参阅网站上的常见问题解答,了解哪些模式需要压缩。

压缩参数不适用于 645 和 646 摄像头以及源自这些型号的 OEM 模型(只有少数几个)。大多数摄像头都支持此参数。

指示灯 (leds)

此设置需要 2 个整数,它们定义 LED 的亮/灭时间(以毫秒为单位)。您可以利用此功能让 LED 在摄像头使用时闪烁,这是其中一个有趣的应用。

leds=500,500

这将使 LED 每秒闪烁一次。但是使用

leds=0,0

LED 从不亮起,使其适用于静默监控。

默认情况下,摄像头在使用时 LED 稳定亮起,并在摄像头不再使用时关闭。

此参数仅适用于 ToUCam 系列摄像头 (720、730、740、750) 和 OEM 产品。对于其他摄像头,此命令会被静默忽略,并且无法控制 LED。

最后:此参数直到您第一次打开摄像头设备时才会生效。在此之前,LED 保持亮起。

设备提示 (dev_hint)

USB 设备的一个长期存在的问题是它们的动态特性:您永远不知道摄像头会被分配到哪个设备;这取决于模块加载顺序、集线器配置、设备插入顺序以及月相(即它可能是随机的)。使用此选项,您可以给驱动程序一个提示,告诉它应该为特定摄像头使用哪个视频设备节点 (/dev/videoX)。如果您有两台相同型号的摄像头,这也很方便。

摄像头通过其类型(来自摄像头型号的数字,如 PCA645、PCVC750VC 等)以及可选的序列号(可在 /sys/kernel/debug/usb/devices 中查看)指定。提示由以下格式的字符串组成:

[type[.serialnumber]:]node

方括号表示类型和序列号都是可选的,但如果没有类型,则不能指定序列号(这会毫无意义)。序列号与类型之间用“.”分隔;节点号与类型之间用“:”分隔。

这个有些神秘的语法最好通过几个例子来解释:

dev_hint=3,5              The first detected cam gets assigned
                          /dev/video3, the second /dev/video5. Any
                          other cameras will get the first free
                          available slot (see below).

dev_hint=645:1,680:2      The PCA645 camera will get /dev/video1,
                          and a PCVC680 /dev/video2.

dev_hint=645.0123:3,645.4567:0     The PCA645 camera with serialnumber
                                   0123 goes to /dev/video3, the same
                                   camera model with the 4567 serial
                                   gets /dev/video0.

dev_hint=750:1,4,5,6       The PCVC750 camera will get /dev/video1, the
                           next 3 Philips cams will use /dev/video4
                           through /dev/video6.

一些值得了解的要点

  • 序列号区分大小写,必须完整写入,包括前导零(它被视为字符串)。

  • 如果设备节点已被占用,注册将失败,并且网络摄像头将不可用。

  • 您最多可以有 64 个视频设备;如果您想分散编号,请确保在 /dev 中创建足够的设备节点。/dev/video9 之后是 /dev/video10(而不是 /dev/videoA)。

  • 如果摄像头与任何 dev_hint 不匹配,它将简单地被分配到第一个可用的设备节点,就像以前一样。

追踪 (trace)

为了更好地检测问题,现在可以开启模块进行的一些调用的“追踪”;它会在内核日志的调试级别记录所有项目。

追踪变量是一个位掩码;每个位代表一个特定的功能。如果您想追踪某些内容,请查找下表中对应的位值,将这些值相加,然后将结果提供给追踪变量。

描述

默认

(十进制)

(十六进制)

1

0x1

模块初始化;这将在加载和卸载模块时记录消息

2

0x2

probe() 和 disconnect() 追踪

4

0x4

追踪 open() 和 close() 调用

8

0x8

read()、mmap() 和相关的 ioctl() 调用

16

0x10

缓冲区的内存分配等。

32

0x20

显示下溢、上溢和 Dumping frame 消息

64

0x40

显示视口和图像尺寸

128

0x80

PWCX 调试

例如,要追踪 open() 和 read() 函数,将 8 + 4 = 12 相加,因此您可以在 insmod 或 modprobe 期间提供 trace=12。如果您想关闭初始化和探测追踪,请设置 trace=0。trace 的默认值为 35 (0x23)。

示例

# modprobe pwc size=cif fps=15 power_save=1

fbufs、mbufs 和 trace 参数是全局的,适用于所有连接的摄像头。每个摄像头都有自己的一组缓冲区。

size 和 fps 仅在您 open() 设备时指定默认值;这是为了适应某些不设置尺寸的工具。您可以在 open() 之后使用 Video4Linux ioctl() 调用更改这些设置。默认的默认值是 QCIF 尺寸,10 fps。

压缩参数是半全局的;它设置所有摄像头的初始压缩偏好,但此参数可以通过 VIDIOCPWCSCQUAL ioctl() 调用为每个摄像头设置。

所有参数都是可选的。