背景

我装了海康威视的监控摄像头,视频会自动同步到海康的 NAS 上。NAS 自带云存储同步功能,但问题来了——海康只支持同步到百度网盘,没有夸克网盘的插件。

这在数据量小的时候不是问题,但当监控视频积累到 1.5TB 之后,存储成本就成了一个不得不面对的现实:

网盘 容量 年费(大约)
百度网盘 6TB (免费2TB) 178
夸克网盘 6TB 88vip

夸克的性价比太高了,6TB 容量的会员价格只有百度的零头。所以我决定:把百度网盘里的监控视频全部迁移到夸克网盘

痛点

看似简单的「搬家」,实际操作起来发现坑不少:

1. 没有直接迁移工具

市面上没有「百度网盘 → 夸克网盘」的一键迁移工具。两个平台之间没有互通的 API,只能走「下载到本地 → 再上传」的笨办法。

2. 本地硬盘空间有限

MacBook 的硬盘剩余空间只有几十 GB,而要迁移的数据有 1.5TB。不可能一次性全部下载,只能分批处理。

3. 视频文件碎片化严重

监控摄像头的录像策略是按时间段自动分割的,一天的视频可能被切成几十个甚至上百个小片段。直接搬过去的话,夸克网盘里会充斥着数万个几 MB 的碎片文件,根本没法管理。

4. 数据安全

监控视频属于隐私数据,上传到云端还是希望有一层加密保护。

解决方案

最终我用 Python 写了一套自动化脚本,整个流程如下:

百度网盘 API 下载 → 按天合并 → 加密压缩 → 手动上传夸克

架构设计

┌─────────────────┐     API      ┌──────────────┐
│  百度网盘        │ ──────────→  │  本地 Mac     │
│  (海康NAS同步)   │   下载视频    │              │
└─────────────────┘              │  ffmpeg 合并  │
                                 │  7z 加密压缩  │
                                 └──────┬───────┘
                                        │ 手动上传
                                        ▼
                                 ┌──────────────┐
                                 │  夸克网盘     │
                                 │  (6TB 大空间)  │
                                 └──────────────┘

核心设计思路

按天合并,告别碎片

监控视频的目录结构是按月份和小时组织的,一天可能有几十个文件。脚本会自动:

  1. 按天分组(跨目录聚合)
  2. 按时间戳排序
  3. 用 ffmpeg 的 concat demuxer 无损拼接

关键参数:ffmpeg -f concat -safe 0 -i filelist.txt -c copy output.mkv

-c copy 意味着只做数据复制,不重新编码。一天几百个文件的合并只需要几秒钟,而且视频质量零损耗。

这里有个小坑:监控摄像头使用了 pcm_alaw 音频编码,这个编码不被 MP4 容器支持。最终改用了 MKV 容器,它能兼容几乎所有编解码器。

加密压缩

使用 7z 的 AES-256 加密,存储模式(不压缩):

7z a -p'密码' -mhe=on -mx0 output.7z input.mkv
  • -mhe=on:加密文件名(攻击者连文件名都看不到)
  • -mx0:存储模式,不再压缩(视频本身已经是压缩格式,再压缩只会浪费时间,体积几乎不变)

磁盘空间精算

由于本地硬盘空间有限,脚本在处理每一天之前会精确计算:

  • 通过百度网盘 API 获取每个文件的精确大小
  • 计算峰值磁盘占用(下载 + 合并的瞬间约为原始大小的 2 倍)
  • 空间不足时直接报错,显示缺少多少 GB,手动清理后重跑

断点续传 + 状态记录

  • 下载支持 HTTP Range 断点续传,网络中断后重跑不需要从头开始
  • 每处理完一天就写入状态文件,下次运行自动跳过已完成的日期
  • 处理完一天后暂停,等手动上传到夸克后按回车继续

两种视频的差异处理

家里的监控分室内和室外两组摄像头,目录结构完全不同,所以写了两个独立的脚本:

室内视频:按月/小时目录组织,文件名包含时间戳

室内视频/202605/2026053123/25M54S_1780241154.mp4

→ 合并输出:室内/2026/05/20260531.mkv

室外视频:按月份直接放文件,文件名包含摄像头编号和起止时间

室外视频/202605/00_20260516143213_20260516154752.mp4

→ 合并输出:室外/2026/05/00_20260516.mkv

室外视频还有个特殊点:有两组摄像头(00 和 10),合并时按摄像头分别处理,输出文件名保留前缀。

踩过的坑

1. 百度网盘 API 的 folder_only 模式

API 有个 folder=1 参数号称「只返回文件夹」,但实际上在这个模式下只返回 path 字段,其他所有属性(包括文件名、大小、isdir)都不返回。排查了好一会儿才发现这个坑。

2. 目录命名混乱

由于历史原因,部分月份目录的命名不规范(比如同样是 2025 年 12 月的数据,分散在 201512202512 两个目录中)。脚本需要跨目录聚合并按文件名去重。

3. pcm_alaw 音频编码

海康摄像头的视频使用了 pcm_alaw 音频编码,这是电话系统常用的编码格式。MP4 容器不支持这个编码,ffmpeg 会报错。改用 MKV 容器后解决。

百度网盘的下载链接(dlink)有效期只有 8 小时。如果一天的视频量很大,下载到后面时前面获取的链接可能已经过期。目前没有遇到这个问题,但代码中预留了 token 刷新机制。

最终效果

  • 碎片整理:几万个碎片文件 → 每天一个完整视频
  • 加密保护:AES-256 加密,即使网盘被入侵也无法查看内容
  • 存储成本:从百度网盘的高价空间迁移到夸克 6TB 大空间
  • 自动化:一行命令开始处理,处理完一天暂停等上传,全程无需盯着

整个 1.5TB 的迁移大概需要几天时间(主要瓶颈在下载和上传的网速),但好在脚本是幂等的——随时可以中断,随时可以继续。

写在最后

这个需求说到底就是一个「中转站」的问题。海康的 NAS 只支持百度网盘,而百度网盘的存储成本太高。如果海康能直接支持夸克网盘的同步,这一切都不需要。

不过换个角度想,这次折腾也不完全是坏事。经过按天合并和加密压缩后,视频的管理变得更加整洁有序了,比原来几万个碎片文件强多了。

总之数据先存下来,万一将来可以弄点什么呢,也许世界都是虚拟的,都是数据也不一定…

技术栈总结:

  • Python:脚本主体
  • 百度网盘开放平台 API:OAuth2.0 设备码授权 + 文件列表 + 下载 百度网盘开放平台简介
  • ffmpeg:concat demuxer 无损拼接
  • 7z:AES-256 加密压缩