从零搭建RTSP视频流测试环境:手把手教学(FFmpeg方案)
引言
在视频分析系统的开发与测试中,真实可靠的视频流获取常常是影响效率的关键一环。开发者往往面临几类典型难题:真实摄像头设备采购周期长、异常场景难以复现;公共 RTSP 流易受网络限制,且分辨率、帧率难以适配;商业流媒体服务则成本高昂,不便于快速验证与调试。
为应对这些痛点,本文介绍一种基于开源工具快速搭建本地 RTSP 视频流的轻量化方案。该方法使用 rtsp-simple-server 作为流媒体服务器,并结合 FFmpeg 将本地视频文件转为 RTSP 流,既降低了成本与依赖,也提高了测试环境的可控性与灵活性。
一、准备工作
1.1 演示环境
| 工具 | 版本 | 描述 |
|---|---|---|
| 操作系统 | Linux CentOS 7 | 操作系统 |
| rtsp-simple-server | v0.21.6 | 轻量级RTSP服务器 |
| FFmpeg | 4.1 | 多媒体处理工具 |
| Python | 3.x | 可选,用于自动化脚本 |
1.2 文件准备
测试视频文件(如test.mp4,建议1080P以内)
二、安装核心工具
2.1 部署rtsp-simple-server
# 从 GitHub 上下载 rtsp-simple-server
wget https://github.com/bluenviron/mediamtx/releases/download/v0.21.6/rtsp-simple-server_v0.21.6_linux_amd64.tar.gz# 解压
tar -xzf rtsp-simple-server_v0.21.6_linux_amd64.tar.gz# 运行 rtsp-simple-server 服务
./rtsp-simple-server

从 GitHub 下载巨慢,可以通过我分享的阿里云盘链接进行下载:rtsp-simple-server_v0.21.6_linux_amd64.rar
由于我将压缩包已经再次压缩,需要先解压后,再上传至服务器,再执行以上命令
2.2 安装FFmpeg
# 下载 FFmpeg
wget https://ffmpeg.org/releases/ffmpeg-4.1.tar.xz# 解压 FFmpeg
tar xvJf ffmpeg-4.1.tar.xzcd ffmpeg-4.1# 安装 gcc 编译器(因为我的 gcc 的版本为 4.8.5, 所以 ffmpeg 只能使用低版本)
yum install gcc
yasm 软件包不在 CentOS 7 默认的 yum 仓库中,所以需要提前启用EPEL仓库
# 安装EPEL仓库
yum install epel-release# 更新yum缓存
yum makecache#安装 yasm 编译器
yum install yasm
进行FFmpeg 源码编译, /usr/local/ffmpeg 为自己指定的安装目录
./configure --enable-shared --prefix=/usr/local/ffmpeg
执行 make, 要等很久很久......
make
执行过程中存在警告是不影响使用的

执行安装
make install
修改文件 /etc/ld.so.conf
vim /etc/ld.so.conf
输入以下内容
include ld.so.conf.d/*.conf
/usr/local/ffmpeg/lib/
执行 ldconfig 使修改生效
ldconfig
验证 ffmpeg 是否安装成功
/usr/local/ffmpeg/bin/ffmpeg -version

配置环境变量
vim /etc/profile
在最后PATH添加环境变量:
#set ffmpeg environment
PATH=$PATH:/usr/local/ffmpeg/bin
export PATH
使环境变量生效
source /etc/profile
验证环境变量是否配置成功
ffmpeg -version

三、使用FFmpeg推送视频流
3.1 基础命令
将本地MP4转为RTSP流:
ffmpeg \-y \-i test.mp4 \-f rawvideo \-vcodec rawvideo \-pix_fmt bgr24 \-c:v mpeg1video \-b:v 1000k \-f rtsp \rtsp://localhost:8554/live
命令解析:
ffmpeg \-y \ # 自动覆盖输出文件-i test.mp4 \ # 输出MP4视频-f rawvideo \ # 输入格式:原始视频-vcodec rawvideo \ # 输入编码:原始视频-pix_fmt bgr24 \ # 像素格式:BGR 24位(OpenCV 默认)-c:v mpeg1video \ # 视频编码器:MPEG-1-b:v 1000k \ # 视频码率:1000 kbps-f rtsp \ # 输出格式:RTSP 流rtsp://localhost:8554/live # RTSP 输出地址
3.2 Python自动化脚本
pip 安装 numpy opencv-python
python3 -m pip install "numpy<2.0" opencv-python
创建stream_publisher.py:
import cv2
import subprocess
import signal
import sysdef push_file_to_rtsp(input_file, rtsp_url):"""将本地视频文件推流到RTSP服务器Args:input_file: 输入视频文件路径rtsp_url: RTSP推流地址,如:rtsp://localhost:8554/live"""# 打开视频文件cap = cv2.VideoCapture(input_file)if not cap.isOpened():print(f"无法打开视频文件:{input_file}")return# 获取视频属性fps = cap.get(cv2.CAP_PROP_FPS)width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))# 修复异常FPSif fps < 20 or fps > 120:print(f"⚠ 无效帧率 {fps}, 使用默认 30")fps = 30fps = int(fps)print(f"视频信息:{width}×{height} @ {fps}fps (原始值:{cap.get(cv2.CAP_PROP_FPS)})")# FFmpeg 命令 - 使用 mpeg1video 编码(兼容性好, 无需libx264)ffmpeg_cmd = ['ffmpeg','-y', # 覆盖输出'-f', 'rawvideo','-vcodec', 'rawvideo','-pix_fmt', 'bgr24', # Opencv 默认是 BGR'-s', f'{width}x{height}', # 分辨率'-r', str(fps), # 帧率'-i', '-', # 从 stdin 读取'-c:v', 'mpeg1video', # 改为 mpeg1video'-b:v', '1000k', # 码率(可调)'-f', 'rtsp', # 输出格式rtsp_url]# 启动FFmpeg进程process = subprocess.Popen(ffmpeg_cmd,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE)def signal_handler(sig, frame):print("\n正在停止推流...")process.terminate()cap.release()sys.exit(0)signal.signal(signal.SIGINT, signal_handler)print(f"开始推流到:{rtsp_url}")print("按 Ctrl+C 停止推流")try:while True:ret, frame = cap.read()if not ret:print("⚠ 视频读取完毕, 循环播放")cap.set(cv2.CAP_PROP_POS_FRAMES, 0)continue# 写入帧到 FFmpegprocess.stdin.write(frame.tobytes())except BrokenPipeError:# FFmpeg 崩溃, 读取错误日志print("❌ FFmpeg 进程已崩溃, 可能编码器不支持或参数错误")try:stderr_output = process.stderr.read().decode()if stderr_output.strip():print("📚 FFmpeg 错误日志:")print(stderr_output)except:passexcept Exception as e:print(f"❌ 推流异常:{e}")finally:process.terminate()try:process.wait(timeout=5)except subprocess.TimeoutExpired:process.kill()cap.release()if __name__ == "__main__":input_file = "test.mp4" # 替换为你的视频文件rtsp_url = "rtsp://localhost:8554/live" # RTSP服务器地址push_file_to_rtsp(input_file, rtsp_url)
将代码中的变量 input_file 和 rtsp_url 就可执行脚本, 脚本会将 test.mp4 转换为 risp 格式推送到 RTSP 服务器, 并循环播放, 按 Ctrl+C 即可退出脚本
python3 stream_publisher.py

四、测试与验证
4.1 使用VLC播放
打开VLC → 文件 → 打开网络串流

输入:rtsp://localhost:8554/live ,点击播放

