UDP 推流
这个 Demo 演示如何在 Neardi Pi 3 上读取 USB 摄像头的 MJPEG 画面,并通过 gst-launch-1.0 使用 RTP/UDP 推送到 PC。PC 端通过 ffplay 和 SDP 文件接收并显示画面。
下面示例使用:
- USB 摄像头节点:
/dev/video85 - 摄像头格式:MJPEG,
640x480,30 fps - PC IP 地址:
192.168.1.125 - UDP 端口:
5000
实际使用时,请根据自己的摄像头节点、摄像头格式、PC IP 和端口进行替换。
在 Neardi Pi 3 安装工具
neardi@RK3576:~$ sudo apt update
neardi@RK3576:~$ sudo apt install v4l-utils gstreamer1.0-tools gstreamer1.0-plugins-good gstreamer1.0-plugins-bad
查看 USB 摄像头节点
插入 USB 摄像头后,先列出 V4L2 设备:
neardi@RK3576:~$ v4l2-ctl --list-devices
再查看目标节点支持的格式:
neardi@RK3576:~$ v4l2-ctl -d /dev/video85 --list-formats-ext
选择摄像头实际支持的格式。本例中摄像头支持 MJPEG 640x480、30 fps,所以 GStreamer caps 写成:
image/jpeg,width=640,height=480,framerate=30/1
提示
摄像头重新插拔或系统重启后,节点编号可能会变化。运行推流命令前,建议先确认实际的 /dev/video* 节点。
Neardi Pi 3 开始推流
在 Neardi Pi 3 上执行:
neardi@RK3576:~$ gst-launch-1.0 -v \
v4l2src device=/dev/video85 ! \
'image/jpeg,width=640,height=480,framerate=30/1' ! \
jpegparse ! \
rtpjpegpay pt=26 ! \
udpsink host=192.168.1.125 port=5000
几个关键参数说明:
v4l2src device=/dev/video85:从 USB 摄像头读取画面。image/jpeg,width=640,height=480,framerate=30/1:选择 MJPEG 模式。jpegparse:对 JPEG 流做解析,方便后续 RTP 打包。rtpjpegpay pt=26:把 JPEG 帧打包成 RTP,payload type 为 26。udpsink host=192.168.1.125 port=5000:把 RTP 包发送到 PC。
正常输出类似:
Setting pipeline to PLAYING ...
New clock: GstSystemClock
caps = image/jpeg, width=(int)640, height=(int)480, framerate=(fraction)30/1
caps = application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)JPEG, payload=(int)26
Redistribute latency...
PC 端接收画面
在 PC 端创建 SDP 文件。这里的端口和 payload type 要和板端 GStreamer 命令保持一致。
neardi@PC:~/work$ cat > jpeg.sdp <<'EOF'
v=0
o=- 0 0 IN IP4 0.0.0.0
s=RK3576 MJPEG
c=IN IP4 0.0.0.0
t=0 0
m=video 5000 RTP/AVP 26
a=rtpmap:26 JPEG/90000
EOF
使用 ffplay 播放:
neardi@PC:~/work$ ffplay -protocol_whitelist file,udp,rtp \
-x 640 -y 480 \
-i jpeg.sdp
如果接收正常,ffplay 会打印类似信�息:
Input #0, sdp, from 'jpeg.sdp':
Metadata:
title : RK3576 MJPEG
Stream #0:0: Video: mjpeg (Baseline), yuvj422p, 640x480, 29.92 tbr, 90k tbn
PC 端窗口会显示 USB 摄像头实时画面:

常见问题
ffplay 打开后没有画面
确认 udpsink host=... 中的 PC IP 地址是否正确,同时检查 PC 防火墙是否允许 UDP 5000 端口。
板端提示 /dev/video85 不存在
重新执行 v4l2-ctl --list-devices,使用实际识别到的摄像头节点。根据当前系统状态,节点可能是 /dev/video0、/dev/video1 或其他编号。
摄像头不支持 MJPEG 640x480@30
使用 v4l2-ctl -d /dev/video85 --list-formats-ext 查看摄像头实际支持的格式,然后修改 GStreamer caps。比如按实际情况修改宽、高或帧率。