通过 UVC USB 网络摄像头协商 V4L2 H264 输出时出错

问题描述 投票:0回答:1

我正在尝试将 USB 网络摄像头模式下的 DJI Osmo Action 3 连接到 Linux 视频管道。相机同时支持 MJPG 和 H264:

$ v4l2-ctl -d /dev/video1 --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
        Type: Video Capture

        [0]: 'MJPG' (Motion-JPEG, compressed)
                Size: Discrete 1280x720
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 1920x1080
                        Interval: Discrete 0.033s (30.000 fps)
        [1]: 'H264' (H.264, compressed)
                Size: Discrete 1280x720
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 1920x1080
                        Interval: Discrete 0.033s (30.000 fps)

MJPG 输出的质量似乎比 H264 输出的质量低得多,所以我想协商后者。我相信相机能够在 Windows 上输出 H264,因为输出质量要高得多,并且该设备不支持设置 JPEG 压缩级别:

$ v4l2-ctl --all -d /dev/video1
Driver Info:
        Driver name      : uvcvideo
        Card type        : OsmoAction3: OsmoAction3
        Bus info         : usb-xhci-hcd.11.auto-1
        Driver version   : 5.10.66
        Capabilities     : 0x84a00001
                Video Capture
                Metadata Capture
                Streaming
                Extended Pix Format
                Device Capabilities
        Device Caps      : 0x04200001
                Video Capture
                Streaming
                Extended Pix Format
Media Driver Info:
        Driver name      : uvcvideo
        Model            : OsmoAction3: OsmoAction3
        Serial           : 123456789ABCDEF
        Bus info         : usb-xhci-hcd.11.auto-1
        Media version    : 5.10.66
        Hardware revision: 0x00000504 (1284)
        Driver version   : 5.10.66
Interface Info:
        ID               : 0x03000002
        Type             : V4L Video
Entity Info:
        ID               : 0x00000001 (1)
        Name             : OsmoAction3: OsmoAction3
        Function         : V4L2 I/O
        Flags         : default
        Pad 0x01000007   : 0: Sink
          Link 0x0200000d: from remote pad 0x100000a of entity 'Processing 2': Data, Enabled, Immutable
Priority: 2
Video input : 0 (Camera 1: ok)
Format Video Capture:
        Width/Height      : 1920/1080
        Pixel Format      : 'MJPG' (Motion-JPEG)
        Field             : None
        Bytes per Line    : 0
        Size Image        : 4147200
        Colorspace        : Default
        Transfer Function : Default (maps to Rec. 709)
        YCbCr/HSV Encoding: Default (maps to ITU-R 601)
        Quantization      : Default (maps to Full Range)
        Flags             :
Crop Capability Video Capture:
        Bounds      : Left 0, Top 0, Width 1920, Height 1080
        Default     : Left 0, Top 0, Width 1920, Height 1080
        Pixel Aspect: 1/1
Selection Video Capture: crop_default, Left 0, Top 0, Width 1920, Height 1080, Flags:
Selection Video Capture: crop_bounds, Left 0, Top 0, Width 1920, Height 1080, Flags:
Streaming Parameters Video Capture:
        Capabilities     : timeperframe
        Frames per second: 30.000 (30/1)
        Read buffers     : 0

但是,通过 H264 拉取视频似乎无法与 UVC 驱动程序正常工作:

$ gst-launch-1.0 -vvv v4l2src device=/dev/video1 ! video/x-h264 ! fakesink
...
ERROR: from element /GstPipeline:pipeline0/GstV4l2Src:v4l2src0: Video device did not suggest any buffer size.
...

v4l2-ctl
相同:

$ v4l2-ctl -d /dev/video1 --set-fmt-video width=1920,height=1080,pixelformat=MJPG --stream-mmap --stream-count=50
<<<<<<<<<<<<<<<<<<<<<<<<<^C
$ v4l2-ctl -d /dev/video1 --set-fmt-video width=1920,height=1080,pixelformat=H264 --stream-mmap --stream-count=50
                VIDIOC_REQBUFS returned -1 (Invalid argument)

我正在运行内核 5.10.66,并且我确实在

dmesg
中得到了非常令人讨厌的堆栈跟踪:

[3445509.809183] WARNING: CPU: 1 PID: 125186 at drivers/media/common/videobuf2/videobuf2-core.c:806 vb2_core_reqbufs+0x2a4/0x380
[3445509.809188] Modules linked in: bcmdhd
[3445509.809200] CPU: 1 PID: 125186 Comm: v4l2-ctl Tainted: G        W         5.10.66 #1
[3445509.809204] Hardware name: RK3588 MINIPC-MIZHUO LP4x V1.0 BlueBerry Board (DT)
[3445509.809210] pstate: 20400009 (nzCv daif +PAN -UAO -TCO BTYPE=--)
[3445509.809216] pc : vb2_core_reqbufs+0x2a4/0x380
[3445509.809221] lr : vb2_core_reqbufs+0x278/0x380
[3445509.809225] sp : ffffffc017deba90
[3445509.809229] x29: ffffffc017deba90 x28: ffffffc0112b40e0
[3445509.809235] x27: ffffff80429d0400 x26: 0000000000000000
[3445509.809241] x25: ffffff80c35c4018 x24: 0000000000000000
[3445509.809248] x23: ffffff80c35c4720 x22: ffffffc017debd18
[3445509.809254] x21: 0000000000000001 x20: 0000000000000000
[3445509.809260] x19: ffffff80c35c46b8 x18: 0000000000000000
[3445509.809266] x17: 0000000000000000 x16: 0000000000000000
[3445509.809272] x15: 0000000000000000 x14: 0000000000000000
[3445509.809278] x13: 0000000000000000 x12: 0000000000000000
[3445509.809284] x11: 0000000000000000 x10: 0000000000000000
[3445509.809290] x9 : ffffffc010ba5750 x8 : ffffffc010b73428
[3445509.809296] x7 : 0000000000000000 x6 : 0000000000000000
[3445509.809302] x5 : ffffffc010c0d1cc x4 : ffffff80c35c4720
[3445509.809308] x3 : 0000000000000001 x2 : ffffffc017debae4
[3445509.809314] x1 : 0000000000000000 x0 : 0000000000000001
[3445509.809320] Call trace:
[3445509.809325]  vb2_core_reqbufs+0x2a4/0x380
[3445509.809331]  vb2_reqbufs+0x54/0x70
[3445509.809338]  uvc_request_buffers+0x40/0x6c
[3445509.809345]  uvc_ioctl_reqbufs+0x58/0x9c
[3445509.809350]  v4l_reqbufs+0x58/0x6c
[3445509.809354]  __video_do_ioctl+0x258/0x384
[3445509.809359]  video_usercopy+0x23c/0x490

看来uvcvideo驱动程序不兼容H264输出?真的吗? Linux 下有支持 H264 输出的网络摄像头驱动吗?

linux video webcam v4l2 uvcvideo
1个回答
0
投票

我有 Osmo Action 4 相机,但它似乎与 3 存在相同的问题。问题的症结似乎是缺少有关 v4l2 需要为帧分配多大缓冲区的 UVC 元数据。

我没有解决问题的方法,但我至少可以分享我的调查,以便其他人可以在这方面取得一些进展。

从概念上讲,可以在内核中为此实现一种解决方法,特别是在

uvc_fixup_video_ctrl
中向
drivers/media/usb/uvc/uvc_video.c
添加一种特殊情况,或者可能在那里进行一般回退。

来自 v4l2-ctl 的元数据(已修剪):

        Width/Height      : 1920/1080
        Pixel Format      : 'H264' (H.264)
        Bytes per Line    : 0
        Size Image        : 0

与 MJPEG(也适用于 OA4):

        Width/Height      : 1920/1080
        Pixel Format      : 'MJPG' (Motion-JPEG)
        Bytes per Line    : 0
        Size Image        : 4147200

在不同的 H264 UVC 设备上(有效):

        Width/Height      : 1920/1080
        Pixel Format      : 'H264' (H.264)
        Bytes per Line    : 3840
        Size Image        : 4147200

这似乎与 H264 条目的 UVC 元数据中没有

dwMaxVideoFrameBufferSize
直接相关。但是有MJPEG条目(它是1843200,所以我不确定v4l2中的4147200是如何计算的)。
这是使用
lsusb -d <device:id> -v
抓取的。

© www.soinside.com 2019 - 2024. All rights reserved.