使用4G或Wifi推流到PC

4G

整体视频流转播链路 & 各模块作用详解

结合你硬件环境、软件版本、实际操作流程,完整梳理链路、组件功能、配置逻辑,全程对应你实操场景:

硬件拓扑:HI3516 摄像机 → IMX6ULL 开发板 → 阿里云 Ubuntu 云服务器 (MediaMTX) → 本地 PC (VLC 播放器)

核心协议:RTSP + RTP + UDP + Docker + GStreamer

imx路由表:

  1. 访问摄像机(局域网网段路由),Destination改为192.168.1.0,这个网段的流量都走eth0.

route add -net 192.168.1.0 netmask 255.255.255.0 dev eth0

  1. 访问公网/阿里云(默认网段)10.104.25.1是4G网卡ip,是用来上外网的ip。此时Destination为

0.0.0.0,就是说默认流量都要走eth9.

route add default gw 10.104.25.1 dev eth9

一、完整数据流走向(从采集到播放)

HI3516(IPC) RTSP流(192.168.1.100:554/test)

IMX6ULL开发板(GStreamer 拉流+转封包+UDP推流)

↓ UDP 5004端口 RTP-H264裸流

阿里云服务器(Docker+MediaMTX 接收RTP/转RTSP服务)

↓ RTSP 8554端口

本地PC(VLC 网络串流播放 rtsp://8.160.122.24:8554/cam)

二、逐环节拆解:设备、软件、命令、作用、问题复盘

环节 1:源头设备 ------ HI3516 高清摄像头

地址与服务内置 RTSP 服务,固定流地址:rtsp://192.168.1.100:554/test

作用:

负责视频采集、H.264 编码、RTSP 对外输出,是整个链路的视频源。

对应链路:提供原始 RTSP 视频流,供下游 IMX6ULL 拉取。

环节 2:中转设备 ------ IMX6ULL 嵌入式开发板(核心转发节点)

板子为百问网嵌入式 Linux,无 apt 包管理器、无法安装 gstreamer1.0-rtsp/rtspclientsink,因此放弃 RTSP 转发方案,改用 GStreamer + UDP+RTP 转发。

执行的最终可用 GStreamer 管道命令

复制代码
gst-launch-1.0 \
rtspsrc location=rtsp://192.168.1.100:554/test latency=0 protocols=tcp ! \
rtph264depay ! h264parse ! \
rtph264pay config-interval=1 pt=96 ! \
udpsink host=8.160.122.24 port=5004 sync=false

详细的GStreamer开发教程_gstreamer教程-CSDN博客

逐个元件作用(按管道顺序):

rtspsrc

功能:GStreamer RTSP 拉流源插件

参数说明:

location:指定 HI3516 摄像头 RTSP 地址;

protocols=tcp:强制使用 TCP 传输 RTSP,避免嵌入式网络丢包;

latency=0:关闭缓冲,降低播放延迟。

作用:从 HI3516 拉取完整 RTSP 流,剥离 RTSP 信令,输出内部 RTP 视频包。

rtph264depay

功能:RTP 解封装

作用:把 RTSP 自带的 RTP 包头去掉,提取出原始 H.264 码流。

h264parse

功能:H.264 码流格式化、分片整理

作用:修复码流格式、补充帧头,保证后续重新封装 RTP 时格式合法。

rtph264pay

功能:RTP 重新封装

参数说明:

pt=96:RTP 负载类型 96,对应 H.264 视频(与后端 MediaMTX 的 SDP 配置严格匹配);

config-interval=1:每隔 1 帧输出 SPS/PPS 头部,保证播放器能正常解码。

作用:将裸 H.264 码流重新打包为 标准 RTP 数据包,为 UDP 传输做准备。

udpsink

功能:UDP 网络发送插件

参数说明:

host=8.160.122.24:阿里云服务器公网 IP;

port=5004:指定 UDP 目标端口;

sync=false:关闭音视频同步,纯视频流优化,防止卡顿。

作用:把封装好的 RTP 包通过 UDP 协议 推送到云服务器 5004 端口。

本环节踩坑复盘:

最初想用 rtspclientsink 直接推 RTSP → 报错 no element "rtspclientsink"

原因:嵌入式系统无包管理器,无法安装 RTSP 相关插件,方案作废。

改用 UDP+RTP 中转,规避插件依赖,适配嵌入式板子环境。

环节 3:云端服务 ------ 阿里云 Ubuntu 服务器 + Docker + MediaMTX

服务器角色:接收远端 UDP-RTP 流 → 转换为标准 RTSP 服务 → 对外提供播放流。

3.1 前置环境:Docker 部署

Docker = 一个超级轻量的 "独立小虚拟机 / 软件盒子"

你可以把它理解成:

  • 一个密封的软件集装箱
  • 里面自带运行环境、配置、依赖
  • 和你的服务器系统完全隔离
  • 点开就能跑,不会污染系统,不会冲突
  • 复制到任何电脑都能一模一样运行

用一条命令拿到一个装好MediaMTX的盒子。

先修复系统异常:dpkg --configure -a(解决 apt 被中断问题)

安装 docker.io、配置国内镜像加速器(解决 Docker Hub 拉取超时)

核心作用:使用 Docker 容器隔离 MediaMTX 服务,简化部署、端口映射、配置挂载。

3.2 MediaMTX 流媒体服务(核心转协议组件)

MediaMTX 是轻量 RTSP 流媒体服务器,本次作用:

监听 UDP 5004 端口接收 RTP-H264 流 → 转成 RTSP 流在 8554 端口对外服务。

1)配置文件 mediamtx.yml 详解

复制代码
yaml
logLevel: info
logDestinations: [stdout]
rtspAddress: :8554

paths:
  cam:
    source: udp+rtp://0.0.0.0:5004
    rtpSDP: |
      v=0
      o=- 0 0 IN IP4 0.0.0.0
      s=H264
      c=IN IP4 0.0.0.0
      t=0 0
      m=video 5004 RTP/AVP 96
      a=rtpmap:96 H264/90000
      a=fmtp:96 packetization-mode=1

rtspAddress: :8554:新版 MediaMTX 顶层配置,指定 RTSP 服务监听 8554 端口(旧版 rtsp:{port} 写法会解析报错)。

paths.cam:定义流路径 cam,对应播放地址后缀 /cam。

source: udp+rtp://0.0.0.0:5004:监听本机所有网卡的 UDP 5004 端口,接收 RTP 流。

rtpSDP:SDP 会话描述,告诉 MediaMTX 流格式:H.264、RTP 负载 96、采样率 90000,和开发板 rtph264pay 参数一一对应,是解码成功的关键。

2)容器启动命令 & 端口映射

复制代码
docker run -d \
  --name mediamtx \
  --restart=always \
  -p 8554:8554/tcp \
  -p 5004:5004/udp \
  -v /root/mediamtx.yml:/mediamtx.yml \
  bluenviron/mediamtx:latest

-p 8554:8554/tcp:容器 RTSP 端口映射到宿主机 TCP 8554,供 VLC 拉流;

-p 5004:5004/udp:容器 UDP 端口映射到宿主机 UDP 5004,接收开发板推流;

-v:挂载本地配置文件到容器内,永久生效。

本环节踩坑复盘:

初始写 rtp://0.0.0.0:5004 → 报错 invalid source

原因:MediaMTX 不支持纯 rtp://,必须使用 udp+rtp://。

旧版写法 rtsp:{port:8554} → 报错 cannot unmarshal object into Go value of type bool

原因:v1.12+ 新版配置语法变更,必须使用顶层 rtspAddress。

安全组 / 防火墙:手动放行 TCP 8554、UDP 5004,保证公网 + 内网端口互通。

环节 4:播放端 ------ 本地 PC + VLC 播放器

播放地址

rtsp://8.160.122.24:8554/cam

作用

作为 RTSP 客户端,主动连接云服务器 MediaMTX 的 8554 端口;

接收 RTSP 流、解析 RTP 包、解码 H.264 视频,完成画面播放。

链路终点:整套采集 - 转发 - 转协议 - 播放流程闭环。

三、核心协议流转总表

四、整套方案设计思路(适配你硬件限制)

受限于 IMX6ULL 嵌入式系统无包管理器,放弃端到端 RTSP 直推;

采用 RTSP 拉流 → RTP 重封装 → UDP 透传 绕开插件缺失问题;

云端用 MediaMTX 做 UDP-RTP → RTSP 协议转换,对外提供标准公网 RTSP 服务;

Docker 简化服务部署与端口管理,配合阿里云安全组实现跨网远程视频监控。

Wifi

PC与IMX开发板同连一个热点,私域透传VLC进度条读秒,但是黑屏。WIFI传到云服务器再用PC端的VLC拉流就正常。检查了路由表,硬件连接正常,无线网卡正常向外传输。可能是以下原因。

复制代码
gst-launch-1.0 \
rtspsrc location=rtsp://192.168.1.100:554/test latency=0 protocols=tcp ! \
rtph264depay ! h264parse ! \
rtph264pay config-interval=1 pt=96 ! \
udpsink host=8.160.122.24 port=5004 sync=false

与4G传输时同样的命令。

相关推荐
拾光Ծ12 小时前
【Linux系统编程】线程池项目实战与基于策略模式的日志系统
linux·bash·线程池·策略模式·日志
jieyucx1 天前
Go 语言零基础入门:标准库 log 包完全教程
golang·日志·log
誰能久伴不乏4 天前
【Qt 架构实战】从零手写工业级 Qt 日志系统:底层拦截与架构原理解析
qt·架构·日志
JaydenAI6 天前
[MAF预定义的IChatClient中间件-01]LoggingChatClient——在LLM调用前后输出日志
ai·c#·agent·日志·agent管道·chatclient中间件
fengxin_rou10 天前
【MySQL 三大日志深度解析】:redo log、undo log、binlog 作用与两阶段提交原理
数据库·mysql·日志·redo log
不吃土豆的马铃薯11 天前
Spdlog 入门:日志记录器与日志槽基础详解
服务器·开发语言·c++·c·日志·spdlog
佛祖让我来巡山14 天前
测试环境日志爆内存?我用一个工具类搞定了双日志体系的智能打印
日志·日志打印·生产测试环境日志
观测云19 天前
观测云日志转发至 Kafka 最佳实践
kafka·日志
代码漫谈21 天前
Spring Boot日志配置全攻略:打造高效、可靠的日志系统
java·spring boot·log4j·日志