DJI Osmo Action3 USB摄像头模式Linux UVC驱动H264输出协商失败
问题:DJI Osmo Action3在Linux下无法通过UVC驱动使用H264格式输出
我尝试将DJI Osmo Action3以USB摄像头模式连接至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
但通过UVC驱动获取H264视频无法正常工作:
$ 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输出的摄像头驱动?
回答
关于uvcvideo驱动对H264的支持
uvcvideo驱动本身支持符合UVC规范的H264摄像头,你的问题根源在于DJI Osmo Action3的UVC实现并不完全标准——它的H264模式未正确返回缓冲区大小参数,导致驱动无法完成内存缓冲区申请,这是非标准UVC设备的典型问题。Windows下能正常工作是因为DJI提供了定制驱动,或是Windows的UVC兼容层做了额外适配。
可行的解决方向
升级内核版本:你当前使用的5.10.66是较老的LTS版本,后续的5.15+、6.x LTS内核对UVC H264设备的兼容性有不少改进,包括对非标准设备的适配,升级后大概率能解决该问题。
使用用户空间工具绕过驱动限制:
- 尝试用
ffmpeg强制指定参数捕获H264流:ffmpeg -f v4l2 -input_format h264 -video_size 1920x1080 -framerate 30 -i /dev/video1 -c copy output.h264 - 如果上述命令失败,可借助
v4l2loopback和gst-launch做格式转换(会有额外性能开销,但能临时解决画质问题):
之后可将gst-launch-1.0 v4l2src device=/dev/video1 ! image/jpeg,width=1920,height=1080 ! jpegdec ! x264enc ! v4l2sink device=/dev/video2/dev/video2作为H264源使用。
- 尝试用
查找第三方驱动/补丁:社区针对DJI Osmo Action系列摄像头的UVC问题有提供适配补丁,可搜索内核邮件列表或GitHub相关项目,找到对应补丁编译到内核中。
关于Linux下支持H264的摄像头驱动
- 绝大多数现代USB摄像头的H264输出都是通过uvcvideo驱动支持的,只要设备符合UVC规范。
- 部分专业摄像头有专属驱动(如罗技高端型号),但这类驱动通常也是基于uvcvideo做的扩展。
- 对于非标准UVC设备,社区可能会提供补丁或用户空间工具补充支持。
内容的提问来源于stack exchange,提问作者kevmo314
相关产品推荐
相关产品推荐

