1.5TB监控视频大迁移:从百度网盘到夸克网盘的自动化之旅
背景
我装了海康威视的监控摄像头,视频会自动同步到海康的 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 大空间) │
└──────────────┘
核心设计思路
按天合并,告别碎片
监控视频的目录结构是按月份和小时组织的,一天可能有几十个文件。脚本会自动:
- 按天分组(跨目录聚合)
- 按时间戳排序
- 用 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 月的数据,分散在 201512 和 202512 两个目录中)。脚本需要跨目录聚合并按文件名去重。
3. pcm_alaw 音频编码
海康摄像头的视频使用了 pcm_alaw 音频编码,这是电话系统常用的编码格式。MP4 容器不支持这个编码,ffmpeg 会报错。改用 MKV 容器后解决。
4. dlink 有效期只有 8 小时
百度网盘的下载链接(dlink)有效期只有 8 小时。如果一天的视频量很大,下载到后面时前面获取的链接可能已经过期。目前没有遇到这个问题,但代码中预留了 token 刷新机制。
最终效果
- 碎片整理:几万个碎片文件 → 每天一个完整视频
- 加密保护:AES-256 加密,即使网盘被入侵也无法查看内容
- 存储成本:从百度网盘的高价空间迁移到夸克 6TB 大空间
- 自动化:一行命令开始处理,处理完一天暂停等上传,全程无需盯着
整个 1.5TB 的迁移大概需要几天时间(主要瓶颈在下载和上传的网速),但好在脚本是幂等的——随时可以中断,随时可以继续。
写在最后
这个需求说到底就是一个「中转站」的问题。海康的 NAS 只支持百度网盘,而百度网盘的存储成本太高。如果海康能直接支持夸克网盘的同步,这一切都不需要。
不过换个角度想,这次折腾也不完全是坏事。经过按天合并和加密压缩后,视频的管理变得更加整洁有序了,比原来几万个碎片文件强多了。
总之数据先存下来,万一将来可以弄点什么呢,也许世界都是虚拟的,都是数据也不一定…
技术栈总结:
- Python:脚本主体
- 百度网盘开放平台 API:OAuth2.0 设备码授权 + 文件列表 + 下载 百度网盘开放平台简介
- ffmpeg:concat demuxer 无损拼接
- 7z:AES-256 加密压缩