利用FFmpeg快速实现一个RTSP推流服务器

310 阅读5分钟

FFmpeg本身不能直接作为RTSP服务器,需要搭配一个专门的RTSP服务器软件来配合验证。最常用的方案是使用 MediaMTX(曾用名 rtsp-simple-server)。

整个流程就是:先启动MediaMTX服务,然后用FFmpeg把本地视频文件或屏幕画面推送给它,最后用 ffplay 或者VLC来拉流播放,这样就完成了一次完整的验证。

第一步:部署RTSP服务器 (MediaMTX)

你可以选择下面任意一种方式快速启动一个RTSP服务。

方式一:直接运行二进制文件(推荐)

  1. 去 MediaMTX GitHub Releases 页面 下载和你操作系统匹配的最新版本压缩包。
  2. 解压后,在终端/命令行里执行解压出的 mediamtx 可执行文件。它会使用默认配置启动,默认监听端口是 8554。
  3. 看到类似 server is ready 的日志,就说明服务已经跑起来了。

方式二:使用Docker(如果你熟悉Docker)

如果你已经装了Docker,用一条命令就能运行,非常快捷:

bash

docker run -d --name rtsp-server -p 8554:8554 -p 8000:8000/udp -p 8001:8001/udp aler9/rtsp-simple-server

第二步:使用FFmpeg推流

接下来,打开另一个终端窗口,用FFmpeg把视频源推到你刚启动的RTSP服务器上。你需要保持第一个终端里的MediaMTX一直在运行。

这里有几个常用的推流示例,你可以选一个试试:

  • 推送一个本地视频文件(最常用) : 用 -re 参数保证视频以正常速度播放,而不是瞬间传完。

    bash

    ffmpeg -re -i 你的视频文件.mp4 -c copy -f rtsp rtsp://localhost:8554/mystream
    
  • 循环推送一个视频文件: 加上 -stream_loop -1,视频播完后会自动从头开始循环。

    bash

    ffmpeg -re -stream_loop -1 -i 你的视频文件.mp4 -c copy -f rtsp rtsp://localhost:8554/mystream
    
  • 推送电脑屏幕(Windows) : 可以用来共享你的桌面。

    bash

    ffmpeg -f gdigrab -framerate 15 -video_size 1920x1080 -i desktop -c:v libx264 -preset ultrafast -f rtsp rtsp://localhost:8554/mystream
    

第三步:验证拉流播放

推流开始后,你可以用 ffplay 直接播放刚才推送的RTSP地址,来验证整个环境是否搭建成功:

bash

ffplay rtsp://localhost:8554/mystream

如果你用的是VLC播放器,也可以打开“网络串流”,输入这个地址进行播放。

顺利的话,你应该就能看到视频画面了。如果 ffplay 提示连接失败,可以检查下第一个终端里的 mediamtx 是否正常运行。如果看到视频但感觉延迟比较高,可以试试把 rtsp_transport 设置成 TCP 模式:

bash

ffplay rtsp://localhost:8554/mystream -rtsp_transport tcp

来看看我的推流效果:

c2a04b42aa596991cd5179ee3c43051b.png

恭喜!拉流成功了!

RTSP 本地环境已经完全跑通了,FFplay 能正常播放 rtsp://localhost:8554/stream,说明整个链路都没问题:

  • ✅ MediaMTX(RTSP 服务器)正常运行
  • ✅ FFmpeg/FFplay 安装正确
  • ✅ 推流端在工作(不管是文件还是摄像头)
  • ✅ 拉流播放正常

接下来你可以做的事

1. 将 RTSP 流保存为视频文件

bash

ffmpeg -i rtsp://localhost:8554/stream -c copy output.mp4

直接录制,不重新编码,速度快且画质无损。

2. 推流到其他平台(如 B站/抖音)

bash

ffmpeg -i rtsp://localhost:8554/stream -c copy -f flv rtmp://推流地址

3. 实时截图

bash

ffmpeg -i rtsp://localhost:8554/stream -frames:v 1 screenshot.jpg

4. 用代码拉流(Python 示例)

python

import cv2
cap = cv2.VideoCapture("rtsp://localhost:8554/stream")
while True:
    ret, frame = cap.read()
    if ret:
        cv2.imshow("RTSP", frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
cap.release()
cv2.destroyAllWindows()

5. 如果延迟还觉得高

bash

ffplay rtsp://localhost:8554/stream -fflags nobuffer -flags low_delay -framedrop -analyzeduration 0

补充提醒

  • 如果用的是本地文件推流(ffmpeg -re -i input.mp4 ...),文件播完流就结束了,可以加 -stream_loop -1 循环推流
  • 如果是摄像头 RTSP,确保摄像头和电脑在同一网络

现在你已经是 RTSP 拉流小能手了!如果还有其他需求(比如转码、多路拉流、推流到云平台等),随时问我。😊