RTSP流音视频存储:无法同时实现分片、推流及音视频同存问题咨询
解决RTSP流同时分片、推流、存储完整文件的方案
嘿,这个问题我之前做流媒体项目的时候刚好解决过!其实不用纠结“单个命令能不能同时完成这三个任务”——ffmpeg的多路输出能力完全能搞定,而且配置起来也不复杂。下面给你详细的实现方案:
核心思路
用ffmpeg读取一次RTSP源流,然后创建三个独立的输出分支,分别对应你的三个需求:存储完整文件、按时间分片、推流到目标地址。这样只需要拉取一次流,避免重复拉流带来的带宽浪费和性能损耗。
完整命令示例(以每10分钟分片为例)
假设你的RTSP源地址是rtsp://your_camera_ip/stream,推流目标地址是rtsp://push_server/live/stream,执行以下命令即可同时完成三个任务:
ffmpeg -rtsp_transport tcp -i rtsp://your_camera_ip/stream \ # 分支1:存储完整音视频文件 -c:v copy -c:a copy full_stream.mp4 \ # 分支2:每10分钟(600秒)分片存储 -c:v copy -c:a copy -f segment -segment_time 600 -reset_timestamps 1 -segment_format mp4 segment_%03d.mp4 \ # 分支3:推流到目标地址 -c:v copy -c:a copy rtsp://push_server/live/stream
参数解释
-rtsp_transport tcp:强制用TCP协议拉取RTSP流,比UDP更稳定,适合丢包率较高的网络环境,避免流中断-c:v copy -c:a copy:直接复制源流的音视频编码,不做转码,最大化节省CPU资源(如果推流服务器要求特定编码,比如H.264 Baseline,就需要替换成对应的编码命令,比如-c:v libx264 -profile:v baseline -level 3.0 -c:a aac)- 分片分支参数:
-f segment:启用分片复用器-segment_time 600:设置分片时长为600秒(10分钟,你可以改成任意n*60的值)-reset_timestamps 1:让每个分片的时间戳从0开始,避免播放器播放分片时出现时间轴混乱segment_%03d.mp4:分片文件命名格式,%03d表示用三位数字递增编号(比如segment_001.mp4、segment_002.mp4)
- 推流分支:直接把复制后的流推送到目标地址,格式支持RTSP、RTMP、HLS等主流协议
额外注意事项
- 如果需要分片格式支持无缝拼接(比如后续要合并分片),可以把
-segment_format mp4改成mpegts,TS格式天生支持无缝拼接,不需要额外处理 - 可以添加
-reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 5参数,让ffmpeg在RTSP流中断时自动尝试重连,最多等待5秒 - 若日志输出太冗余,可加上
-hide_banner -loglevel warning来精简日志,只显示警告和错误信息
内容的提问来源于stack exchange,提问作者Utsav vats
相关产品推荐
相关产品推荐

