从第一天到第365天,我用Go语言写了一个视频日记系统,结果治好了我的拖延症

你有没有过这种经历?手机里存了几千个视频片段,但从来没完整看过一遍,我去年元旦立了个flag:每天录一段视频,坚持365天,结果三天后就...

你有没有过这种经历?手机里存了几千个视频片段,但从来没完整看过一遍,我去年元旦立了个flag:每天录一段视频,坚持365天,结果三天后就放弃了——不是懒得录,而是整理素材太痛苦了,直到我用Go语言写了个小工具,才真正把这件事坚持了下来。

为什么是Go语言?

说实话,一开始我想用Python,但我的树莓派上跑着好几个服务,Python环境乱得像我的书桌,Go语言的好处是编译成单个二进制文件,扔到哪都能跑,而且它的并发模型特别适合处理视频这种IO密集型的任务。

我花了一个周末写了第一版,功能简单得可怜:

  • 按日期自动创建文件夹
  • 给视频文件重命名成mp4这种格式
  • 生成一个简单的HTML索引页面

但就是这个小工具,让我坚持到了第100天,后来我不断加功能,到第365天的时候,它已经变成了一个相当完整的系统。

视频日记的痛点

你可能会说:“不就是录个视频嘛,有什么难的?”但当你真的要做365天的时候,问题就来了:

  1. 文件命名混乱——手机的默认命名是VID_20240101_123456.mp4,按字母排序完全看不出顺序
  2. 存储分散——今天在手机上录的,明天用相机,后天可能用电脑摄像头
  3. 无法快速回顾——想看一个月前的自己说了什么,得一个个打开视频找

我的Go程序解决的就是这三个问题。

核心代码思路

先别急着看代码,我告诉你我是怎么想的,这个程序的核心就三个部分:

文件监听和移动

我用了一个fsnotify库来监听指定文件夹,当新视频文件出现时,自动把它移动到按日期组织的目录结构里:

watcher, _ := fsnotify.NewWatcher()
defer watcher.Close()
go func() {
    for {
        select {
        case event := <-watcher.Events:
            if event.Op&fsnotify.Create == fsnotify.Create {
                moveFile(event.Name)
            }
        case err := <-watcher.Errors:
            log.Println("error:", err)
        }
    }
}()

重命名规则

这个逻辑我改了好几版,最初是简单的mp4,但后来发现日期信息很重要,最终版是这样的:

func generateName(day int) string {
    return fmt.Sprintf("day%03d_%s.mp4", day, time.Now().Format("2006-01-02"))
}

day%03d这个格式化太重要了,不然第2天会排在第10天后面,这种细节你得亲自踩过坑才懂。

生成索引页

最让我得意的是这个功能,它扫描所有视频文件,生成一个带缩略图的HTML页面,按照时间线排列,这样我就能在一个页面上看到365天的全部记录:

从第一天到第365天,我用Go语言写了一个视频日记系统,结果治好了我的拖延症

type VideoEntry struct {
    Day        int
    Date       string
    Filename   string
    Thumbnail  string
    Transcript string
}

到后来我甚至加了语音转文字的功能,用whisper模型把每段视频的语音转成文本,然后让这个工具生成当天的“关键事件”。

你可能会问:值得吗?

说实话,去年前100天,我经常问自己这个问题,但到第200天的时候,我开始发现好处了:

  • 情绪观测:我能看到自己哪段时间特别焦虑(视频里的语速明显变快)
  • 记忆锚点:某天拍了什么特别的事,看一眼日期就能搜到那个视频
  • 剪辑素材库:年底做回顾视频时,素材全在这个目录里,省了大量翻找时间

存视频的存储策略

我一开始把所有视频都存在树莓派的外接硬盘上,结果两个月就满了,后来加了个简单的归档策略:

  1. 当前月的视频放在高速SSD上,方便随时剪辑
  2. 上个月及以前的视频自动压缩并转移到机械硬盘
  3. 每季度把上季度的视频备份到网盘

这个策略用Go写也不复杂,就是定期跑一个cron任务,检查文件年龄然后移动,关键是时间戳的判断要用文件修改时间而不是文件名,因为重命名可能会改变文件顺序。

高级功能:视频摘要

到第300天的时候,我加了个功能,让我回头看视频的欲望大大增加,我用ffmpeg提取每段视频的关键帧,然后让Go程序根据语音转文字的结果,自动生成一行的摘要,比如某天的摘要可能是:“讨论了新项目的技术选型,最后选了Go,因为上手快且生态好。

这个功能大大提高了回顾效率,我不需要看视频,只需要浏览摘要就能快速定位到某个时间点。

关于坚持这件事

写了这么多代码,你以为我要说Go语言有多牛逼?其实最重要的是把工具做简单,人都是有惰性的,如果每天录完视频还要花五分钟整理,你肯定坚持不下来,我的Go程序把这些杂活全自动了——录完扔进特定文件夹,其他都不管。

我见过很多人做类似的事,用Notion、用Excel、用各种App,但都太复杂了。好的工具是让你感觉不到工具的存在,我写这个Go程序的原则就是:全程除了录视频,其他时候都不需要动脑操作。

现在这个程序已经跑了一年多,我还在用,它不完美,比如偶尔会因为文件名冲突报错,但我已经习惯了这种小毛病,就像养了个宠物,你不会因为它偶尔拆家就不要它。

日子就是这样,一天一天过,视频一天一天存,到第365天回头一看,365个文件整整齐齐躺在硬盘里,那一刻的满足感,比写完一万行代码都强。

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

(21)

文章推荐

发表回复

本站作者才能评论

评论列表(4条)

  • kyadmin
    kyadmin 2026-08-29

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

  • kyadmin
    kyadmin 2026-08-29

    希望本篇文章《从第一天到第365天,我用Go语言写了一个视频日记系统,结果治好了我的拖延症》能对你有所帮助!

  • kyadmin
    kyadmin 2026-08-29

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

  • kyadmin
    kyadmin 2026-08-29

    本文概览:你有没有过这种经历?手机里存了几千个视频片段,但从来没完整看过一遍,我去年元旦立了个flag:每天录一段视频,坚持365天,结果三天后就...

    联系我们

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

    关注我们