1. 数据建模
1.1 Redis 数据结构
Redis 中的哈希表存储了每条记录的详细信息,字段名是时间戳(如 20250405084325),值是 JSON 格式的字符串。
时间戳(如 20250405084325),值是 JSON 格式的字符串。
以下是 Redis 数据的建模:
键名:
cloudrecord:<serial>_<code>
<serial>:设备序列号。
<code>:设备代码。
字段名:
时间戳(格式为 YYYYMMDDHHMMSS)
值:
JSON 数据对象,包含以下字段:
Json
{
"ID": "34020000001320000007_34020000001320000007",
"Name": "34020000001320000007_34020000001320000007",
"Day": "20250405",
"StartTime": "20250405084325",
"SMS": "34020000002020000001",
"Host": "10.27.243.174",
"WanIP": "59.110.70.175",
"HTTPPort": 10001,
"HTTPSPort": 0,
"Duration": 47.739,
"Important": false,
"Hevc": false,
"M3u8URL": "http://59.110.70.175:10001/record/..."
}
1.2 视频片段文件结构
视频片段文件通过 M3u8URL 地址下载,存储在本地临时目录中。文件名格式如下:
<temp_dir>/segment_<index>.ts
最终合并的视频文件存储在指定输出目录:
<output_dir>/<serial>_<period>.mp4
2. 数据流设计
2.1 数据输入
API 请求参数:
serial:设备序列号。
code:设备代码。
period:日期(格式为 YYYYMMDD)。
Redis 查询:
根据 serial 和 code 构造 Redis 键名。
使用 HSCAN 命令扫描符合日期条件的字段。
2.2 数据处理
解析 JSON 数据:
将 Redis 返回的 JSON 字符串解析为结构体。
提取关键字段(如 StartTime、Duration、M3u8URL 等)
下载视频片段:
遍历记录列表,每个 M3u8URL 对应的视频片段。
将片段保存到临时目录。
合并视频片段:
合并片段为完整的 MP4 文件。
2.3 数据输出
生成的视频文件: 存储路径:<output_dir>/<serial>_<period>.mp4。
提供下载链接或直接返回文件内容。
3. 数据存储
3.1 Redis 数据存储
存储方式:每条记录存储为 Redis 哈希表的一个字段。
字段名为时间戳 (格式为 YYYYMMDDHHMMSS),
值为 JSON 数据,包含以下字段:
Json
{
"ID": "34020000001320000007_34020000001320000007",
"Name": "34020000001320000007_34020000001320000007",
"Day": "20250405",
"StartTime": "20250405084325",
"SMS": "34020000002020000001",
"Host": "10.27.243.174",
"WanIP": "59.110.70.175",
"HTTPPort": 10001,
"HTTPSPort": 0,
"Duration": 47.739,
"Important": false,
"Hevc": false,
"M3u8URL": "http://59.110.70.175:10001/record/..."
}
Redis 配置
bind 127.0.0.1
protected-mode yes
port 26379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised no
pidfile /var/run/redis_26379.pid
loglevel notice
logfile "redis.log"
databases 16
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir ./
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
replica-priority 100
requirepass livegbs@2019
maxclients 10000