先说说ICAM365这事儿
你有没有过这种经历——监控摄像头拍到了猫跳上冰箱的搞笑画面,或者小区快递被错拿的关键几分钟,结果想下载回放视频的时候,发现ICAM365官方App里那个下载按钮总是不太灵光?我就是,上个月我家门口快递柜的摄像头录到有人乱翻包裹,我着急要那段录像,结果App点半天只给我转圈圈。
ICAM365这玩意吧,说白了就是海康威视旗下那套云监控方案,画质凑合,功能也够用,但你要说下载回放视频,那体验是真的拉胯,官方App限速、动不动断连,有时候明明显示了“下载中”,三小时后一看进度条才走到30%,我寻思着,这事儿不能忍。
我掏出了Go语言,对,就是那个编译快、并发强、写起来像写诗一样的语言,花了一个周末,写了个小工具——能直接通过ICAM365的API把回放视频拽下来,效果?真香。
为什么我不用官方方法?
先别急,我不是来劝退ICAM365的,这软件其实挺靠谱,监控画面清晰,夜视模式也不拉胯,但问题出在回放下载这个环节上:
- App限制:免费用户每天只能下3段,每段最长5分钟,你要录了个半小时的长视频?分段下,然后自己拼接。
- 网络波动:ICAM365的服务器肯定做了限流,高峰期下载速度能掉到几十KB/s,等它下完,黄花菜都凉了。
- 格式问题:下载下来的虽然大多是MP4,但码率被压得厉害,有时候1080p的画面看着像720p。
我琢磨着,官方不给力,那就自己来呗,Go语言处理这类网络请求和文件流简直是绝配——并发协程、轻量级、内存管理还省心。

先搞明白ICAM365的回放机制
在动代码前,我干了一件事——抓包,用Fiddler把ICAM365 App和服务器之间的通信全录了下来,结果我发现,它其实用的是RESTful API,请求头里带一个access_token,回放视频的地址是通过一个叫/api/v1/playback/url的接口拿到的。
基本流程是这样的:
- 登录:用用户名密码换
token。 - 获取设备列表:拿到你账号下所有摄像头的ID。
- 请求回放地址:指定摄像头ID和时间段,服务器返回一个临时有效的视频流URL(通常是HLS格式的
.m3u8文件)。 - 下载转码:那个
.m3u8文件指向一堆.ts小片段,需要把它们合并成一个完整的MP4。
这套流程不复杂,但官方App处理得磨磨叽叽,我自己来写,反而能控制每一步。
Go代码怎么搞?说人话版
我写的这个工具叫icam-dl,核心就干了三件事:
登录拿Token
这步最简单,发个POST请求到https://api.icam365.com/v1/auth/login,带上{"username":"你的手机号","password":"密码"},服务器会返回一个JSON,里面有个data.token字段。
我用的是Go的net/http包,加上encoding/json解析返回数据。关键点:记得把Token存到配置里,不然每次运行都得重新登录,烦得很。
获取设备列表和回放URL
登录成功后,拿Token去请求/api/v1/devices,返回的JSON里有每个摄像头的deviceUuid和deviceName,然后组合参数:deviceUuid、startTime(格式2025-03-01T14:00:00)、endTime、channelNo(一般是1)。
这一步最坑的是时间处理,ICAM365的时间必须是UTC+8,格式严格到毫秒级,我一开始没注意,传了个本地时间,结果服务器一直返回“无效时间段”,调试了一个小时才发现,时间格式必须用time.RFC3339还要带时区。
startTime := time.Date(2025, 3, 1, 14, 0, 0, 0, time.FixedZone("CST", 8*3600))
下载并合并视频流
拿到回放URL后,我发现它返回的是一个.m3u8播放列表,文件内容类似这样:
#EXTM3U
#EXT-X-TARGETDURATION:10
#EXTINF:10.000,
segment_001.ts
#EXTINF:10.000,
segment_002.ts
这玩意得逐行解析,提取出所有.ts文件的URL,然后并发下载,Go的goroutine加sync.WaitGroup搞这个太顺手了——开个10个协程,每个负责下载一段,速度直接拉满。
最后用ffmpeg把.ts合并成MP4,我懒得自己写MP4封装器,直接调os/exec执行ffmpeg命令:
ffmpeg -i "concat:segment_001.ts|segment_002.ts|..." -c copy output.mp4
当然,你得先装个ffmpeg,但考虑到绝大数人都有这个需求,我直接在GitHub Release里打了个包,免安装,双击跑。
使用时踩过的坑(别问我怎么知道的)
写这工具花了两天,调试用了三天,有些坑不吐不快:
- Token过期:ICAM365的Token有效期大概24小时,我一开始没做自动续期,结果每次下到一半Token过期,代码报401,后来加了个检查,如果返回401就重新登录获取Token,继续下载。
- 网络断开重试:下载
.ts片段时,偶尔会碰到请求超时,我用了retryablehttp库,加了个最多3次重试,间隔2秒。 - 路径中文字符:Windows下视频保存路径带中文会出问题,还好Go在处理UTF-8文件名上有天然优势,只要
os.Create的时候用path.Join指定全路径就行。
真实的试用场景
工具写好后,我用它下了三段回放视频。
第一段是门口的快递被拿错(时长12分钟),官方App下到一半卡住,我用icam-dl选好时间段,全程花了1分20秒就拿到完整的MP4,清晰度比我预想的好,第二段是小区停车场入口的纠纷(时长27分钟),分段下载后自动合并,一气呵成,第三段是逗猫的搞笑镜头(时长3分钟),这个本来官方App也能下,但我不想折腾了——直接一行命令。
icam-dl -device "门口猫眼" -start 2025-03-01T15:00:00 -duration 5 -output cat.mp4
搞定。真·一句话的事。
代码之外的感悟
我不是专业的监控工程师,就是觉得这事儿能自动化就自动化。ICAM365的官方App不是不好,它满足了90%人的90%需求,但剩下那10%——比如你要批量下载、要在特定时间点精确裁剪、要在没有WiFi的地方用4G网络下载——官方就不太行了。
Go语言在这类场景下是真顺手。编译成单文件,扔到任何Windows、Linux、macOS机器上都能跑,不需要装Python环境、不需要管依赖冲突,我甚至把它交叉编译到树莓派上,插个SSD就能当下载服务器。
顺带一提,这工具目前只有命令行界面,我本来想加个GUI的,但想到fyne或者wails还得学,就搁置了。不完美但够用,这就是我喜欢的风格。
最后说句实在的
如果你也在用ICAM365,嫌弃官方下载功能,可以试试我这个思路,不用非得用我的代码——你完全可以自己抓包分析,用任何语言实现,但如果你懒,又懂点Go,那这工具值得你折腾半小时。
回放视频这东西,有时候就是一瞬间的事。对了,下完的视频最好看一眼——上次我下了一段门口的视频,结果发现画面右上角有个蜘蛛在织网,比快递被投递的镜头还有意思。
工具不完美,但能解决问题,就跟生活一样,凑合凑合,也挺好。
本文来自作者[kyadmin]投稿,不代表be365立场,如若转载,请注明出处:http://www.uss1.cn/fnagchan/1617.html
评论列表(4条)
我是be365的签约作者“kyadmin”!
希望本篇文章《ICAM365下载回放视频,我用Go语言写了个小工具,结果真香了》能对你有所帮助!
本站[be365]内容主要涵盖:be365,be365网站,be365网址,ball365体育,Be365排名
本文概览:先说说ICAM365这事儿你有没有过这种经历——监控摄像头拍到了猫跳上冰箱的搞笑画面,或者小区快递被错拿的关键几分钟,结果想下载回放...