# USB摄像头(带麦克风和扬声器)调试

带麦克风咪头和扬声器的USB摄像头
qq_pic_merged_1756038364912

# 摄像头探测

首先,需要确认摄像头设备是否被系统正确识别。

  1. 列出USB设备

    使用lsusb命令可以查看所有连接到系统的USB设备。

    hao@lckfb-taishanpi:~$ lsusb
    Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
    Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
    Bus 004 Device 002: ID 349c:3307 Generic HD video  
    Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

    其中HD video就是我们的USB摄像头。

  2. 查看视频设备节点

    系统会为视频设备创建相应的设备文件。

    hao@lckfb-taishanpi:~$ ls /dev/video*
    /dev/video0  /dev/video1  /dev/video2  /dev/video5  /dev/video-dec1  /dev/video-dec2
  3. 使用v4l-utils工具

    v4l-utils是一个强大的视频设备调试工具集,可以提供更详细的设备信息。如果系统未安装,请先安装。

    sudo apt-get install v4l-utils

    使用v4l2-ctl列出所有视频设备及其关联的设备节点。

    hao@lckfb-taishanpi:~$ v4l2-ctl --list-devices
    rockchip,rk3328-vpu-dec (platform:fdea0000.video-codec):
            /dev/video2
            /dev/media1
    
    rockchip,rk3568-vepu-enc (platform:fdee0000.video-codec):
            /dev/video5
            /dev/media3
    
    rockchip-rga (platform:rga):
            /dev/video0
    
    rkvdec2 (platform:rkvdec2):
            /dev/video1
            /dev/media0
    
    HD video  : HD video   (usb-fd840000.usb-1):
            /dev/video3
            /dev/video4
            /dev/media2

    从输出中可以看到,名为HD video的USB摄像头关联了/dev/video3/dev/video4两个设备节点。

# 查看摄像头参数

接下来,我们需要确定哪个设备节点是有效的,并查看其支持的视频格式、分辨率和帧率。

hao@lckfb-taishanpi:~$ v4l2-ctl -d /dev/video4 --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
        Type: Video Capture

hao@lckfb-taishanpi:~$ v4l2-ctl -d /dev/video3 --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
        Type: Video Capture

        [0]: 'MJPG' (Motion-JPEG, compressed)
                Size: Discrete 1280x720
                        Interval: Discrete 0.067s (15.000 fps)
                        Interval: Discrete 0.100s (10.000 fps)
                Size: Discrete 800x480
                        Interval: Discrete 0.050s (20.000 fps)
                        Interval: Discrete 0.067s (15.000 fps)
                Size: Discrete 640x480
                        Interval: Discrete 0.040s (25.000 fps)
                        Interval: Discrete 0.067s (15.000 fps)
                Size: Discrete 480x320
                        Interval: Discrete 0.040s (25.000 fps)
                        Interval: Discrete 0.067s (15.000 fps)
                Size: Discrete 480x854
                        Interval: Discrete 0.040s (25.000 fps)
                        Interval: Discrete 0.050s (20.000 fps)

结果表明,/dev/video4不支持视频捕获格式,而/dev/video3支持MJPG格式,并列出了多种分辨率和帧率的组合。因此,我们应该使用/dev/video3作为视频输入设备。

# 使用摄像头

# 拍照

使用ffmpeg从摄像头捕获一帧图像并保存为图片。

ffmpeg -f v4l2 -i /dev/video3 -ss 0.5 -vframes 1 -update 1 <您的文件名.jpg>

# 录制视频(无声)

ffmpeg -f v4l2 -input_format mjpeg -s 1280x720 -r 15 -i /dev/video3 -c:v copy output.mkv

在终端里按Ctrl + C停止录制。

参数说明:

参数 说明
-f v4l2 强制使用v4l2驱动。
-input_format mjpeg 指定输入流是摄像头支持的mjpeg格式。
-s 1280x720 设置视频分辨率。
-r 15 设置视频帧率。
-i /dev/video3 指定输入设备。
-c:v copy 直接复制视频流,不进行重新编码,以降低CPU消耗。
output.mkv 输出的视频文件名。

注意: 分辨率和帧率需要选择摄像头支持的组合。根据探测结果,1280x720分辨率下支持15.000 fps

# 音频设备探测

使用aplayarecord命令探测播放和录音设备。

hao@lckfb-taishanpi:~$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: video [HD video], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: RK809 [Analog RK809], device 0: fe410000.i2s-rk817-hifi rk817-hifi-0 [fe410000.i2s-rk817-hifi rk817-hifi-0]
  Subdevices: 0/1
  Subdevice #0: subdevice #0

hao@lckfb-taishanpi:~$ arecord -l
**** List of CAPTURE Hardware Devices ****
card 0: video [HD video], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: RK809 [Analog RK809], device 0: fe410000.i2s-rk817-hifi rk817-hifi-0 [fe410000.i2s-rk817-hifi rk817-hifi-0]
  Subdevices: 0/1
  Subdevice #0: subdevice #0

设备列表:

设备名称 类型 声卡号 (Card) 设备号 (Device) ALSA标识
HD video 播放 & 录制 0 0 hw:0,0
Analog RK809 播放 & 录制 1 0 hw:1,0

我们的USB摄像头集成了麦克风和扬声器,被识别为声卡0。

# 使用音频设备

# 录制有声视频

结合视频和音频输入,录制带有声音的视频。

ffmpeg -f v4l2 -input_format mjpeg -i /dev/video3 -f alsa -channels 1 -i hw:0,0 -c:v copy -c:a aac video_with_audio.mp4

新增音频参数说明:

参数 说明
-f alsa 强制使用alsa作为音频驱动。
-channels 1 设置音频通道为单声道。某些设备可能不支持双声道录制。
-i hw:0,0 指定音频输入设备(声卡0,设备0)。
-c:a aac 指定音频编码器为aac

# 播放音频

  • 使用aplay播放.wav格式文件

    aplay -D hw:0,0 test_sound.wav

    -D hw:0,0明确指定使用声卡0,设备0进行播放。

  • 使用ffplay播放多种格式音频

    ffplay可以播放mp3等多种格式,并且能自动选择默认声卡。

    ffplay music.mp3