📹 第五章 FFmpeg二次开发IPC视频监控
📄 一句话概括

总体设计就是一道算术题:路数、码率、天数进去,硬盘数、带宽、设备数出来。 难点不是算,是「按块买」带来的台阶效应。

📝 本节和前面几节的关系

上一节讲结构,这一节讲怎么把这套结构算成报价单。 存储细节(RAID、循环覆盖)在下一节,这一节只算总量。

一、三个输入,三个输出

输入 典型值 谁定
路数 8/16/64 点位表
码率 2~4 Mbps(1080p) 画质要求
天数 30/90 甲方要求或行业规范
输出 怎么算 用途
硬盘容量 路数 × 码率 × 天数 报价主体
上行带宽 路数 × 码率 交换机/专线选型
NVR 台数 路数 ÷ 单机路数 机柜空间

注意上行带宽那一行:它等于「所有路数之和」,因为每路摄像头都要把自己的流推给 NVR。 16 路 4 Mbps 就是 64 Mbps。

二、台阶效应:容量涨三倍,盘数不一定涨三倍

路数 码率 天数 原始容量 硬盘数
8 4 Mbps 30 10.4 TB 3 块 8 TB
16 4 Mbps 30 20.7 TB 4 块 8 TB
16 4 Mbps 90 62.2 TB 9 块 8 TB
64 2 Mbps 30 41.5 TB 7 块 8 TB

第二行和第三行对比:同样 16 路,天数从 30 变 90, 容量正好三倍(20.7 → 62.2 TB),但硬盘从 4 块涨到 9 块,只涨了 2.25 倍。 因为盘是整块买的,凑的是「能装下」的最小盘数。 这就是台阶效应:容量涨三倍,盘数不一定涨三倍,但绝不会少。 做预算按「容量 ÷ 单盘」估会低估,必须按块取整再算 RAID。

三、四个系数,实际要买 1.5 倍

系数 典型值 说明
码率余量 +20% CRF 模式码率会波动,按峰值留
RAID5 开销 −1/n 4 块盘只能当 3 块用
格式化损耗 −7% 标称 TB 是十进制,系统显示 TiB
预留空间 −10% 盘写满会掉速

四个系数叠起来要买 1.5 倍(1.2 ÷ 0.8 ÷ 0.93 ÷ 0.9 ≈ 1.79)。 报「需要 20 TB」就买 20 TB 的项目,一定会在验收前发现不够。 这四项里最容易被忽略的是第三项——硬盘标的是 TB,操作系统显示的是 TiB,差 9%。

四、带宽要分方向

场景 要算的带宽 为什么
本地 NVR 存 上行 = 全部路数之和 每路都要推上去
远程看一路 下行 = 一路码率 只看一路
总控中心看全部 上行 = 全部路数之和 要专线

第三行最容易翻车:16 路 4 Mbps 就是 64 Mbps 上行, 家用宽带的上行一般只有 30~50 Mbps,直接不够。 所以远程集中看的项目要在前端做子码流:主码流存本地,子码流(几百 kbps)送去中心看。

五、动手 Demo:给一个 16 路 30 天的项目做容量规划

Demo 写一个小规划器:输入路数、码率、天数,输出硬盘、容量、带宽、NVR 台数。 四组配置一起跑,可以横向比。

def plan(cams, mbps, days, disk_tb=8.0, raid="5"):
    raw = cams * mbps / 8.0 * 86400 * days / 1e6      # TB
    n_disk = max(3, int(ceil(raw / disk_tb)) + 1)      # RAID5 要多一块
    eff = disk_tb * (n_disk - 1)
    bw = cams * mbps
    return raw, n_disk, eff, bw
for cfg in [(8,4,30), (16,4,30), (16,4,90), (64,2,30)]:
    print(cfg, plan(*cfg))

实跑输出:

--------------------------------------------------------------------
给一个 16 路 30 天的项目做容量规划
--------------------------------------------------------------------
**这一节写一个小工具:输入路数、码率、天数,输出硬盘数、带宽、NVR 台数。**
  **全部由代码算,改一个输入就能重算一遍。**

  路数  码率      天数    原始容量    硬盘数      有效容量    上行带宽
  --------------------------------------------------------------------------
  8     4 Mbps    30      10.4 TB     3 块 8 TB   16.0 TB     32 Mbps
  16    4 Mbps    30      20.7 TB     4 块 8 TB   24.0 TB     64 Mbps
  16    4 Mbps    90      62.2 TB     9 块 8 TB   64.0 TB     64 Mbps
  64    2 Mbps    30      41.5 TB     7 块 8 TB   48.0 TB     128 Mbps

  **第二行和第三行对比着看**:同样 16 路,天数从 30 变 90,
  **容量正好三倍(20.7 → 62.2 TB),但硬盘从 4 块涨到 9 块,只涨了 2.25 倍。**
  **因为盘是整块买的,凑的是「能装下」的最小盘数**。
  **这就是台阶效应:容量涨三倍,盘数不一定涨三倍,但绝不会少。**
  **做预算时按「容量 ÷ 单盘」估会低估**,必须按块取整再算 RAID。

**几个容易被忽略的系数:**

  系数              典型值      说明
  ------------------------------------------------------------------
  码率余量          +20%        CRF 模式下码率会波动,按峰值留
  RAID5 开销        −1/n        4 块盘只能当 3 块用
  格式化损耗        −7%         标称 TB 是十进制,操作系统显示 TiB
  预留空间          −10%        盘写满会掉速,留一点余量

  **四个系数叠起来要买 1.8 倍**(1.2 ÷ 0.8 ÷ 0.93 ÷ 0.9 = 1.79)。
  **做方案时报「需要 20 TB」然后买 20 TB,一定会不够**——**按 1.8 倍算是 36 TB。**

**带宽这一列也要说清方向**:

  场景                    要算的带宽            为什么
  --------------------------------------------------------------------------
  本地 NVR 存             上行(摄像头 → NVR)  每路都要推上去
  远程看一路              下行(NVR → 客户端)  只看一路就够
  总控中心看全部          上行 = 全部路数之和   要专线

  **第三行最容易翻车**:16 路 4 Mbps 就是 64 Mbps 上行,
  **家用宽带的上行一般只有 30~50 Mbps,直接不够。**
  **所以远程集中看的项目,往往要在前端做「子码流」**。
  **主码流存本地,子码流(几百 kbps)送去中心看。**

max(3, ...) 那个 3 是 RAID5 的最小盘数——两块盘做不了 RAID5,这个下限必须写进代码, 否则小项目会算出 2 块。 「有效容量」那一列是 RAID 之后的,比原始容量大一点(因为多买了一块盘), 这就是台阶效应看得见的地方。

30 秒实验

  1. 把 disk_tb 改成 16,重跑,看硬盘数怎么变(不是简单减半)。
  2. 把 RAID 改成 6,看有效容量少多少。
  3. 给 raw 乘 1.2 的余量,重跑,对比硬盘数变化。

常见误区

  1. 以为盘数 = 容量 ÷ 单盘。 要按块取整、再算 RAID,台阶效应会让结果差一整块。
  2. 以为带宽只算下行。 摄像头到 NVR 是上行,而且等于所有路数之和。
  3. 以为按原始容量买盘就行。 四个系数叠起来要 1.5 倍,不留余量一定不够。
自测三问(点开对答案) 1. 为什么 16 路 90 天的盘数不是 30 天的三倍? —— 因为盘整块买、按最小盘数取整。**容量涨三倍,盘数只涨 2.25 倍**,但绝不会更少。 2. RAID5 至少要几块盘? —— 3 块。**两块盘做不了 RAID5**,代码里要用 `max(3, ...)` 兜住。 3. 16 路 4 Mbps 的上行带宽是多少? —— 64 Mbps。**每路都要推上去,所以是相加,不是取最大。**

下一节钻到存储里:标称 4 TB 到底能存多少天。

相关笔记