v4l2 网络摄像头编码为 H.264 存在问题

v4l2 网络摄像头编码为 H.264 存在问题

我正在尝试使用 gstreamer 通过 wifi 将 H.264 网络摄像头视频源发送到另一台计算机。我正在使用这个教程作为指南。我使用 Creative Live! Cam Connect HD 作为我的网络摄像头。网站声称网络摄像头具有板载 H.264 编码器。但是当我使用 v4l2-ctl 时,我得到了以下信息:

$ v4l2-ctl --list-formats
ioctl: VIDIOC_ENUM_FMT
 ...
Index       : 1
Type        : Video Capture
Pixel Format: 'MJPG' (compressed)
Name        : MJPEG

但是当我使用 --all 标志时,我得到了不同的像素格式。

v4l2-ctl -d 1 --all
Driver Info (not using libv4l2):
Driver name   : uvcvideo
Card type     : Live! Cam Connect HD VF0750
Bus info      : usb-0000:00:14.0-1
Driver version: 3.5.7
Capabilities  : 0x04000001
    Video Capture
    Streaming
Format Video Capture:
Width/Height  : 640/360
Pixel Format  : 'YUYV'
Field         : None
Bytes per Line: 1280
Size Image    : 460800
Colorspace    : SRGB
 ...

我不确定为什么我会得到两种不同的像素格式(MJPG 和 YUYV),但我希望看到像素格式:'H264'(压缩),就像在我链接到的教程中一样。

我正在运行内核版本为 3.5.0 的 Ubuntu 12.1,有人知道我的问题是什么吗?我想在 MJPG 上使用 H.264 来节省带宽。有人知道为什么它检测不到 H.264 吗?谢谢。

答案1

TL;DR:运行

v4l2-ctl --list-devices

检查您的相机是否枚举多个实例。H.264 支持可能在其中一个备选实例上。在我的相机上,我最终需要使用 /dev/video2 而不是 video0。

我有这台相机(SVPRO 手动变焦 USB 摄像头 2.8-12mm 镜头 1080P 高清 USB 网络摄像头 2MP 低光配备索尼 IMX322 传感器便携式 USB 摄像头带金属外壳)。

它声称支持 H.264,但是当我运行

v4l2-ctl --list-formats-ext

我仅得到 MJPG 和 YUYV 格式。

# v4l2-ctl --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
        Index       : 0
        Type        : Video Capture
        Pixel Format: 'MJPG' (compressed)
        Name        : Motion-JPEG
                Size: Discrete 1920x1080
                        Interval: Discrete 0.033s (30.000 fps)
                        Interval: Discrete 0.040s (25.000 fps)
                        Interval: Discrete 0.067s (15.000 fps)
... 

        Index       : 1
        Type        : Video Capture
        Pixel Format: 'YUYV'
        Name        : YUYV 4:2:2
                Size: Discrete 640x480
                        Interval: Discrete 0.033s (30.000 fps)
                        Interval: Discrete 0.040s (25.000 fps)
                        Interval: Discrete 0.067s (15.000 fps)
 ...

但后来我意识到相机枚举了多个设备:

# v4l2-ctl --list-devices
H264 USB Camera: USB Camera (usb-0000:00:14.0-3):
        /dev/video0
        /dev/video1
        /dev/video2
        /dev/video3

显然 video2 支持 H.264:

# v4l2-ctl -d2 --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
        Index       : 0
        Type        : Video Capture
        Pixel Format: 'H264' (compressed)
        Name        : H.264
                Size: Discrete 1920x1080
                        Interval: Discrete 0.033s (30.000 fps)
                        Interval: Discrete 0.040s (25.000 fps)
                        Interval: Discrete 0.067s (15.000 fps)

因此我连接了运动来使用video2。

答案2

我认为问题可能是 Creative Live! Connect HD cam 仅支持相当过时的 UVC1.1;因此 V4l2 驱动程序可能无法识别它。请参阅维基百科的条目原生 H.264 支持的网络摄像头

答案3

两种不同的像素格式(MJPG 和 YUYV)表明相机可以支持这些格式。MPEG 用于编码数据包(通常用于通过网络发送到接收端),YUYV 用于 RAW(未压缩)图像,通常用于本地预览。但是,您可以在 VIDIOC_S_FMT 中使用 H.264 来获取 H.264 编码流。

相关内容