RK3588 + Docker + GStreamer 实现 RTSP 推流(MJPEG AVI → H.264),VLC 成功拉流

【实战踩坑全记录】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 → 实时推流

相关推荐
独断万古他化2 小时前
Docker 入门前置:容器虚拟化基础之Namespace 空间隔离
linux·docker·容器
AC赳赳老秦2 小时前
Docker+DeepSeek:生成镜像优化Dockerfile与容器健康检查脚本
android·运维·人工智能·机器学习·docker·容器·deepseek
fcm192 小时前
导出已有的docker容器
docker·容器·eureka
等什么君!2 小时前
Docker中常用的镜像命令和容器命令
运维·docker·容器
却道天凉_好个秋2 小时前
音视频学习(八十五):FU-A
音视频·rtp·fu-a
CodeCaptain2 小时前
dify需要使用rerank模型,docker安装xinference的解决方案
经验分享·docker·ai·容器
shandianchengzi11 小时前
【记录】Tailscale|部署 Tailscale 到 linux 主机或 Docker 上
linux·运维·docker·tailscale
肉肉心很软13 小时前
使用onlyoffice实现文件预览编辑 + Docker一键部署流程
运维·docker·容器
-大头.13 小时前
Docker实战:构建高性能MySQL主从复制集群(读写分离)
mysql·docker·容器