基于现有rtsp2mjpg Docker配置实现H264/MJPEG转码为640x480分辨率RTSP MJPEG流的方案咨询
基于现有rtsp2mjpg Docker配置实现H264/MJPEG转码为640x480分辨率RTSP MJPEG流的方案咨询
Hey Martin,我完全get到你的需求:你已经用rtsp2mjpg把大华摄像头的流转成了HTTP协议的MJPEG,但2N Verso只认RTSP,所以得把转码后的640x480 MJPEG输出成RTSP流对吧?
首先得明确:你当前用的ffserver本身不支持RTSP输出,它只能处理HTTP流媒体,所以我们需要调整现有Docker配置,引入一个RTSP流媒体服务器来实现这个需求。下面给你两种可行的方案,都是基于你的现有配置扩展的:
方案一:新增RTSP流媒体服务器+FFmpeg转码(推荐)
这个方案不用改动你原有的HTTP MJPEG服务,同时新增RTSP输出能力,步骤如下:
1. 修改docker-compose.yaml
在你现有的配置里新增两个服务:一个轻量的RTSP服务器(rtsp-simple-server),一个专门用来转码推流的FFmpeg容器:
version: '3' services: # 保留你原有的rtsp2mjpg服务(如果还需要HTTP流的话) rtsp2mjpg: image: eroji/rtsp2mjpg restart: always expose: - "8090" volumes: - /etc/localtime:/etc/localtime:ro # - ./ffserver.conf:/etc/ffserver.conf:ro # 保留原配置 environment: RTSP_URL: rtsp://2n:va22ad17.03@192.168.188.52:554/cam/realmonitor?channel=1&subtype=0 FFSERVER_LOG_LEVEL: error FFMPEG_LOG_LEVEL: warning FFMPEG_INPUT_OPTS: -use_wallclock_as_timestamps 1 FFMPEG_OUTPUT_OPTS: -async 1 -vsync 1 healthcheck: test: ["CMD-SHELL", "curl -f http://localhost:8090/still.jpg --max-time 1 --output /dev/null || exit 1"] interval: 15s timeout: 1s retries: 3 logging: driver: "json-file" options: max-size: "10m" max-file: "3" # 保留原有的Nginx服务(如果需要HTTP流的话) nginx: image: nginx:alpine restart: always links: - rtsp2mjpg ports: - "80:80" volumes: - ./nginx/default.conf:/etc/nginx/conf.d/default.conf:ro # 新增RTSP流媒体服务器 rtsp-server: image: aler9/rtsp-simple-server restart: always ports: - "8554:8554" # RTSP默认端口 command: ["--protocols", "tcp"] # 强制用TCP传输,避免丢包 # 新增FFmpeg转码推流服务 ffmpeg-transcode: image: jrottenberg/ffmpeg:4.4-alpine restart: always depends_on: - rtsp-server command: > -i rtsp://2n:va22ad17.03@192.168.188.52:554/cam/realmonitor?channel=1&subtype=0 -vf scale=640:480 # 强制转成640x480分辨率 -f mjpeg # 输出MJPEG格式 -q:v 10 # 画质调整(1-31,数值越小画质越高) -r 15 # 帧率设置为15,匹配你原ffserver的配置 rtsp://rtsp-server:8554/stream.mjpg # 推流到RTSP服务器的流地址 environment: - TZ=Europe/Berlin # 根据你的本地时区调整
2. 测试与配置
- 启动所有服务:
docker-compose up -d - 先用VLC播放器测试RTSP流:输入
rtsp://你的Docker主机IP:8554/stream.mjpg,确认能正常播放640x480的MJPEG流 - 把这个地址配置到2N Verso的外部摄像头设置里即可
方案二:替换rtsp2mjpg为多功能流媒体容器(适合简化配置)
如果你不需要保留原有的HTTP MJPEG流,可以直接用一个支持同时输出HTTP和RTSP的容器,比如aler9/rtsp-simple-server配合内置的转码功能,或者用linuxserver/ffmpeg容器直接处理:
不过方案一更灵活,既能保留原有的HTTP服务,又能新增RTSP输出,更符合你的现有场景。
注意事项
- 确保Docker主机的8554端口没有被其他服务占用,且2N Verso所在的网络能访问到这个端口
- 可以根据2N Verso的具体参数调整FFmpeg的
-q:v(画质)和-r(帧率) - 如果原摄像头的流有认证问题,确认
RTSP_URL里的用户名和密码正确,必要时可以在VLC里先测试原RTSP流的可用性
备注:内容来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

