如何使用ffmpeg将RTSP流转换为基于HTTP协议的MJPEG流
RTSP转HTTP MJPEG流ffmpeg实现方案(Ubuntu 20.04)
前置依赖安装
首先安装所需工具,Ubuntu 20.04默认自带socat,只需安装ffmpeg即可:
sudo apt update && sudo apt install ffmpeg socat -y
实现原理
通过socat监听指定HTTP端口,收到访问请求时触发ffmpeg拉取RTSP流,实时转码为符合HTTP标准的multipart MJPEG流返回,无需额外重型中间件,CPU占用远低于VLC方案,普通1080P摄像头场景下CPU占用通常低于10%。
分步操作
1. 快速测试方案
直接运行以下命令即可在8080端口暴露MJPEG流,注意替换命令中的RTSP地址为你实际的流地址:
socat TCP-LISTEN:8080,fork,reuseaddr EXEC:"ffmpeg -rtsp_transport tcp -i rtsp://<你的摄像头用户名>:<你的摄像头密码>@<摄像头IP>:<RTSP端口>/<流路径> -q:v 3 -f mpjpeg -boundary mjpeg_boundary -"
参数说明:
-rtsp_transport tcp:指定用TCP协议拉取RTSP流,避免弱网环境下UDP丢包导致的花屏,网络条件好可删除该参数使用UDP降低延迟-q:v 3:JPEG图像质量,取值范围131,数值越小质量越高、带宽占用越大,可根据需求调整为510平衡性能和画质TCP-LISTEN:8080:指定监听的HTTP端口,可自行修改,若开启了ufw防火墙需放行对应端口:sudo ufw allow 8080
测试时直接在浏览器访问http://<Ubuntu机器IP>:8080即可查看实时流。
2. 稳定后台运行方案
如果需要长期稳定运行,可配置systemd服务托管:
第一步:编写启动脚本
在你的用户目录下新建rtsp2mjpeg.sh文件,内容如下:
#!/bin/bash # 替换为你实际的RTSP流地址 RTSP_URL="rtsp://admin:123456@192.168.1.100:554/stream1" # 自定义监听端口 LISTEN_PORT=8080 # 自定义JPEG质量 QUALITY=3 socat TCP-LISTEN:${LISTEN_PORT},fork,reuseaddr EXEC:"ffmpeg -hide_banner -loglevel error -rtsp_transport tcp -i ${RTSP_URL} -q:v ${QUALITY} -f mpjpeg -boundary mjpeg_boundary -"
给脚本添加执行权限:
chmod +x ~/rtsp2mjpeg.sh
第二步:配置systemd服务
新建/etc/systemd/system/rtsp2mjpeg.service文件,内容如下:
[Unit] Description=RTSP转HTTP MJPEG服务 After=network.target [Service] # 替换为你的Ubuntu系统用户名 User=ubuntu ExecStart=/home/ubuntu/rtsp2mjpeg.sh Restart=always RestartSec=3 [Install] WantedBy=multi-user.target
第三步:启动服务并设置开机自启
sudo systemctl daemon-reload sudo systemctl start rtsp2mjpeg sudo systemctl enable rtsp2mjpeg
可通过以下命令查看运行状态:
sudo systemctl status rtsp2mjpeg
性能优化
如果你的Ubuntu机器带Intel核显,可开启硬解码进一步降低CPU占用,只需将ffmpeg命令修改为如下形式,在输入参数前添加硬解码参数:
ffmpeg -hwaccel qsv -c:v h264_qsv -rtsp_transport tcp -i ${RTSP_URL} -q:v ${QUALITY} -f mpjpeg -boundary mjpeg_boundary -
开启硬解码后1080P流CPU占用通常可降到3%以内。
内容的提问来源于stack exchange,提问作者SomebodySysop
相关产品推荐
相关产品推荐

