【实战踩坑全记录】RK3588 + Docker + GStreamer 实现 RTSP 推流(MJPEG AVI → H.264),VLC 成功拉流
关键词:RK3588、Docker、GStreamer、RTSP、VLC、MJPEG、x264、gst-rtsp-server
适用人群:嵌入式 / AI 板卡 / 音视频 / 视觉工程师
一句话总结:
👉 在 RK3588 板子 Docker 容器内,把一个 MJPEG 编码的 AVI 视频文件,稳定推成 RTSP 流,并在 笔记本 VLC 一条 URL 成功拉流播放。
一、背景与目标
在实际工程中,我们经常遇到如下需求:
板子(RK3588)端已有算法输出视频文件(AVI / MP4)
希望 通过 RTSP 推流 给上位机 / VLC / NVR / 控制台查看
程序运行在 Docker 容器 中
希望做到:
一条 RTSP URL,VLC 直接打开即可播放
本篇文章完整记录了 从 0 到 1 的全过程,包括:
Docker 网络与目录挂载
GStreamer 工具缺失的真实踩坑
MJPEG 视频格式误判
RTSP Server 工具缺失
最终 手写 RTSP Server 程序 的工程解法
二、实验环境说明
1️⃣ 硬件 / 网络
RK3588 开发板
板子 IP:192.168.150.1
笔记本 IP:192.168.150.78
二者在同一网段
2️⃣ 软件环境
Ubuntu 22.04(jammy,arm64)
Docker(host 网络模式)
GStreamer 1.20.x
VLC(笔记本端)
3️⃣ 输入视频
/root/zht_docker/result_yolov8123.avi
三、Docker 启动方式(非常关键)
强烈建议新手直接使用 host 网络模式
docker run -it --rm
--name rk3588_rtsp
--net=host
-v /root/zht_docker:/root/zht_docker
-w /root/zht_docker
your_image:latest
bash
为什么必须 --net=host?
RTSP 走 TCP(默认 8554 / 554)
避免 Docker 端口映射、iptables、NAT 等复杂问题
先把链路跑通,再谈安全与隔离
四、第一个坑:gst-discoverer-1.0 命令不存在
现象
gst-discoverer-1.0 result_yolov8123.avi
报错:
command not found
错误直觉(90% 新手会踩)
以为装了:
gstreamer1.0-tools
就一定有 gst-discoverer-1.0。
错。
正确排查方式(工程级)
apt-file update
apt-file search -x '/gst-discoverer-1.0$'
输出:
gstreamer1.0-plugins-base-apps
正确安装
apt install -y gstreamer1.0-plugins-base-apps
五、关键一步:确认视频真实编码格式
gst-discoverer-1.0 result_yolov8123.avi
核心输出:
Container: AVI
Video: JPEG
Resolution: 960x544
Framerate: 30 fps
⚠️ 重要结论
这是 MJPEG(Motion-JPEG)视频,不是 H.264 / H.265
这一步如果不做,后面推流必失败。
六、第二个大坑:RTSP Server 工具不存在
常见误区
apt install gstreamer1.0-rtsp
which test-launch
结果:没有 test-launch
原因分析(很重要)
gstreamer1.0-rtsp ≠ RTSP Server 程序
在 Ubuntu 22.04 + arm64 下:
示例程序 test-launch 不一定以二进制形式提供
工程上最稳解法:自己写 RTSP Server
七、终极解法:手写一个最小 RTSP Server(推荐)
1️⃣ 安装开发依赖
apt install -y
build-essential
pkg-config
libgstrtspserver-1.0-dev
确认头文件存在:
ls /usr/include/gstreamer-1.0/gst/rtsp-server/rtsp-server.h
2️⃣ 编写 RTSP Server 程序
创建文件 my_rtsp_server.c:
#include <gst/gst.h>
#include <gst/rtsp-server/rtsp-server.h>
int main(int argc, char *argv[]) {
gst_init(&argc, &argv);
const gchar *pipeline =
"( filesrc location=/root/zht_docker/result_yolov8123.avi "
"! avidemux "
"! jpegdec "
"! videoconvert "
"! x264enc tune=zerolatency speed-preset=veryfast bitrate=4000 key-int-max=30 "
"! rtph264pay name=pay0 pt=96 config-interval=1 )";
GstRTSPServer *server = gst_rtsp_server_new();
gst_rtsp_server_set_service(server, "8554");
GstRTSPMountPoints *mounts = gst_rtsp_server_get_mount_points(server);
GstRTSPMediaFactory *factory = gst_rtsp_media_factory_new();
gst_rtsp_media_factory_set_launch(factory, pipeline);
gst_rtsp_media_factory_set_shared(factory, TRUE);
gst_rtsp_mount_points_add_factory(mounts, "/test", factory);
g_object_unref(mounts);
gst_rtsp_server_attach(server, NULL);
g_print("RTSP stream ready at rtsp://0.0.0.0:8554/test\n");
GMainLoop *loop = g_main_loop_new(NULL, FALSE);
g_main_loop_run(loop);
}
3️⃣ 编译
gcc my_rtsp_server.c -o my_rtsp_server
$(pkg-config --cflags --libs gstreamer-1.0 gstreamer-rtsp-server-1.0)
4️⃣ 启动推流(板子端)
./my_rtsp_server
输出:
RTSP stream ready at rtsp://0.0.0.0:8554/test
八、笔记本 VLC 拉流(最终验证)
在 VLC 中:
媒体 → 打开网络串流
输入:
rtsp://192.168.150.1:8554/test
🎉 画面成功显示
九、完整踩坑总结(强烈建议收藏)
✅ 技术经验沉淀
不要猜包名,用 apt-file search
先确认视频真实编码,再设计 pipeline
MJPEG ≠ H.264,必须解码再编码
RTSP 示例工具不可靠,自己写 Server 最稳
host 网络模式是新手成功率最高的方案
十、后续可优化方向(进阶)
使用 RK3588 MPP 硬编码 替换 x264enc
降低 RTSP 延迟(<200ms)
Docker 启动即推流(entrypoint)
文件源 → 摄像头 → appsrc → 实时推流