Jetson Nano运行Gstreamer管道时v4l2src缓冲区分配失败问题
错误出现原因及平台差异说明
这个Failed to allocate a buffer错误的核心是Jetson平台特有的NVMM显存内存模型和v4l2loopback的兼容性问题:
- 普通Ubuntu PC上的GStreamer管道全链路使用CPU侧普通内存存储视频帧,v4l2loopback内核模块原生支持对CPU内存帧的读写,因此管道可以正常运行。
- Jetson Nano上的GStreamer默认优先使用NVIDIA专属的NVMM显存存储视频帧,这类内存无法直接被v4l2loopback识别读写。你当前的管道没有显式将NVMM显存帧转换为CPU内存帧,v4l2sink写入v4l2loopback的帧数据实际是无效的显存地址引用,消费端v4l2src读取时无法在CPU内存中分配到对应大小的有效帧数据,就会触发缓冲区分配失败错误。
修复方案
1. 重新加载v4l2loopback(可选但建议)
增加exclusive_caps参数避免caps协商异常:
sudo modprobe v4l2loopback video_nr=1,2 exclusive_caps=1,1
2. 修改生产端管道(核心修复)
在nvvidconv后显式指定输出为CPU侧普通内存格式,再经过tee分流到v4l2sink:
gst-launch-1.0 nvarguscamerasrc ! 'video/x-raw(memory:NVMM), width=1920, height=1080, format=NV12, framerate=(fraction)30/1' ! nvvidconv ! 'video/x-raw, format=NV12' ! tee name=t ! queue max-size-buffers=10 ! v4l2sink device=/dev/video1 t. ! queue max-size-buffers=10 ! v4l2sink device=/dev/video2
3. 消费端管道适配Jetson(可选)
将xvimagesink替换为Jetson原生的nveglglessink,避免显示侧的内存兼容问题:
gst-launch-1.0 v4l2src device=/dev/video2 ! nveglglessink
内容的提问来源于stack exchange,提问作者A_toaster
相关产品推荐
相关产品推荐

