保姆级教程:用SRS流媒体服务器30秒自动分段录制视频(DVR配置详解)

张开发
2026/5/3 2:26:06 15 分钟阅读
保姆级教程:用SRS流媒体服务器30秒自动分段录制视频(DVR配置详解)
30秒掌握SRS流媒体服务器DVR配置从零搭建自动化视频录制系统直播内容的价值往往在结束后才真正显现——无论是安防监控需要回溯关键画面还是在线教育平台要存档精品课程亦或是电商直播希望沉淀优质内容可靠的视频录制功能都是刚需。SRSSimple RTMP Server作为一款高性能开源流媒体服务器其内置的DVRDigital Video Recorder模块让自动化视频存档变得异常简单。本文将带您深入DVR配置的每个细节避开常见陷阱打造一个稳定高效的录制系统。1. DVR核心参数解析与配置策略SRS的DVR功能通过几个关键参数控制录制行为理解它们的相互作用是避免踩坑的第一步。让我们先看一个基础配置示例vhost __defaultVhost__ { dvr { enabled on; dvr_path /data/recordings/[app]/[stream]/[year]/[month]/[day]/[hour].[minute].[second].[ms].flv; dvr_plan segment; dvr_duration 30; dvr_wait_keyframe on; time_jitter full; } }dvr_plan决定了视频切片策略有两种模式可选session模式整个推流会话保存为单个文件直到推流结束segment模式按固定时长分段存储适合需要定期归档的场景提示安防监控通常选择segment模式以便按时间检索而在线课程录制可能更适合session模式保持内容连贯dvr_duration与segment模式配合使用设置每个切片的目标时长秒。但实际切割点还受下一个参数影响dvr_wait_keyframe是防止视频花屏的关键on等待下一个关键帧再切割确保每个切片都能独立播放off严格按时长切割可能导致切片开头出现花屏参数组合优势风险适用场景dvr_wait_keyframeon无花屏切片时长可能略超设定点播回放dvr_wait_keyframeoff准时切割可能花屏实时分析2. 高级配置时间戳处理与存储优化时间戳抖动time_jitter处理是保证视频同步的关键参数有三个选项time_jitter full; # 完全矫正时间戳 time_jitter zero; # 仅保证从0开始 time_jitter off; # 保留原始时间戳存储路径设计需要考虑文件管理和检索效率。dvr_path支持动态变量/data/[app]/[stream]/[year]/[month]/[day]/[hour]-[minute]-[second].flv常用变量包括[year],[month],[day]: 日期信息[hour],[minute],[second],[ms]: 时间信息注意生产环境建议将录制存储与系统盘分离避免磁盘IO影响服务器性能对于大规模部署可以添加以下优化参数dvr { # 限制单个流的最大录制文件数 dvr_segment_max 1000; # 文件命名添加序列号 dvr_path /data/[stream]/[seq].flv; # 自动清理旧文件 dvr_cleanup on; }3. 生产环境实战配置方案根据不同业务场景推荐以下配置模板安防监控配置平衡存储效率与检索速度vhost surveillance { dvr { enabled on; dvr_plan segment; dvr_duration 60; dvr_wait_keyframe on; time_jitter full; dvr_path /mnt/nas/[year]/[month]/[day]/[stream]-[hour]-[minute].flv; dvr_segment_max 1440; # 保留最近24小时(60*24) } }在线教育配置保证课程完整性vhost education { dvr { enabled on; dvr_plan session; dvr_path /mnt/courses/[app]/[stream]-[year][month][day].flv; time_jitter full; } }直播带货配置高频切片便于剪辑vhost ecommerce { dvr { enabled on; dvr_plan segment; dvr_duration 15; dvr_wait_keyframe on; dvr_path /mnt/recordings/[stream]/[seq].flv; } }4. 常见问题排查与性能优化切片花屏问题通常由以下原因导致关键帧间隔大于切片时长解决方案调整编码器关键帧间隔建议2秒dvr_wait_keyframeoff解决方案始终开启关键帧等待时间戳异常表现为播放器无法seek或音画不同步检查time_jitter设置推荐full确保编码器时间戳稳定磁盘IO瓶颈症状推流延迟增加录制文件写入延迟优化方案# 使用高性能磁盘 mkfs.xfs /dev/sdb -f mount -o noatime,nodiratime /dev/sdb /mnt/recordings # 调整内核参数 echo vm.dirty_ratio 10 /etc/sysctl.conf echo vm.dirty_background_ratio 5 /etc/sysctl.conf sysctl -p监控录制状态可以通过SRS HTTP APIcurl http://127.0.0.1:1985/api/v1/dvrs/典型返回示例{ code: 0, data: { active: true, clients: 3, streams: [ { app: live, stream: camera1, file: /mnt/recordings/live/camera1/1.flv, duration: 28.45 } ] } }5. 扩展应用与存储系统集成对于大规模部署可以考虑以下进阶方案云存储集成以AWS S3为例# 使用s3fs挂载 s3fs my-bucket /mnt/s3 -o passwd_file/etc/passwd-s3fs -o urlhttps://s3.amazonaws.com # 然后配置dvr_path指向/mnt/s3自动化转码流水线import pyinotify import subprocess class EventHandler(pyinotify.ProcessEvent): def process_IN_CLOSE(self, event): if event.pathname.endswith(.flv): subprocess.run([ffmpeg, -i, event.pathname, -c:v, libx264, -preset, fast, event.pathname.replace(.flv,.mp4)]) wm pyinotify.WatchManager() handler EventHandler() notifier pyinotify.Notifier(wm, handler) wdd wm.add_watch(/mnt/recordings, pyinotify.IN_CLOSE) notifier.loop()HLS存档方案兼容性更好vhost __defaultVhost__ { hls { enabled on; hls_path /mnt/hls; hls_fragment 10; hls_window 3600; } }

更多文章