回放之前必须先检索:平台问「这段时间有哪些录像」,设备才答得出「从哪能播」。 它和点播的区别是「要清单」还是「要流」——清单错了,后面怎么播都对不上。
前六节讲的全是「实时」。从这一节开始进历史。 历史比实时多两步:先检索清单,再按清单去回放或下载。 所以这一节是后面两节的前提。
一、检索查的是什么
检索的返回不是「文件列表」,是「时间段列表」:
每条记录给一个开始时间、一个结束时间,平台据此知道「这段可播」。
这一点和直觉不一样:设备里存的是文件,但报出来的是时间区间。
因为「文件怎么切」是设备自己的事,平台只关心「哪段时间有录像」。
所以同一个文件可能被拆成多条记录报出来,也可能多个文件被合并成一条。
判断「有没有录像」只看时间覆盖,别看条数。
记录里还有两个字段容易被忽略:
Secrecy 表示这段录像的密级,Type 表示是定时录还是报警录。
做取证类项目时,这两个字段要落库,否则事后没法证明「这段录像是原始的还是被处理过的」。
二、切分方式决定体验
录像按什么粒度切,直接影响回放的顺滑程度。 按小时切最好索引,但跨小时的片段要拼; 按文件切和设备实际存储对齐,但文件大小不一、结果很乱; 按天切最简单,但一个文件几十 GB,定位极慢。 监控项目最常见的其实是「按事件」:移动侦测触发的录像天然一段一个事件。 听着很合理,实际有个大坑——摄像头前面有棵树的话,风一吹就是几十段。 所以「按事件」必须配合「合并」:相邻两段间隔小于几秒就并成一段, 否则检索结果会多到没法看。 这个合并逻辑不该放在设备端,因为设备只报事实,合并是平台的理解。 放在平台侧,换设备也不用改。
三、检索也要分页
道理和目录查询一样:SumNum 给总数,游标给续查位置。
区别在于记录大小:
一条设备条目九十多字节,一条录像记录一百八十多字节——同样的页大小,报文要大三倍。
所以录像检索的「每页条数」要比目录查询设得更小,常见是二十到五十条。
还有一个实际问题:检索时间段越长,返回越多。
一次查一个月的录像,可能几万条。
所以界面上要限制「最多查几天」,或者按天分组、点哪天查哪天。
四、动手 Demo:一天的录像,检索要返回多少条
造一条真实的录像记录,量它的长度。 再按三种切分方式算一天要返回多少条、报文多大。
item = ("<Item><DeviceID>34020000001320000001</DeviceID>"
"<Name>北门</Name>"
"<StartTime>2026-10-24T00:00:00</StartTime>"
"<EndTime>2026-10-24T01:00:00</EndTime>"
"<Secrecy>0</Secrecy><Type>time</Type></Item>")
print("一条", len(item), "字节")
for name, seg in (("按小时", 1), ("按半小时", 2), ("按事件", 20)):
n = 24 * seg
print(name, n, "条", "%.1f KB" % (len(item) * n / 1024.0))
实跑输出:
--------------------------------------------------------------------
一天的录像,检索要返回多少条
--------------------------------------------------------------------
**回放之前必须先检索**:**平台要问「这段时间里有哪些录像」,设备才答得出来「从哪播」。**
**它和点播的区别是:一个要「流」,一个要「清单」。**
一条录像记录 186 字节
切分方式 一天记录数 返回报文
-----------------------------------------------------------
**按小时切** **24 条** **4.4 KB**
**按半小时切** **48 条** **8.7 KB**
**按事件切(约 20 段)** **480 条** **87.2 KB**
**第一行和第二行差一倍,但都在几 KB**——**所以录像检索不是「量大」的问题。**
**它是「切得太碎反而难播」的问题**:
**一条记录就是一段可播的区间,切得越碎,回放时要切的次数越多。**
**录像切分方式直接影响回放体验**:
切法 好处 坏处
-----------------------------------------------------------------------------
**按小时** **记录少、好索引** **跨小时的片段要拼**
**按文件** **和设备实际文件对齐** **文件大小不一,检索结果乱**
**按事件** **刚好一段一个事件** **事件密时记录爆炸**
**按天** **最简单** **一个文件几十 GB,回放定位慢**
**第三行是监控项目的常态**:**移动侦测触发的录像本来就是「事件驱动」的,天然一段一个事件。**
**但一旦摄像头前面有棵树,风一吹就是几十段,检索结果能到几百条。**
**所以检索也要分页**,道理和目录查询一样:**`SumNum` 给总数,游标给续查位置。**
**只是录像记录比设备条目大得多(186 字节对 91 字节)**,**同样的条数,报文要大三倍。**
一条记录一百八十六字节, 比设备条目(九十多字节)大了一倍——因为多了起止时间和密级、类型这几个字段。 三行结果从 4.4 KB 到 87 KB,看着都不大,但最后一行暴露了真正的问题: 按事件切,一天就有四百八十条,查一个星期就是三千多条。 所以「按事件切」听着最合理,实际最需要合并:间隔小于五秒的相邻段要并成一段, 否则界面上一屏就刷完了。 那张切分对照表的第三行说的就是这件事: 「事件密时记录爆炸」不是理论风险,是装上去第一天就会遇到的现实。
30 秒实验
- 算一下:按小时切,一天几条?(24 条)
- 想一下:检索返回的是「文件列表」还是「时间段列表」?(时间段)
- 想一下:为什么「按事件切」必须配合合并?
常见误区
- 以为「检索返回的是文件列表」。 返回的是时间段,文件怎么切是设备的事。
- 以为「记录条数多说明录像多」。 只看时间覆盖,条数取决于切分粒度。
- 以为「按事件切最精确」。 事件密时记录会爆炸,必须合并。
自测三问(点开对答案)
1. 检索返回的每条记录包含什么? —— **设备编号、起止时间、密级、录像类型**。 2. 为什么录像记录比设备条目大? —— **多了起止时间(各十九个字符)和密级、类型字段**。 3. 「按天切」的坏处是什么? —— **一个文件几十 GB**,回放定位极慢。下一节讲回放:和点播只差一个字面量,但多了一整套播放控制。
- ☐ (本节完,下一节 10.08.08 历史视音频回放)