折腾一晚上YCC365报警录像没生成视频?我用Go写了个排查工具,顺便把原因讲透了

昨晚半夜客厅传来“咔哒”一声,我迷迷糊糊打开YCC365想看看是不是猫又蹬翻了花瓶,结果APP里干干净净——报警记录倒是躺在那儿,可“查...

昨晚半夜客厅传来“咔哒”一声,我迷迷糊糊打开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,所以这坑很隐蔽。

折腾一晚上YCC365报警录像没生成视频?我用Go写了个排查工具,顺便把原因讲透了

用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)
        }
    }
}

虽然它救不回完整视频,但至少能看清是快递员还是野猫,用来跟物业对线也够用了。

最后说点实在的排查顺序

  1. 先看SD卡剩余空间,少于5%直接格式化
  2. 拔卡插电脑,看有没有alarm_开头的mp4文件,有就是上传问题,没有就是写入问题
  3. 检查摄像头系统时间,偏差超过2分钟就手动校准
  4. 关掉APP里的“智能侦测增强”选项——这功能会额外占用CPU导致写入延迟
  5. 如果还不行,把卡格式化成exFAT,再重置摄像头

我用这五步帮三个邻居修好了他家“哑巴”的报警录像,其中两个都是卡碎片问题,一个是WiFi信号弱。

工具代码我放在GitHub仓库里了,里面还有个-watch模式,能实时监控每小时的报警录像生成数量和大小,配合crontab跑一个月,基本能摸清你家摄像头的脾气。

本文来自作者[kyadmin]投稿,不代表be365立场,如若转载,请注明出处:http://hljbesthome.com/keji/2312.html

(15)

文章推荐

发表回复

本站作者才能评论

评论列表(4条)

  • kyadmin
    kyadmin 2026-08-17

    我是be365的签约作者“kyadmin”!

  • kyadmin
    kyadmin 2026-08-17

    希望本篇文章《折腾一晚上YCC365报警录像没生成视频?我用Go写了个排查工具,顺便把原因讲透了》能对你有所帮助!

  • kyadmin
    kyadmin 2026-08-17

    本站[be365]内容主要涵盖:be365,be365网站,be365网址,ball365体育,Be365排名

  • kyadmin
    kyadmin 2026-08-17

    本文概览:昨晚半夜客厅传来“咔哒”一声,我迷迷糊糊打开YCC365想看看是不是猫又蹬翻了花瓶,结果APP里干干净净——报警记录倒是躺在那儿,可“查...

    联系我们

    工作时间:周一至周五,9:30-18:30,节假日休息

    关注我们