物联网视频流处理实战:基于SRS与海康摄像头的Windows端到端解决方案

在智能安防和工业物联网场景中,实时视频流的采集与处理一直是技术落地的关键环节。最近接手的一个智慧园区项目中,我们需要将分布在厂区各处的海康威视摄像头视频流实时接入中央管理系统,同时支持至少30天的录像回放功能。经过多轮技术选型,最终采用SRS(Simple Realtime Server)作为流媒体中间件,在Windows服务器上构建了稳定可靠的视频处理管道。这套方案不仅完美解决了RTSP协议与Web播放的兼容性问题,还通过智能分片存储将存储成本降低了40%。本文将完整还原从设备对接到前端播放的全链路实现过程,特别适合需要快速搭建企业级视频监控平台的中高级开发者。

1. 环境准备与设备对接

1.1 硬件与软件基础配置

项目使用的硬件设备是海康威视DS-2CD3系列网络摄像机,支持标准的ONVIF协议和RTSP流输出。服务器端配置如下:

  • 操作系统:Windows Server 2019 Standard
  • CPU:Intel Xeon E-2236 3.4GHz (6核12线程)
  • 内存:32GB DDR4 ECC
  • 存储:2TB NVMe SSD(用于实时流缓存)+ 8TB HDD×4 RAID5(用于录像存储)

注意:虽然SRS官方推荐Linux环境,但实测Windows版本在4核8G以上配置即可稳定处理10路1080P视频流

软件依赖清单:

组件版本用途
SRS5.0.129流媒体协议转换
FFmpeg4.4.1流处理与转码
VLC3.0.16本地流测试
Node.js16.14.2管理后台开发

1.2 摄像头网络配置

首先需要确保摄像头与服务器网络互通,建议采用以下最佳实践:

  1. 为所有摄像头分配固定IP地址(如192.168.1.100-192.168.1.150)
  2. 关闭摄像头的DHCP功能避免IP冲突
  3. 在服务器防火墙开放554(RTSP)、8000(SRS默认HTTP端口)等必要端口
  4. 测试基础连通性:
    Test-NetConnection 192.168.1.100 -Port 554
    

海康摄像头RTSP地址格式通常为:

rtsp://[username]:[password]@[ip]:554/Streaming/Channels/[channel]0[streamtype]

其中streamtype为1表示主码流,2表示子码流。

2. SRS服务部署与优化

2.1 Windows定制化安装

虽然SRS提供标准Windows安装包,但在生产环境中建议采用以下增强方案:

  1. 下载并解压SRS Windows版至C:\SRS(避免中文路径)
  2. 修改配置文件conf/srs.conf关键参数:
    listen              1935;
    max_connections     1000;
    daemon              off;
    srs_log_tank        file;
    srs_log_file        ./objs/srs.log;
    
    http_server {
        enabled         on;
        listen          8080;
        dir             ./objs/nginx/html;
    }
    
    http_api {
        enabled         on;
        listen          1985;
    }
    
  3. 创建启动脚本start_srs.bat:
    @echo off
    set SRS_OPTS=-c conf\srs.conf
    start "SRS Server" objs\srs.exe %SRS_OPTS%
    

2.2 性能调优实战

针对高并发场景,需要调整以下系统参数:

  • 修改Windows TCP/IP参数:
     netsh int tcp set global autotuninglevel=restricted
     netsh interface tcp set global rss=enabled
    
  • 调整SRS工作线程数(需重新编译):
    // src/app/srs_app_worker.hpp
    #define SRS_MAX_WORKERS 16
    
  • 配置日志轮转防止磁盘写满:
    <!-- 在conf/srs.conf中添加 -->
    <srs_log>
        rotate_count     30
        rotate_size      1000000000
    </srs_log>
    

3. 视频流处理全链路实现

3.1 RTSP转HTTP-FLV核心流程

海康摄像头原始流到Web播放的转换路径:

[摄像头] --RTSP--> [FFmpeg] --RTMP--> [SRS] --HTTP-FLV--> [Web播放器]

具体实现命令:

ffmpeg -rtsp_transport tcp -i "rtsp://admin:12345@192.168.1.100/Streaming/Channels/101" -c copy -f flv -an rtmp://localhost:1935/live/camera1

提示:添加-an参数可禁用音频,减少带宽消耗;工业场景中建议使用-preset ultrafast提升转码速度

3.2 多路流负载均衡方案

当需要处理超过20路视频时,可采用分布式架构:

  1. 按区域划分摄像头组(如A区10路→Server1,B区12路→Server2)
  2. 使用Nginx实现SRS集群负载均衡:
    upstream srs_cluster {
        server 192.168.2.100:1935;
        server 192.168.2.101:1935;
    }
    
    server {
        listen 1935;
        proxy_pass srs_cluster;
    }
    
  3. 前端通过不同域名区分集群节点:
    // Player初始化配置
    new FlvPlayer({
        url: `http://srs-group${groupID}.company.com/live/${cameraID}.flv`
    })
    

4. 录像存储与回放系统

4.1 智能分段存储设计

传统连续录像存在三大痛点:检索效率低、存储空间浪费、故障影响范围大。我们的解决方案:

  • 时间分片:每30分钟生成一个录像文件
  • 智能清理:按以下策略自动删除旧文件:
    def cleanup_records(path, max_days=30):
        now = time.time()
        for f in os.listdir(path):
            if f.endswith('.flv'):
                filetime = os.path.getmtime(os.path.join(path, f))
                if (now - filetime) > max_days * 86400:
                    os.remove(os.path.join(path, f))
    
  • 元数据索引:使用SQLite记录录像片段信息:
    CREATE TABLE recordings (
        id INTEGER PRIMARY KEY,
        camera_id TEXT NOT NULL,
        start_time DATETIME NOT NULL,
        end_time DATETIME NOT NULL,
        path TEXT NOT NULL,
        size INTEGER NOT NULL
    );
    

4.2 回放API设计与实现

基于Node.js构建的RESTful API示例:

router.get('/api/recordings', async (ctx) => {
    const { cameraId, start, end } = ctx.query;
    
    const recordings = await db.all(`
        SELECT * FROM recordings 
        WHERE camera_id = ? 
        AND end_time >= ? 
        AND start_time <= ?
        ORDER BY start_time
    `, [cameraId, start, end]);
    
    ctx.body = {
        code: 0,
        data: recordings.map(item => ({
            id: item.id,
            url: `/recordings/${item.path}`,
            start: item.start_time,
            end: item.end_time
        }))
    };
});

前端通过时间轴控件调用该API,实现精确到秒的录像定位:

<div id="timeline" data-camera="camera1"></div>

<script>
timeline.on('select', (start, end) => {
    fetch(`/api/recordings?cameraId=camera1&start=${start}&end=${end}`)
        .then(res => res.json())
        .then(loadSegments);
});
</script>

5. 异常处理与监控体系

5.1 常见故障排查指南

在实际运行中我们总结了以下典型问题及解决方案:

  • 流中断:

    1. 检查摄像头网络状态(ping + RTSP测试)
    2. 验证FFmpeg进程是否存活
    3. 查看SRS日志是否有异常报错
  • 播放卡顿:

    graph TD
      A[卡顿现象] --> B{网络检查}
      B -->|带宽不足| C[降低视频码率]
      B -->|延迟高| D[启用SRS低延迟模式]
      B -->|正常| E[检查播放器缓冲设置]
    
  • 存储异常:

    1. 监控磁盘使用率(建议设置80%告警阈值)
    2. 定期检查文件系统完整性
    3. 实施RAID监控策略

5.2 监控看板实现

使用Prometheus+Grafana构建的监控体系关键指标:

  1. 流健康状态:

    • 在线摄像头数量
    • 每路流的帧率、码率波动
    • 关键进程存活状态
  2. 系统资源:

    # SRS指标导出
    ./objs/srs -c conf/srs.conf --export-metrics 9090
    
  3. 业务指标:

    • 实时观看人数
    • 录像检索响应时间
    • 存储空间使用趋势

这套系统上线后稳定运行了8个月,日均处理视频流超过200小时,最关键的收获是:一定要为每路视频流添加完备的元数据标签,这在后期排查问题时节省了大量时间。另外,Windows平台下的SRS虽然文档较少,但通过适当调优完全能够满足企业级应用的需求。

Logo

火山引擎视频云技术社区,是面向 AI 音视频开发者的技术交流平台。这里汇聚源自抖音、豆包等亿级 DAU 产品的 RTC、直播、点播、AI 媒体处理、音视频互动技术,提供接入指南、最佳实践、性能调优、场景案例、Demo 代码、开源项目、白皮书和 API 文档。社区汇聚官方工程师与一线开发者,为 AI 视频通话、数字人、AI 视频处理等应用的开发与落地提供技术支持。

更多推荐