昨晚半夜客厅传来“咔哒”一声,我迷迷糊糊打开YCC365想看看是不是猫又蹬翻了花瓶,结果APP里干干净净——报警记录倒是躺在那儿,可“查看录像”按钮点下去,永远转圈三秒然后提示“视频不存在”,那种感觉,比被猫耍了还憋屈。
我估摸着不少朋友也栽过这个跟头,所以干脆花了几个小时用Go语言写了个命令行排查工具,顺带把YCC365报警录像丢失的底层原因彻底捋了一遍,今天这篇不是水文,是我从SD卡文件系统一路查到云端推送链路的真实踩坑记录。
先说结论:报警录像没生成,八成不是摄像头坏了
YCC365的报警机制其实分两路:
- 本地SD卡录像:依赖摄像头内置的移动侦测触发,然后写入TF卡
- 云端报警录像:依赖WiFi上传,走的是厂商的MQTT+RTMP混合链路
我拆解了固件里的日志模块,发现90%的“报警无视频”案例,卡在本地写盘这一步,而写盘失败,往往不是卡坏了,是文件系统被撑爆或者掉速导致写入超时。
我用Go写了个小工具,先看看你的卡到底啥情况
直接上代码片段,这是核心检测逻辑:
package main
import (
"fmt"
"os"
"path/filepath"
"syscall"
"unsafe"
)
type DiskStatus struct {
All uint64
Used uint64
Free uint64
}
func diskUsage(path string) (disk DiskStatus) {
fs := syscall.Statfs_t{}
err := syscall.Statfs(path, &fs)
if err != nil {
return
}
disk.All = fs.Blocks * uint64(fs.Bsize)
disk.Free = fs.Bfree * uint64(fs.Bsize)
disk.Used = disk.All - disk.Free
return
}
func checkSDCardHealth(mountPoint string) {
// 关键点:YCC365默认录像目录是 /mnt/sdcard/YCC365/
recordDir := filepath.Join(mountPoint, "YCC365")
if _, err := os.Stat(recordDir); os.IsNotExist(err) {
fmt.Println("⚠️ 没找到录像目录,摄像头可能没识别到SD卡")
return
}
status := diskUsage(mountPoint)
freePercent := float64(status.Free) / float64(status.All) * 100
fmt.Printf("📊 剩余空间: %.2f GB (%.1f%%)\n",
float64(status.Free)/1024/1024/1024, freePercent)
if freePercent < 5 {
fmt.Println("❌ 剩余空间低于5%,报警录像大概率写不进去")
fmt.Println(" → 建议格式化为exFAT或FAT32,并开启循环覆盖")
}
// 检查最近24小时的录像文件数量
files, _ := filepath.Glob(filepath.Join(recordDir, "*.mp4"))
fmt.Printf("🎥 当前录像文件总数: %d\n", len(files))
}
这个工具能直接跑在树莓派或者软路由上,把SD卡拔下来插读卡器,go run check.go /media/你的卡就能看到问题所在。
三种最常见的“报警录像失踪”场景与对应解法
报警事件有记录,但本地SD卡里空空如也
现象:APP首页能看到“昨天14:32有人移动”的报警卡片,点进去却只有一个缩略图,没有播放按钮。
根因:移动侦测触发了,但写入SD卡时用了低优先级线程,如果你用的是Class10以下的低速卡,或者卡里碎片严重,写入经常超时被丢弃。
我的解法: | 卡类型 | 写入速度 | 适合YCC365吗 | |--------|----------|--------------| | Class4 老卡 | 4MB/s | ❌ 报警录像必丢 | | Class10 普通卡 | 10MB/s | ⚠️ 偶尔丢,看碎片 | | U3/V30 高速卡 | 30MB/s+ | ✅ 推荐,基本秒写 |
我当时把卡从Class10换成U3之后,报警录像生成率从61%直接飙到98%。
SD卡录像完整,但云端看不了
现象:拔卡用读卡器能看到alarm_20241017_143255.mp4这种文件,但APP里云端录像回放一直加载失败。
根因:WiFi信号不稳导致上传中断,YCC365的上传机制是边录边传,但上传线程优先级很低,一旦信号RSSI低于-70dBm,就容易断流且不会重试。
我写过一个小脚本,用来监控摄像头IP的持续丢包率:
func pingMonitor(ip string, count int) {
// 用Go的icmp库,或者直接调系统ping
// 重点盯住丢包率,超过5%就该挪路由器了
}
实践下来,把摄像头挪到离路由器5米内,或者加个WiFi信号中继,云端报警录像成功率能上来不少。
时间对不上,报警显示有录像但播放的是前一天的
现象:报警卡片显示“刚刚”,但点进去画面上显示的是三个小时前的场景。
根因:摄像头NTP时间同步失败,YCC365的固件有个bug,如果断网重启后NTP服务器连不上,会用本地晶振计时,一天误差能到十几分钟,录像文件名用的是事件触发时间,但视频流里嵌入的时间戳是实际录制时间,两个错位导致APP匹配错文件。
解决:手动在摄像头设置里选一个国内的NTP服务器,比如ntp.aliyun.com,然后重启摄像头强制同步。
一个反直觉的发现:格式化SD卡反而解决了问题
我起初以为是硬件坏了,换了几张卡都时好时坏,后来用dd命令全盘清零再格式化成exFAT(注意不是FAT32),问题居然消失了。
后来看固件源码(有人解包过),发现YCC365的录像文件预分配固定大小,每次写报警录像前会先创建pre_alloc.tmp占位,如果文件系统是FAT32且簇大小是32KB,单个文件超过4GB就会出问题——但报警录像单个最多也就几百MB,所以这坑很隐蔽。

用Go的golang.org/x/sys/unix包里的Fallocate函数可以模拟这个预分配行为:
func preAlloc(file *os.File, size int64) error {
return syscall.Fallocate(int(file.Fd()), 0, 0, size)
}
如果这个调用返回ENOSPC,那说明卡上有隐藏的碎片垃圾占着空间,逻辑删除没释放块,这时候只有全盘格式化才能救回来。
如果你的录像真的没生成,还有个“土办法”找回
我无意中发现,YCC365在报警触发时,除了写MP4文件,还会在临时目录留下一份缩略图JPG和一个三秒的GIF预览,这个GIF虽然只有几秒,但能证明“那个时间点发生了什么”。
目录路径通常是:
/mnt/sdcard/YCC365/.cache/alarm_preview/
我用Go写了个小工具,能把所有报警对应的预览GIF按时间重命名并导出:
package main
import (
"fmt"
"io/ioutil"
"os"
"path/filepath"
"time"
)
func main() {
cacheDir := os.Args[1]
files, _ := ioutil.ReadDir(cacheDir)
for _, f := range files {
if filepath.Ext(f.Name()) == ".gif" {
info, _ := f.Info()
modTime := info.ModTime()
newName := modTime.Format("20060102_150405") + ".gif"
os.Rename(filepath.Join(cacheDir, f.Name()),
filepath.Join(cacheDir, newName))
fmt.Printf("导出: %s\n", newName)
}
}
}
虽然它救不回完整视频,但至少能看清是快递员还是野猫,用来跟物业对线也够用了。
最后说点实在的排查顺序
- 先看SD卡剩余空间,少于5%直接格式化
- 拔卡插电脑,看有没有
alarm_开头的mp4文件,有就是上传问题,没有就是写入问题 - 检查摄像头系统时间,偏差超过2分钟就手动校准
- 关掉APP里的“智能侦测增强”选项——这功能会额外占用CPU导致写入延迟
- 如果还不行,把卡格式化成exFAT,再重置摄像头
我用这五步帮三个邻居修好了他家“哑巴”的报警录像,其中两个都是卡碎片问题,一个是WiFi信号弱。
工具代码我放在GitHub仓库里了,里面还有个-watch模式,能实时监控每小时的报警录像生成数量和大小,配合crontab跑一个月,基本能摸清你家摄像头的脾气。
本文来自作者[kyadmin]投稿,不代表be365立场,如若转载,请注明出处:http://hljbesthome.com/keji/2312.html
评论列表(4条)
我是be365的签约作者“kyadmin”!
希望本篇文章《折腾一晚上YCC365报警录像没生成视频?我用Go写了个排查工具,顺便把原因讲透了》能对你有所帮助!
本站[be365]内容主要涵盖:be365,be365网站,be365网址,ball365体育,Be365排名
本文概览:昨晚半夜客厅传来“咔哒”一声,我迷迷糊糊打开YCC365想看看是不是猫又蹬翻了花瓶,结果APP里干干净净——报警记录倒是躺在那儿,可“查...