Jetson Nano上如何用Python OpenCV结合nvv4l2camerasrc录制MJPG视频
问题解决:GStreamer无法链接nvv4l2camerasrc与nvvidconv
问题原因
错误核心在于:nvv4l2camerasrc输出的video/x-raw(memory:NVMM), format=MJPG格式,既不被多数USB摄像头支持(这类设备通常无法以NVMM内存模式输出MJPG流),也不被nvvidconv兼容(该组件不处理NVMM内存中的MJPG编码数据)。
解决方法
方法一:改用v4l2src+硬件解码(推荐)
使用标准v4l2src读取USB摄像头的MJPG流,通过nvjpegdec进行硬件解码转换为NVMM内存的原始视频流,再交给nvvidconv处理,完整代码如下:
import cv2 width = 2560 height = 1440 framerate = 30 # 修改后的GStreamer管道 gs_pipeline = f"v4l2src device=/dev/video0 " \ f"! video/x-raw, width={width}, height={height}, format=MJPG, framerate={framerate}/1 " \ f"! nvjpegdec " \ f"! video/x-raw(memory:NVMM) " \ f"! nvvidconv " \ f"! video/x-raw, format=BGRx " \ f"! videoconvert " \ f"! video/x-raw, format=BGR " \ f"! appsink" v_cap = cv2.VideoCapture(gs_pipeline, cv2.CAP_GSTREAMER) if not v_cap.isOpened(): print("failed to open video capture") exit(-1) while v_cap.isOpened(): ret_val, frame = v_cap.read() if not ret_val: break cv2.imshow('', frame) input_key = cv2.waitKey(1) if input_key != -1: print(f"input key = {input_key}") if input_key == ord('q'): break v_cap.release() cv2.destroyAllWindows()
方法二:使用nvv4l2camerasrc+原始格式
先通过以下命令确认摄像头支持的NVMM兼容原始格式(如YUY2、NV12等):
v4l2-ctl --list-formats-ext
找到2560x1440@30分辨率对应的非MJPG格式,修改管道参数,示例(假设支持YUY2格式):
gs_pipeline = f"nvv4l2camerasrc device=/dev/video0 " \ f"! video/x-raw(memory:NVMM), width={width}, height={height}, format=YUY2, framerate={framerate}/1 " \ f"! nvvidconv " \ f"! video/x-raw, format=BGRx " \ f"! videoconvert " \ f"! video/x-raw, format=BGR " \ f"! appsink"
额外检查项
- 确保已安装GStreamer NVIDIA加速插件:
gstreamer1.0-nvvidconv、gstreamer1.0-nvjpeg - 用
gst-inspect-1.0 nvv4l2camerasrc和gst-inspect-1.0 nvvidconv查看组件支持的具体格式参数
内容的提问来源于stack exchange,提问作者Jet C.
相关产品推荐
相关产品推荐

