如何通过Gstreamer实现Jetson Nano摄像头同时供两个应用使用
Jetson Nano IMX219视频流多应用共享方案
这个需求完全可以实现,相比额外配置v4l2loopback,直接使用GStreamer原生的tee插件做流分流是更轻量化的方案,不需要安装额外内核模块,还能充分利用Jetson的硬件编解码能力,性能损耗更低。
方案1:单GStreamer pipeline 同时满足两个需求(适合应用无需独立启停的场景)
你可以直接在原有gst命令的基础上加入tee节点,把一路摄像头流拆成两路独立处理的分支:
gst-launch-1.0 nvarguscamerasrc ! 'video/x-raw(memory:NVMM), width=3280, height=2464, format=NV12, framerate=21/1' ! tee name=t \ # 第一路分支:硬件编码录mp4 t. ! queue ! nvvidconv ! nvv4l2h264enc bitrate=8000000 ! h264parse ! mp4mux ! filesink location=capture.mp4 \ # 第二路分支:输出给OpenCV处理 t. ! queue ! nvvidconv ! video/x-raw, format=BGR ! appsink
参数说明:
tee name=t定义分流节点,所有分支都以t.开头接入- 每个分支前加
queue是为了做缓存隔离,避免某一路阻塞影响另一路的正常运行 - 录制分支全程走Jetson硬件编码,CPU占用不到5%
OpenCV Python读取第二路流的示例代码:
import cv2 # 直接对接GStreamer pipeline,参数和上述分流分支保持一致 cap = cv2.VideoCapture( "nvarguscamerasrc ! 'video/x-raw(memory:NVMM), width=3280, height=2464, format=NV12, framerate=21/1' ! nvvidconv ! video/x-raw, format=BGR ! appsink drop=1", cv2.CAP_GSTREAMER ) while True: ret, frame = cap.read() if not ret: break # 此处添加你的OpenCV处理逻辑 if cv2.waitKey(1) == ord('q'): break cap.release() cv2.destroyAllWindows()
方案2:v4l2loopback虚拟设备方案(适合两个应用需要独立启停的场景)
如果你需要两个应用可以分别启动、关闭,互不影响,可以选择v4l2loopback方案,操作步骤如下:
- 安装依赖
sudo apt update && sudo apt install -y v4l2loopback-dkms v4l2loopback-utils
- 加载内核模块创建虚拟摄像头设备
# 此处创建编号为10的虚拟设备/dev/video10,可自行修改编号 sudo modprobe v4l2loopback devices=1 video_nr=10 exclusive_caps=1
- 把IMX219的摄像头流推送到虚拟设备
gst-launch-1.0 nvarguscamerasrc ! 'video/x-raw(memory:NVMM), width=3280, height=2464, format=NV12, framerate=21/1' ! nvvidconv ! video/x-raw, format=YUY2 ! v4l2sink device=/dev/video10
- 两个应用都可以直接读取
/dev/video10使用:
- OpenCV直接调用
cv2.VideoCapture(10)即可读取流 - 录制脚本可以直接用ffmpeg/gst读取虚拟设备生成mp4文件,示例命令:
ffmpeg -i /dev/video10 -c:v libx264 output.mp4
内容的提问来源于stack exchange,提问作者A_toaster
相关产品推荐
相关产品推荐

