基于RK356X与GStreamer的USB摄像头RTSP流媒体服务搭建指南
1. 项目概述在RK356X上构建USB摄像头视频流媒体服务最近在折腾一块基于瑞芯微RK3566的IDO-SBC3566开发板想用它来实现一个轻量级的网络视频监控或者远程查看方案。核心需求很简单把一块普通的USB摄像头插到板子上让它采集到的实时画面通过网络推流出去这样我在同一局域网内的电脑或者另一块开发板上就能直接观看。听起来像是网络摄像头IP Camera的DIY版本但用RK356X这类高性能嵌入式主板来做不仅成本可控而且凭借其内置的硬编码能力推流的效率和画质都更有保障。这个方案非常适合那些需要将传统USB摄像头快速“网络化”、“智能化”的场景。比如你可以用它搭建一个家庭安防系统、一个远程宠物观察窗或者作为机器人、无人机等移动设备的图传模块。RK3566本身强大的AI算力通过NPU也为后续增加人脸识别、移动侦测等智能分析功能留足了空间。整个流程主要涉及Linux下的视频设备管理、GStreamer多媒体框架的应用以及RTSP流媒体服务器的搭建。即使你之前没有深入接触过流媒体跟着步骤一步步来也能顺利实现。下面我就把从硬件准备到软件配置再到最终推流播放的完整过程以及中间踩过的坑和优化技巧详细拆解一遍。2. 核心思路与方案选型解析在嵌入式设备上实现视频推流本质上是一个采集 - 处理 - 编码 - 封装 - 传输的管道Pipeline。我们需要为每个环节选择合适的“工具”和“协议”。2.1 为什么选择GStreamer RTSP方案市面上实现视频流的方法很多比如直接用FFmpeg推RTMP到云服务器或者用MJPG-Streamer输出HTTP MJPEG流。我选择GStreamer RTSP的组合是基于RK356X的硬件特性和实际应用需求考虑的。首先GStreamer是一个功能极其强大且灵活的跨平台多媒体框架。它采用插件化、管道化的设计思想你可以像搭积木一样用v4l2src采集、videoconvert格式转换、x264enc编码、rtspclientsink输出等插件构建一个完整的处理流水线。这对于在资源有限的嵌入式设备上进行复杂的媒体处理非常友好。更重要的是瑞芯微为RK356X系列提供了官方的MPPMedia Process Platform硬件编解码插件如mpph264encGStreamer可以无缝调用这些插件直接利用芯片的硬件编码器极大降低CPU负载保证高分辨率、高帧率编码的实时性和稳定性。如果只用FFmpeg的软编码RK3566的四核A55在高负载下可能会比较吃力。其次流媒体协议选择RTSPReal Time Streaming Protocol。相比于HTTP轮询或简单的MJPG流RTSP是专门为实时流媒体设计的网络控制协议它允许客户端通过PLAY、PAUSE等指令与服务器交互控制播放进度。虽然现在WebRTC很火但RTSP因其成熟、稳定、客户端支持广泛如VLC、PotPlayer、大部分NVR设备在安防、监控领域仍是事实标准。我们使用一个轻量级的RTSP服务器——mediamtx原名rtsp-simple-server来接收GStreamer推上来的流并对外服务。它非常轻量纯Go编写资源占用小配置简单完美契合嵌入式环境。2.2 整体架构与数据流向整个系统的数据流可以清晰地分为几个阶段采集层USB摄像头通过V4L2Video for Linux 2框架暴露为/dev/videoX设备节点。GStreamer的v4l2src插件从这里读取原始的YUV或MJPEG压缩数据。处理与编码层如果摄像头输出的是MJPEG一种Motion-JPEG视频每帧都是JPEG图片则需要先用avdec_mjpeg插件解码成原始的YUV帧。然后通过videoconvert进行必要的色彩空间转换例如转成NV12格式这是很多硬件编码器偏爱的输入格式。最后核心步骤是调用mpph264enc插件利用RK3566的硬件视频编码单元VEPU将YUV帧压缩成H.264码流。H.264的高压缩率和通用性使其成为网络传输的首选。流媒体层编码后的H.264基本流Elementary Stream被送入rtspclientsink插件。该插件按照RTSP/RTP协议将码流打包并推送到我们本地或同网络运行的mediamtx服务器。mediamtx在8554端口监听收到流后会为其分配一个路径如/stream。客户端播放层任何支持RTSP协议的播放器如VLC、ffplay或者另一块开发板上的GStreamer使用playbin或rtspsrc都可以通过访问rtsp://板子IP:8554/stream这个URL来拉流、解码并播放。这个架构的优点是模块解耦推流GStreamer Pipeline和流媒体服务mediamtx是独立的进程。你可以随时重启推流管道而不影响服务器也可以让多个客户端同时连接服务器观看同一路流服务器会自动处理多路分发。3. 硬件准备与环境确认工欲善其事必先利其器。在开始敲命令之前需要确保硬件和基础系统就绪。3.1 硬件清单与连接你需要准备以下物品RK356X开发板本文以触觉智能的IDO-SBC3566为例其他如Firefly的ROC-RK3566-PC、Rock 3A等基于RK3566/RK3568的板子只要运行Ubuntu/Debian类系统操作基本通用。确保板子已连接好电源、网线用于SSH和流传输和显示器非必须但首次调试方便。USB摄像头一个兼容UVCUSB Video Class协议的摄像头。市面上绝大多数免驱摄像头都属于此类。建议选择支持MJPEG格式输出的摄像头因为MJPEG在RK356X上可以通过硬件解码比处理原始的、数据量巨大的YUV格式效率高得多。我手头用的是一个常见的1080P USB摄像头。主机电脑用于通过SSH远程登录开发板进行操作以及最后作为客户端播放视频。电脑和开发板需要在同一个局域网下。将USB摄像头插入开发板的USB接口。通过串口或者SSH登录到开发板的Ubuntu系统。我通常使用SSH命令是ssh root开发板IP默认密码可能需要咨询板卡供应商。3.2 系统与网络环境检查登录后首先更新软件包列表并安装一些基础工具如果尚未安装apt update apt install -y v4l-utils net-toolsv4l-utils包含了我们后面要用到的关键工具v4l2-ctl用于查询和配置视频设备。net-tools包含了ifconfig命令方便查看网络配置虽然ip addr更现代但ifconfig更直观。接着检查网络连接记下开发板的IP地址后续推流和拉流都要用到ifconfig eth0如果使用Wi-Fi则查看wlan0接口。输出中inet后面的地址就是板子的IP例如192.168.1.196。4. 深度探索USB摄像头设备节点与能力查询在Linux中一切皆文件摄像头也不例外。我们需要先找到它对应的“文件”并了解它能做什么。4.1 定位摄像头设备节点执行命令v4l2-ctl --list-devices这个命令会列出系统上所有V4L2视频设备。输出信息量很大需要仔细分辨rkisp-statistics (platform:rkisp): /dev/video7 /dev/video8 rkisp_mainpath (platform:rkisp-vir0): /dev/video0 /dev/video1 /dev/video2 /dev/video3 /dev/video4 /dev/video5 /dev/video6 /dev/media0 AC_2019053011080005: ZH-0305 (usb-xhci-hcd.4.auto-1): /dev/video9 /dev/video10 /dev/media1前半部分rkisp_*是RK356X芯片内置的ISP图像信号处理器相关的虚拟设备节点用于处理从摄像头传感器直接过来的原始数据通常接在MIPI CSI接口上。这不是我们当前关心的。后半部分AC_2019053011080005: ZH-0305明确指出了这是一个USB设备并且给出了型号信息。它关联了/dev/video9和/dev/video10两个设备文件。在V4L2中一个物理摄像头可能会对应多个逻辑设备节点例如一个用于元数据metadata一个用于视频捕获video capture。通常编号较小的那个这里是/dev/video9是主视频捕获节点我们后续操作就基于它。注意不同摄像头、不同系统设备节点编号video9可能不同。每次插拔摄像头或者重启系统这个编号都有可能变化。在编写脚本或自动化任务时更可靠的方法是通过v4l2-ctl --list-devices的输出解析出USB摄像头的设备名称如ZH-0305来动态确定节点路径而不是写死/dev/video9。4.2 解析摄像头支持格式与分辨率知道设备节点后我们需要深入了解它的能力这是构建正确GStreamer管道的基础。运行v4l2-ctl -d /dev/video9 --list-formats-ext --all-d指定设备--list-formats-ext会列出所有支持的像素格式及其对应的分辨率、帧率。输出是信息量巨大的关键文本需要耐心解读。以下是一个典型的精简后输出ioctl: VIDIOC_ENUM_FMT Type: Video Capture [0]: MJPG (Motion-JPEG, compressed) Size: Discrete 1024x576 Interval: Discrete 0.033s (30.000 fps) Size: Discrete 1280x720 Interval: Discrete 0.033s (30.000 fps) Size: Discrete 896x504 Interval: Discrete 0.033s (30.000 fps) Size: Discrete 800x600 Interval: Discrete 0.033s (30.000 fps) Size: Discrete 640x480 Interval: Discrete 0.033s (30.000 fps) [1]: YUYV (YUYV 4:2:2) Size: Discrete 1280x720 Interval: Discrete 0.100s (10.000 fps) Size: Discrete 1024x576 Interval: Discrete 0.067s (15.000 fps) Size: Discrete 896x504 Interval: Discrete 0.100s (10.000 fps) Size: Discrete 800x600 Interval: Discrete 0.067s (15.000 fps) Size: Discrete 640x480 Interval: Discrete 0.033s (30.000 fps)解读与决策格式对比摄像头支持两种主流格式。MJPG是压缩格式每帧都是一张JPEG图片数据量相对较小但需要解码才能处理。YUYV是未经压缩的原始YUV格式画质无损但数据量极大以1280x720为例一帧YUV422数据约1.3MB30帧每秒就是近40MB/s的带宽对USB总线和CPU都是巨大压力。分辨率与帧率对于MJPG格式在1280x720720P分辨率下支持30 FPS。而对于YUYV格式同样的720P分辨率帧率只有10 FPS。如何选择对于网络推流场景优先选择MJPG格式。原因有三第一数据量小减轻USB传输压力第二RK3566的硬件解码器如VPU可以高效解码MJPEG为后续的硬件编码做准备整体Pipeline效率更高第三能支持更高的帧率画面更流畅。因此我们的目标是在1280x720分辨率、30帧每秒、MJPG格式下进行采集。实操心得在运行推流命令前可以先使用v4l2-ctl设置摄像头的格式和分辨率确保与后续GStreamer管道中的设置一致避免管道内部协商失败。命令如下v4l2-ctl -d /dev/video9 --set-fmt-videowidth1280,height720,pixelformatMJPG设置成功后可以用v4l2-ctl -d /dev/video9 --get-fmt-video来验证。5. 搭建RTSP流媒体服务器Mediamtx部署详解Mediamtx原名rtsp-simple-server是我们选择的轻量级RTSP服务器。它不仅仅支持RTSP还同时支持RTMP、HLS、WebRTC等多种协议功能强大但使用简单。5.1 下载与安装Mediamtx提供了预编译的二进制文件直接下载解压即可运行无需复杂的编译过程。访问其GitHub Release页面找到对应ARM64架构的版本。在开发板上可以使用wget直接下载# 进入一个工作目录例如/home/ido cd /home/ido # 下载最新版本的ARM64二进制包版本号请以官网最新为准 wget https://github.com/bluenviron/mediamtx/releases/download/v1.1.1/mediamtx_v1.1.1_linux_arm64v8.tar.gz # 解压 tar -xvf mediamtx_v1.1.1_linux_arm64v8.tar.gz解压后你会得到三个文件mediamtx主程序、mediamtx.yml配置文件、LICENSE。5.2 配置与运行Mediamtx的默认配置已经足够我们使用。它会在8554端口监听RTSP1935端口监听RTMP8888端口提供HLS服务等。直接在前台运行可以查看实时日志./mediamtx如果看到类似以下的输出说明服务器启动成功2023/10/20 02:04 INF MediaMTX v1.1.1 2023/10/20 02:04 INF [RTSP] listener opened on :8554 (TCP), :8000 (UDP/RTP), :8001 (UDP/RTCP) 2023/10/20 02:04 INF [RTMP] listener opened on :1935 2023/10/20 02:04 INF [HLS] listener opened on :8888 2023/10/20 02:04 INF [WebRTC] listener opened on :8889 (HTTP) 2023/10/20 02:04 INF [SRT] listener opened on :8890 (UDP)注意默认配置下服务器允许任何路径的推流和拉流且没有鉴权。这在家庭内网测试没问题但如果部署在公网或有安全要求的场景务必修改mediamtx.yml配置文件设置访问权限、用户名密码等。配置文件注释很详细可以参考官方文档。为了让服务器在后台持续运行并且即使退出SSH会话也不中断我们可以使用nohup和nohup ./mediamtx mediamtx.log 21 这样服务器就在后台运行了日志会输出到mediamtx.log文件。你可以用jobs命令查看后台任务或者用ps aux | grep mediamtx确认进程是否存在。5.3 防火墙与端口开放确保开发板的防火墙如果启用开放了相关端口尤其是8554RTSP TCP。在Ubuntu上如果使用ufw可以这样操作ufw allow 8554/tcp ufw allow 1935/tcp # 如果也需要RTMP如果开发板处于路由器后且需要从外网访问则还需要在路由器上设置端口转发NAT将公网IP的某个端口映射到开发板内网IP的8554端口。这涉及网络安全请谨慎操作。6. 构建GStreamer推流管道从采集到网络发送这是整个项目的核心环节。我们将使用GStreamer命令行工具gst-launch-1.0通过一系列插件的组合构建一个高效的推流管道。6.1 安装必要的GStreamer插件Ubuntu系统通常预装了GStreamer核心库但一些特定插件可能需要单独安装。我们需要确保以下插件已就位gstreamer1.0-plugins-good: 包含v4l2src视频采集、videoconvert格式转换等基础好插件。gstreamer1.0-plugins-bad或gstreamer1.0-plugins-rockchip如果有可能包含mpph264enc硬件编码插件。瑞芯微通常会提供自己的GStreamer插件包。gstreamer1.0-rtsp: 包含RTSP相关的插件如rtspclientsinkRTSP推流客户端。gstreamer1.0-libav: 包含基于FFmpeg的插件如avdec_mjpegMJPEG解码器。安装命令如下apt update apt install -y gstreamer1.0-tools gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-rtsp对于RK356X强烈建议安装厂商提供的多媒体插件包。例如触觉智能或Firefly的SDK中可能会包含gstreamer1.0-rockchip或类似的包它直接集成了对MPP硬件编解码的优化支持。请查阅你的开发板文档。如果找不到可以尝试从官方SDK或BSP中编译安装。6.2 管道命令逐行解析现在我们来构造并理解那个关键的推流命令。假设开发板IP是192.168.1.196摄像头节点是/dev/video9目标推流到本机mediamtx服务器。gst-launch-1.0 v4l2src device/dev/video9 \ ! image/jpeg ! avdec_mjpeg ! videoconvert \ ! video/x-raw,height720,width1280,framerate30/1,formatNV12 ! mpph264enc \ ! rtspclientsink locationrtsp://127.0.0.1:8554/stream让我们把这个管道拆解开看看每一段做了什么v4l2src device/dev/video9:作用视频采集源。从指定的V4L2设备节点读取数据。关键点默认情况下v4l2src会尝试与摄像头协商出最佳的格式和分辨率。但为了精确控制我们可以在后面通过caps过滤器来指定。不过更常见的做法是先用v4l2-ctl设置好摄像头或者让GStreamer自动协商。! image/jpeg ! avdec_mjpeg:作用格式协商与解码。第一个!是GStreamer管道的连接符。image/jpeg这是一个Capabilities过滤器capsfilter。它告诉管道“我期望从上游v4l2src接收image/jpeg格式的数据”。这相当于主动选择了MJPEG格式。如果摄像头支持多种格式这个caps会驱动v4l2src输出MJPEG数据。avdec_mjpeg解码器插件。它将接收到的MJPEG压缩数据解码成原始的video/x-raw格式通常是YUV。! videoconvert:作用色彩空间和格式转换。解码器输出的YUV格式可能并且很可能与硬件编码器要求的输入格式不匹配。videoconvert是一个通用的转换插件可以处理各种YUV/RGB格式之间的转换。! video/x-raw,height720,width1280,framerate30/1,formatNV12:作用另一个capsfilter用于设置转换后的视频属性并筛选给下游。video/x-raw指定数据类型为原始视频帧。height720,width1280设置目标分辨率。这里必须与摄像头实际支持的分辨率一致否则可能出错。framerate30/1设置目标帧率。30/1表示30帧每秒。formatNV12这是非常关键的一步。NV12是一种YUV420的半平面semi-planar格式它是许多硬件编码器包括RK的MPP最偏好甚至唯一支持的输入格式。videoconvert会根据这个caps自动将上游传来的YUV格式如YUYV、I420转换为NV12。! mpph264enc:作用硬件H.264编码。这是瑞芯微MPP提供的GStreamer插件直接调用RK3566的VEPU硬件单元进行编码效率极高CPU占用率很低。注意如果系统没有安装mpp相关的GStreamer插件这个元件会找不到。可以尝试用软编码x264enc替代但CPU负载会飙升可能无法维持720P30fps的实时编码。命令会变为! x264enc speed-presetultrafast tunezerolatency。! rtspclientsink locationrtsp://127.0.0.1:8554/stream:作用RTSP推流客户端。它将编码后的H.264码流按照RTSP/RTP协议推送到指定的服务器地址。location指定RTSP服务器的URL。127.0.0.1表示推流到本机开发板自身的mediamtx服务器。/stream是流的路径名可以自定义如/usbcam。6.3 执行推流与初步验证确保mediamtx服务器已在后台运行。然后在终端中执行上述完整的gst-launch-1.0命令。如果一切正常你应该能看到GStreamer的输出信息并且没有报错。此时你可以通过以下方法初步验证推流是否成功查看mediamtx日志如果mediamtx是用nohup运行的查看其日志文件tail -f mediamtx.log。当GStreamer开始推流时你应该能看到类似[RTSP] [conn 192.168.1.196:xxxxx] opened和[path stream] [rtsp source] started的日志条目。使用GStreamer本地测试拉流在开发板上另开一个终端尝试用GStreamer播放自己推的流gst-launch-1.0 playbin urirtsp://127.0.0.1:8554/stream如果弹出一个播放窗口并显示摄像头画面恭喜你推流成功7. 客户端播放从电脑到另一块开发板推流成功后任何能连接到开发板所在网络的设备都可以作为客户端来观看视频。7.1 在电脑上使用VLC播放这是最常用的方式。确保你的电脑和RK356X开发板在同一个局域网内。打开VLC媒体播放器。点击菜单栏的媒体-打开网络串流。在弹出的对话框中输入RTSP流地址。将127.0.0.1替换为你的开发板实际IP地址例如rtsp://192.168.1.196:8554/stream点击播放。稍等片刻VLC就会开始缓冲并播放摄像头传来的实时画面。你可以在VLC的工具-编解码器信息中查看详细的流信息确认视频编码是H.264分辨率帧率是否正确。7.2 在另一块RK356X开发板上播放假设你有另一块RK356X开发板板B也想观看板A推的流。操作同样简单。在板B上确保网络连通可以ping通板A的IP。板B也需要安装GStreamer工具gstreamer1.0-tools和gstreamer1.0-plugins-good等。执行播放命令gst-launch-1.0 playbin urirtsp://192.168.1.196:8554/stream或者使用更底层的元件构建播放管道以便调试gst-launch-1.0 rtspsrc locationrtsp://192.168.1.196:8554/stream latency0 ! rtph264depay ! h264parse ! mppvideodec ! videoconvert ! waylandsinkrtspsrc: RTSP源负责拉流。rtph264depay: 解RTP包提取H.264数据。h264parse: 解析H.264码流。mppvideodec:RK356X硬件解码器使用VPU硬件解码H.264效率极高。videoconvert: 格式转换。waylandsink: 显示输出假设系统使用Wayland显示协议。如果是X11系统则用ximagesink或xvimagesink。使用硬件解码mppvideodec可以显著降低板B的CPU占用使其在播放视频的同时还能处理其他任务。8. 进阶优化与排错指南基本的推流播放成功后我们可能会遇到延迟、卡顿、花屏等问题或者希望优化性能。下面分享一些实战经验和排查技巧。8.1 降低延迟优化默认的推流管道为了兼容性和稳定性可能会引入缓冲增加延迟。对于实时监控等对延迟敏感的场景可以进行以下优化在编码器设置参数mpph264enc插件支持一些调优参数。gst-launch-1.0 v4l2src device/dev/video9 ! image/jpeg ! avdec_mjpeg ! videoconvert \ ! video/x-raw,height720,width1280,framerate30/1,formatNV12 \ ! mpph264enc control-rate2 bitrate2000000 gop30 ! h264parse \ ! rtspclientsink locationrtsp://127.0.0.1:8554/stream protocolstcp latency0control-rate2: 恒定比特率CBR模式网络传输更稳定。bitrate2000000: 设置目标码率为2 Mbps。可以根据画质和带宽需求调整。gop30: 设置关键帧I帧间隔为30帧即1秒一个I帧。更小的GOP如15有助于快速seek和错误恢复但会略微增加码率。! h264parse: 添加h264parse元件可以确保码流格式规整有时能提高客户端兼容性。protocolstcp: 强制RTSP使用TCP传输rtspclientsink的属性。虽然UDP效率高但在某些网络不稳定或防火墙限制严格的环境下TCP更可靠能避免丢包导致的马赛克但延迟可能稍高。追求最低延迟可以尝试UDP默认或protocolsudp但需确保网络环境好。latency0: 设置rtspclientsink的延迟为0减少客户端缓冲。调整GStreamer全局缓冲设置环境变量可以减少管道内部的缓冲。export GST_DEBUG*BUFFER*:5 # 然后运行你的gst-launch命令这会在调试输出中显示缓冲信息帮助你分析延迟来源。更激进的做法是设置GST_BUFFER_DURATION等变量但需要谨慎测试。8.2 常见问题与解决方案以下是我在多次实践中遇到的一些典型问题及解决方法问题现象可能原因排查步骤与解决方案gst-launch-1.0报错no element “mpph264enc”未安装RK356X的MPP GStreamer插件。1. 检查是否安装了gstreamer1.0-rockchip或类似包。2. 运行 gst-inspect-1.0推流命令执行后无报错但mediamtx无连接日志VLC无法播放1. 推流地址错误。2. mediamtx未运行或端口被占用。3. 防火墙阻止。1. 确认推流命令中的IP是127.0.0.1本机或正确的板子IP。2. 用 ps auxVLC能连接但画面黑屏、卡住或很快断开1. 编码格式或参数客户端不支持。2. 网络带宽不足或丢包严重。3. 摄像头采集异常。1. 在板子上先用gst-launch-1.0 ... ! fakesink测试管道到编码器输出是否正常。2. 尝试降低推流分辨率或码率如改为640x480。3. 在VLC中查看编解码器信息确认收到的码流格式是否为H.264。4. 检查摄像头是否被其他进程占用fuser /dev/video9。画面延迟非常大好几秒GStreamer管道或客户端缓冲过多。1. 按照8.1章节优化延迟参数特别是latency0和protocols选择。2. 在VLC中工具-偏好设置-输入/编解码器将“网络缓存”值调低如300ms。3. 尝试使用ffplay播放ffplay -rtsp_transport tcp -i rtsp://192.168.1.196:8554/stream它通常延迟更低。CPU占用率过高使用了软编码x264enc或软解码。1.推流端务必确保使用mpph264enc硬件编码。2.播放端板B务必使用mppvideodec硬件解码。3. 使用top或htop命令监控进程资源占用。硬件编解码时CPU占用率应低于30%对于720P30fps。画面出现绿色条纹、花屏色彩空间转换或编码器输入格式不匹配。1.确保videoconvert后面的capsfilter指定了formatNV12。这是最常见的原因。2. 尝试在videoconvert前也加一个capsfilter明确指定输入格式! video/x-raw,formatYUY2 ! videoconvert ...假设解码器输出YUY2。3. 检查摄像头输出的MJPG格式是否稳定有些劣质摄像头MJPG输出可能有缺陷尝试换用YUYV格式但要注意帧率和CPU负载。8.3 自动化脚本与开机自启对于产品化部署我们需要让推流服务在开发板开机后自动运行。创建推流脚本将完整的gst-launch-1.0命令保存到一个脚本文件中例如/home/ido/push_stream.sh。记得给脚本添加执行权限chmod x push_stream.sh。可以在脚本中加入循环和日志增强健壮性。#!/bin/bash # push_stream.sh LOG_FILE/var/log/push_stream.log while true; do echo $(date): Starting stream pipeline... $LOG_FILE gst-launch-1.0 -v v4l2src device/dev/video9 ! image/jpeg ! avdec_mjpeg ! videoconvert \ ! video/x-raw,height720,width1280,framerate30/1,formatNV12 ! mpph264enc bitrate2000000 \ ! rtspclientsink locationrtsp://127.0.0.1:8554/stream protocolstcp $LOG_FILE 21 echo $(date): Pipeline exited with code $?. Restarting in 5 seconds... $LOG_FILE sleep 5 done这个脚本会在管道异常退出后等待5秒自动重启。创建Systemd服务单元这是管理后台服务的最佳实践。创建文件/etc/systemd/system/rtsp-stream.service。[Unit] DescriptionRTSP Stream Service for USB Camera Afternetwork.target [Service] Typesimple Userroot WorkingDirectory/home/ido # 先启动mediamtx服务器 ExecStartPre/usr/bin/sleep 5 ExecStart/home/ido/mediamtx # 等待服务器启动然后启动推流脚本 ExecStartPost/usr/bin/sleep 2 ExecStartPost/home/ido/push_stream.sh Restartalways RestartSec10 [Install] WantedBymulti-user.target注意这是一个将mediamtx和推流脚本合并在一起的简单示例。更规范的做法是为mediamtx和推流分别创建两个service文件并使用Wants或After来定义依赖关系。启用并启动服务sudo systemctl daemon-reload sudo systemctl enable rtsp-stream.service sudo systemctl start rtsp-stream.service sudo systemctl status rtsp-stream.service # 查看状态这样开发板每次启动后都会自动运行RTSP服务器并开始推流。经过以上步骤你已经成功在RK356X开发板上搭建了一个稳定、低延迟的USB摄像头RTSP流媒体服务器。这套方案充分利用了RK3566的硬件编解码能力性能高效扩展性强。你可以在此基础上进一步探索如何集成音频如果摄像头带麦克风、如何通过Web界面控制、或者如何触发AI模型进行实时分析从而打造出更强大的智能视觉应用。