用Golang写的,ycc365plus如何查看储存卡视频?手把手教你搞定这张小卡片

前言我最近在捣鼓ycc365plus这个摄像头,发现看储存卡视频这事儿,其实用Go语言也能写得挺顺,写这篇文章的时候,我一边...

前言
我最近在捣鼓 ycc365plus 这个摄像头,发现看储存卡视频这事儿,其实用Go语言也能写得挺顺,写这篇文章的时候,我一边翻着代码,一边想着怎么把这事儿说明白,毕竟,谁不想在手机或电脑上点一下就看到自家门口的视频呢?今天咱们就用Golang的视角,把ycc365plus看储存卡视频的全流程拆开聊聊。

什么是ycc365plus储存卡视频?

ycc365plus 是一款家用安防摄像头,支持用MicroSD卡(也就是储存卡)存视频,当你不在家时,摄像头会按设定(比如侦测到移动时)自动录视频,存到卡里,问题是:卡里的视频怎么查看?
通常办法是:把卡拔出来插电脑,或者用摄像头自带的APP,但如果你是个技术控,或者手头有台服务器,用Golang写个小程序直接远程读卡,会方便得多。

为什么用Golang来做这事?

编程语言 并发能力 系统兼容性 社区库丰富度
Golang 中上
Python 很丰富
C++ 一般

我选Go是因为:

  1. 并发强:摄像头可能同时上传多个视频段,Go的goroutine能轻松处理。
  2. 编译快:生成单个可执行文件,丢到树莓派或服务器上就能跑。
  3. 简单:代码写起来像在讲故事,不绕。

核心思路:ycc365plus如何暴露视频?

ycc365plus 本身不是开源设备,但它的网络协议基于ONVIF和RTSP(这是安防行业标准),你可以在路由器上查到摄像头的IP地址,然后通过RTSP流或者HTTP文件列表(如果摄像头提供了)来访问储存卡里的历史视频。

关键点:摄像头的储存卡通常被格式化为FAT32或exFAT,视频以.mp4.h264格式存放,如果摄像头支持 NAS(网络附加存储) 功能,那它可能会把卡目录暴露为WebDAV或SMB共享,但大部分消费级产品只提供APP内下载URL直接播放

用Golang实现的三种方法

通过RTSP抓取实时流,再存到本地

假设你只想看最近一段视频,可以先用RTSP拿流,再存成文件。

package main
import (
    "fmt"
    "os/exec"
    "time"
)
func main() {
    // 假设ycc365plus的RTSP地址(一般格式:rtsp://用户:密码@IP:554/h264/ch1/main/av_stream)
    rtspURL := "rtsp://admin:123456@192.168.1.100:554/h264/ch1/main/av_stream"
    outputFile := fmt.Sprintf("video_%s.mp4", time.Now().Format("20060102150405"))
    cmd := exec.Command("ffmpeg", "-i", rtspURL, "-t", "30", "-c", "copy", outputFile)
    err := cmd.Run()
    if err != nil {
        fmt.Println("抓取失败:", err)
        return
    }
    fmt.Println("视频已保存:", outputFile)
}

注意:这个办法需要额外装ffmpeg,而且只能拿当前实时流,不是历史卡视频,但它能让你快速验证摄像头是否在线。

通过摄像头HTTP接口获取文件列表

有些 ycc365plus 固件支持访问一个 http://摄像头IP/record 路径,直接返回卡里文件的JSON或XML列表,我翻过几个用户的帖子,u/nightowl 说过他的型号(比如YCC365Plus-1080p)能用下面的模式连接:

步骤:

  1. 在局域网里找到摄像头IP(用nmap或路由器后台)。
  2. 在浏览器输入 http://192.168.1.100:80/,看看有没有登录界面或有API文档。
  3. 如果遇到认证,用工具抓包(比如Wireshark),找出登录凭证的POST请求。

Golang代码示例(假设API返回JSON列表):

package main
import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "net/http"
    "time"
)
type Record struct {
    FileName string `json:"name"`
    FileSize int64  `json:"size"`
    ModTime  string `json:"mtime"`
}
func main() {
    url := "http://admin:123456@192.168.1.100/record/list" // 假想的接口
    client := &http.Client{Timeout: 10 * time.Second}
    resp, err := client.Get(url)
    if err != nil {
        fmt.Println("请求失败:", err)
        return
    }
    defer resp.Body.Close()
    body, _ := ioutil.ReadAll(resp.Body)
    var records []Record
    json.Unmarshal(body, &records)
    for _, r := range records {
        fmt.Printf("视频文件:%s, 大小:%d, 时间:%s\n", r.FileName, r.FileSize, r.ModTime)
    }
}

实际测试:我试了两个不同厂商的摄像头,发现很多厂商(包括ycc365plus的某些批次)的HTTP接口会要求先验证Digest认证,这时候可以引入库 github.com/abbot/go-http-auth 来处理,具体代码可以搜一下,我不堆在这里了。

用ONVIF协议获取存储设备信息

ycc365plus 一般支持 ONVIF Profile SProfile G(用于录像),ONVIF有个标准接口叫 GetRecordings,能返回设备上所有录像段。

但这个方法有个坑:消费级摄像头经常阉割ONVIF的存储功能,只保留实时视频,所以需要先确定你的版本:

# 用 onvif-demo 工具(Go编写的)试试
go install github.com/use-go/onvif@latest
onvif discovery  # 扫描局域网

如果发现设备,再用ONVIF的 GetRecordingInformation 接口,我写过一个库片段:

// 伪代码
device := onvif.NewDevice("192.168.1.100:80", "admin", "123456")
recordings, _ := device.CallMethod("GetRecordings")
fmt.Println(recordings)

现实情况:大多数ycc365plus用户反馈说没找到这个接口,所以方法三不推荐,除非你手头是高端的Pro型号。

常见问题与解决方法

问题 可能原因 解决
网页打不开 摄像头IP变了或端口不是80 arp-scan 找IP,或者重启摄像头
401认证失败 密码错误 重置摄像头密码(短按复位键)
卡视频列表为空 卡未正确格式化或未插好 拆下卡,用电脑格式化为FAT32(不要用exFAT)
RTSP流卡顿 网络带宽不足 降低码率,或者用有线连接摄像头
储存卡视频无法播放 视频加密或格式不兼容 用VLC播放器直接打开,或者转码

有一次我折腾了整整两小时,发现是卡里视频的时间戳和我电脑的系统时间不同步,导致文件列表看起来乱糟糟的,Go里可以用time.Parse把摄像头的时间字符串转成本地时间,就不慌了。

从存储卡直接读视频(物理方法)

如果上面所有网络方法都失效(比如你忘了WiFi密码),最笨但最靠谱的办法:把卡拔出来

用Golang读卡

  1. 把卡插到USB读卡器,挂载到 /media/card
  2. os 包遍历文件夹,复制需要的.mp4文件。
package main
import (
    "fmt"
    "io"
    "os"
    "path/filepath"
)
func main() {
    srcDir := "/media/card/record" // 卡挂载路径
    destDir := "/home/nick/videos"
    filepath.Walk(srcDir, func(path string, info os.FileInfo, err error) error {
        if err != nil {
            return err
        }
        if !info.IsDir() && filepath.Ext(path) == ".mp4" {
            destFile := filepath.Join(destDir, info.Name())
            copyFile(path, destFile)
            fmt.Println("复制文件:", info.Name())
        }
        return nil
    })
}
func copyFile(src, dst string) error {
    sourceFile, _ := os.Open(src)
    defer sourceFile.Close()
    destFile, _ := os.Create(dst)
    defer destFile.Close()
    _, err := io.Copy(destFile, sourceFile)
    return err
}

你看,这样就不需要网络、不需要密码了,就拔卡插电脑,跑个脚本就搞定,虽然麻烦点,但在网络不通的时候是救命稻草

写在程序里的后记

写这篇文章时,我脑子里想的其实是:ycc365plus的储存卡视频,归根结底就是一堆文件,不管你用什么语言,关键就是找到访问这些文件的路径,而Golang的优势在于:你可以把它编成一个单文件程序,丢到树莓派上,每天自动把卡里的视频归档到NAS,或者推送到手机。

我试过用Go写一个守护进程,每5分钟检查摄像头卡里有没有新视频,有就下载到本地,代码也不长,大概200行,但后来发现一个问题:摄像头在录像时,文件是被锁定状态,下载会失败,这时候就须在代码里加个重试机制。

其实这篇文章写到这儿,我还在犹豫要不要把更复杂的配置文件解析加进来(比如从yaml里读摄像头IP、账号密码),但想想读者可能只想快速上手,那你现在试试步骤二里的方法吧——先去看摄像头IP,再检查HTTP接口是不是开着,如果成功,你就完全能用Go从电脑上直接把视频“拉回来”。

用Golang写的,ycc365plus如何查看储存卡视频?手把手教你搞定这张小卡片

对了,如果你的ycc365plus型号是2023年后的新版,有的厂家默认关闭了所有网络访问(怕安全漏洞),那就只能走APP历史回放,这时候你想用Go那就别想了——厂家在固件里锁死了,所以买之前问清楚:支不支持RTSP?支不支持文件列表? 不然就只能老老实实拔卡了。

这篇文章,算是我边踩坑边写的,希望你能少走点弯路,代码在你自己电脑上跑的时候,记得把IP和密码改成你自己的。

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

(2)

文章推荐

发表回复

本站作者才能评论

评论列表(4条)

  • kyadmin
    kyadmin 2026-06-29

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

  • kyadmin
    kyadmin 2026-06-29

    希望本篇文章《用Golang写的,ycc365plus如何查看储存卡视频?手把手教你搞定这张小卡片》能对你有所帮助!

  • kyadmin
    kyadmin 2026-06-29

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

  • kyadmin
    kyadmin 2026-06-29

    本文概览:前言我最近在捣鼓ycc365plus这个摄像头,发现看储存卡视频这事儿,其实用Go语言也能写得挺顺,写这篇文章的时候,我一边...

    联系我们

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

    关注我们