RTSP 拉流与录制IPC 摄像头本地录像完整方案做 IPC 摄像头、无人售货柜、安防监控RTSP 拉流和录制是基本功。这篇讲清楚怎么稳定拉流、怎么存成文件、怎么按时间分片、断线怎么自动重连、延迟怎么优化——全是实际项目里踩过的坑。大家好我是黒漂技术佬。之前写 IPC 摄像头专栏的时候很多人问 RTSP 拉流的问题拉流花屏怎么办怎么 24 小时录像断网了怎么自动重连录像文件太大怎么办这些问题 FFmpeg 都能解决但参数没配对的话不是不稳定就是延迟高。这篇把我做售货柜项目积累的 RTSP 拉流录制经验全部分享出来。一、RTSP 基础RTSPReal Time Streaming Protocol是网络摄像头最常用的流媒体协议。IPC 摄像头基本上都支持。常见 RTSP 地址格式不同品牌地址不一样常见的# 海康威视rtsp://用户名:密码IP:554/h264/ch1/main/av_stream# 大华rtsp://用户名:密码IP:554/cam/realmonitor?channel1subtype0# 华天龙我项目里用的rtsp://用户名:密码IP:554/stream1# 通用格式rtsp://用户名:密码IP:554/live先测试流能不能打开用 ffplay 先试一下确认地址和账号密码对不对ffplay rtsp://admin:123456192.168.1.100:554/stream1能弹出画面就说明通了。二、最简单的拉流录制直接存成 MP4ffmpeg-irtsp://地址-ccopy output.mp4-c copy直接复制流不重新编码CPU 占用极低。存成 MKV推荐 24 小时录制ffmpeg-irtsp://地址-ccopy output.mkv为什么推荐 MKVMP4 的元数据在文件末尾录制中断断电、断网文件会损坏。MKV 是流式封装断了也能播放前面的内容。 做无人值守的 24 小时录像一律用 MKV 或 TS 格式别用 MP4——哪天断电了录了十几个小时的文件直接废了。三、按时间分片录制24 小时录像存成一个文件太大不方便管理和检索按时间分片每小时一个文件ffmpeg-irtsp://地址-ccopy-fsegment-segment_time3600-strftime1record/%Y%m%d_%H%M%S.mkv-f segment分段输出-segment_time 3600每 3600 秒1小时切一个文件-strftime 1文件名用时间格式%Y%m%d_%H%M%S年月日_时分秒比如20260702_143000.mkv每天一个文件夹 每小时一个文件ffmpeg-irtsp://地址-ccopy-fsegment-segment_time3600-strftime1record/%Y%m%d/%H%M%S.mkv自动按日期建文件夹里面是每小时的文件。重置时间戳分片的时候加上-reset_timestamps 1每个分片的时间戳从 0 开始播放器拖动进度条更准ffmpeg-irtsp://地址-ccopy-fsegment-segment_time3600-reset_timestamps1-strftime1record/%Y%m%d_%H%M%S.mkv四、按大小分片每 100MB 切一个文件ffmpeg-irtsp://地址-ccopy-fsegment-segment_size100M-strftime1record/%Y%m%d_%H%M%S.mkv-segment_size 100M每个文件最大 100MB。实际项目里一般按时间分片为主大小作为辅助限制。五、只录视频 / 只录音频# 只录视频不要音频ffmpeg-irtsp://地址-c:vcopy-anoutput.mkv# 只录音频不要视频ffmpeg-irtsp://地址-vn-c:acopy output.aac-an去掉音频-vn去掉视频。有些摄像头音频有杂音或者不需要录音加上-an省空间。六、拉流参数优化稳定、低延迟默认参数拉流可能会卡、花屏、延迟高调这几个参数。1. 传输协议TCP vs UDP# TCP 传输推荐ffmpeg-rtsp_transporttcp-irtsp://地址...# UDP 传输默认ffmpeg-rtsp_transportudp-irtsp://地址...UDP速度快、延迟低但丢包就花屏TCP可靠不丢包但有延迟网络差的时候会卡实际项目建议用 TCP稳定最重要。售货柜的摄像头我全部用 TCP偶尔网络波动也不会花屏。2. 超时设置ffmpeg-rtsp_transporttcp-stimeout5000000-irtsp://地址...-stimeout 5000000超时 5 秒单位微秒连不上就退出不会一直卡着。3. 缓冲区大小ffmpeg-rtsp_transporttcp-buffer_size1024000-irtsp://地址...网络抖动大的话加大缓冲区减少卡顿。4. 降低延迟做实时预览、远程开门这种需要低延迟的场景ffmpeg-rtsp_transporttcp-fflagsnobuffer-flagslow_delay-irtsp://地址...-fflags nobuffer不缓冲收到就解码-flags low_delay低延迟模式代价是抗抖动能力下降网络不好容易卡。5. 跳过损坏帧流偶尔有坏数据FFmpeg 可能直接报错退出。加上ffmpeg-err_detectignore_err-irtsp://地址...遇到错误忽略继续跑。七、断线自动重连FFmpeg 本身不会自动重连断网了就退出。需要自己写脚本循环。Windows PowerShell 脚本while($true){ffmpeg-rtsp_transport tcp-stimeout 5000000 -irtsp://admin:123456192.168.1.100:554/stream1-ccopy-f segment-segment_time 3600-reset_timestamps 1 -strftime 1record/%Y%m%d_%H%M%S.mkvWrite-Host断线了3秒后重连...Start-Sleep3}Linux / macOS Shell 脚本#!/bin/bashwhiletrue;doffmpeg-rtsp_transporttcp-stimeout5000000\-irtsp://admin:123456192.168.1.100:554/stream1\-ccopy-fsegment-segment_time3600-reset_timestamps1\-strftime1record/%Y%m%d_%H%M%S.mkvecho断线了3秒后重连...sleep3done重连的几个注意点加延迟别立刻重连等个 3-5 秒不然网络还没恢复又失败加超时-stimeout必须加不然卡着不动日志记录生产环境把输出写到日志文件方便排查问题分段文件名用时间戳重连后不会覆盖之前的文件八、边录边转码降低存储占用直接-c copy存的是摄像头原始码流可能码率很高、占空间大。如果存储空间紧张可以边拉边转码压缩。H.264 压缩录制ffmpeg-irtsp://地址-vcodeclibx264-crf28-acodecaac-b:a64k-fsegment-segment_time3600record/%Y%m%d_%H%M%S.mp4代价是 CPU 占用高需要机器性能够。硬件加速录制RK3588 推荐售货柜用的 RK3588硬编码几乎不占 CPUffmpeg-irtsp://地址-vcodech264_rkmpp-b:v1M-acodeccopy-fsegment-segment_time3600record/%Y%m%d_%H%M%S.mp4硬件加速后面专门一篇细讲。九、拉流 实时抽帧不存视频只需要定时抽帧做 AI 识别不需要存录像ffmpeg-rtsp_transporttcp-irtsp://地址-vffps1frames/%04d.jpg售货柜项目里待机状态就每秒抽一帧跑 YOLO 检测有人拿东西的时候才触发完整识别流程。抽帧 推流同时进行一边存文件一边抽帧做分析用 tee 或者 filter_complex 分流。十、多路摄像头同时录制多个摄像头写个脚本循环启动或者一条命令多个输入ffmpeg\-irtsp://摄像头1地址\-irtsp://摄像头2地址\-map0-ccopy-fsegment-segment_time3600cam1/%Y%m%d_%H%M%S.mkv\-map1-ccopy-fsegment-segment_time3600cam2/%Y%m%d_%H%M%S.mkv-map 0选第一个输入-map 1选第二个分别输出。但更推荐每个摄像头单独起一个 FFmpeg 进程——一路挂了不影响其他路也好管理。十一、实际踩过的坑坑 1录制的 MP4 文件损坏打不开原因MP4 的 moov atom 在文件末尾异常退出没写进去。解决用 MKV 或 TS 格式录制或者录制完后用ffmpeg -i input.mp4 -c copy fixed.mp4修复。坑 2花屏、绿屏、马赛克原因UDP 丢包或者关键帧间隔太大。解决改用 TCP 传输-rtsp_transport tcp摄像头设置里把关键帧间隔改小比如 1 秒一个 I 帧坑 3延迟越来越大原因FFmpeg 默认有缓冲累积延迟。解决加-fflags nobuffer -flags low_delay -framedrop丢帧保延迟。坑 4音视频不同步原因摄像头的时间戳有问题或者网络抖动。解决加-vsync cfr统一视频帧率或者-async 1校正音频。坑 5FFmpeg 进程挂了没人知道解决写个守护脚本进程没了自动拉起来定期检查录像文件有没有更新生产环境配合监控告警十二、我项目里用的完整命令售货柜 IPC 摄像头 24 小时录制的完整命令ffmpeg-rtsp_transporttcp\-stimeout10000000\-err_detectignore_err\-irtsp://admin:密码192.168.1.200:554/stream1\-ccopy\-fsegment\-segment_time1800\-segment_formatmatroska\-reset_timestamps1\-strftime1\/data/record/cabinet01/%Y%m%d/%H%M%S.mkv参数说明TCP 传输10 秒超时忽略错误继续运行每 30 分钟一个文件MKV 格式断电不损坏按日期建文件夹文件名带时间戳外面再套一层自动重连的脚本稳定跑几个月没问题。十三、本篇小结录制优先用 MKV 格式异常退出不损坏-c copy直接复制流CPU 占用最低-f segment按时间/大小分片方便管理-rtsp_transport tcp更稳定UDP 延迟低但易花屏断线重连需要自己写脚本循环生产环境超时 错误忽略 自动重连 日志监控下一篇讲HLS/DASH 切片直播和点播的切片生成怎么把视频转成 m3u8 放到网页上播放。我是黒漂技术佬。