一群人一年365天视频,我们用Go语言写了个时间流水账

你有没有想过,如果从今天开始,每天录一段视频,一年后回头看,会是什么感觉?我有一群朋友,真就这么干了,不是拍vlog那种精心剪辑的,...

你有没有想过,如果从今天开始,每天录一段视频,一年后回头看,会是什么感觉?

我有一群朋友,真就这么干了,不是拍vlog那种精心剪辑的,就是每天对着镜头瞎聊几句,有时候是抱怨今天加班到十一点,有时候是炫耀楼下便利店买到了最后一个肉松面包,我们管这叫“365天视频计划”,说真的,坚持到第100天的时候,我看着自己从胡子拉碴到又刮干净、从一脸丧气到突然咧嘴笑,那种真实的冲击力,比任何滤镜都强。

不过问题来了——一年下来,三百多段视频,全堆在手机里,找起来简直要命,有人问“你2月14号那天说了啥”,我得翻半小时文件夹,于是我这个写Go的后端仔,决定用代码给大家伙儿整点实在的。

为什么是Go?——因为它快,不像在上班”

说实话,用Python也能干,但你想啊,一群人每天产生的视频,一年下来随便就是几十个GB甚至上百GB,如果用Python做批量处理,那个循环跑起来,我泡杯咖啡回来它还在“正在处理第3个文件”,Go不一样,编译后直接跑,并发处理文件IO和元数据提取的时候,能硬生生把时间压到原来的三分之一。

而且Go的语法干净,你写习惯了,会发现它特别适合这种“要逻辑清晰、别搞花里胡哨”的工具,我们几个朋友里,有个前端转行的大哥,代码写得像散文,但用Go写这个视频管理器的时候,他改了三遍就服气了——“这语言逼着你把结构理清楚,不像我写JS,能给我自己埋坟。”

先解决最头疼的事:给视频“上户口”

我们每个人录的视频,文件名千奇百怪,有人叫“今天好累.mp4”,有人叫“20230115_221045.mp4”(这个算素质高的),还有人就录完不改名,直接“IMG_1234.mp4”往群里甩。

所以第一件事,就是写个程序,批量提取视频的元数据,Go里有一个特别好用的库叫github.com/icza/goproperties,搭配系统自带的os/exec,可以调用ffprobe(这是个视频分析工具,大家都懂),我们写了个函数:

func getVideoMeta(filePath string) (VideoMeta, error) {
    cmd := exec.Command("ffprobe", "-v", "quiet", "-print_format", "json", "-show_format", filePath)
    var output bytes.Buffer
    cmd.Stdout = &output
    err := cmd.Run()
    ...
}

这一步是关键,从json里解析出创建时间、时长、编码格式、分辨率,然后统一重命名成“日期_姓名_序号.mp4”的格式,比如20230115_张三_01.mp4,你别小看这个命名规则,它让后续所有操作都变成了字符串比较和正则匹配,省了海量的时间。

我还加了一个小功能:如果视频没有元数据里的创建时间(有些老旧的文件会缺失),就取文件的修改时间,你发现没,Windows和Mac上修改时间还不太一样,Mac的ModTime更稳定,后来我干脆用Go的time包统一转成了UTC时间戳,再转回本地时间,彻底堵死了时区混乱的坑

第二步:按天归档,再给每个视频“写个简历”

文件统一了之后,我们按年/月/日的目录结构归档,Go的os.MkdirAll特别好用,一行代码搞定:

os.MkdirAll(fmt.Sprintf("%s/%s", destDir, dayStr), 0755)

但光归档还不够,365天,谁记得哪段视频里说了什么内容?有人录了和女朋友吵架后的心情,有人录了公司年会抽中了个蓝牙音箱,这些信息如果不记下来,那就是一堆有画面的哑巴数据。

于是我们搞了个伴随式JSON文件,意思就是,每段视频旁边,跟着生成一个同名的.json文件,里面包含:

  • 视频文件名(标准化后的)
  • 录制者名字(从文件名解析)
  • 录制日期
  • 当天的“一句话标签”(我们允许用户事后补填)
  • 视频时长(秒)
  • 文件大小(字节)
  • 哈希值(SHA256,用来去重)

这个哈希值后来救了命,有次有人把去年某段视频误传了两次,名字不同,但哈希一对比,瞬间揪出来删掉了,Go标准库crypto/sha256写起来极舒服,类型安全,性能也好。

第三步:搞个“日历热力图”,一眼看穿谁在偷懒

光有文件不行,得有个直观的东西让我们这帮人能互相监督,我顺手写了个日历热力图生成器——不是UI层面的热力图,是生成一份统计表格,每天一行,每个人一个列,录了视频就打个勾,没录就空着。

Go的text/template库这时候就特别顺手,我直接写个模板,往里面灌数据,输出成一个markdown文件,大家用Typora打开,就能看到一整年的参与情况。

一群人一年365天视频,我们用Go语言写了个时间流水账

比如这样:

日期 张三 李四 王五
2023-01-01 ✅ 3min ✅ 5min
2023-01-02 ✅ 2min ✅ 1min

你别觉得这个功能简单,我们群里有个哥们儿,连续43天没断,一看统计表,立马截图发朋友圈了,还有个姐们儿,看到自己一周漏了三天,直接恼了,当晚追录了三段“补交作业”。有时候事情做成,不是靠什么高大上的技术,而是靠这种“可视化缺勤”带来的真实压力。

第四步:视频快照与缩率的那些坑

每个视频要想快速预览,就得生成缩略图,Go本身没这能力,得上exec.Commandffmpeg,这个坑最深。

一开始我直接写成:

exec.Command("ffmpeg", "-i", input, "-ss", "00:00:05", "-vframes", "1", output)

结果发现,有些视频快进到第5秒的时候,关键帧不在那里,ffmpeg会花好几秒去解码前一个关键帧,处理300个视频,光截图就花了半小时,后来改成:

exec.Command("ffmpeg", "-ss", "00:00:05", "-i", input, "-vframes", "1", output)

-ss放前面,就是先做seek,再载入输入,速度一下子快了10倍。这个顺序区别,我估计很多教程都不会提,但实际干活的时候能省一大堆时间。

还有分辨率统一的问题,我默认缩略图宽度720,高度自动适应,但有些手机竖屏录的、有些横屏录的,如果不处理,缩略图放一起会看着想吐,最后加了个-vf "scale=720:-2",-2的意思是保证高度能被2整除,避免ffmpeg报错。

额外送的小工具:用Go写了个“记忆盲盒”

程序写完后,我们觉得光管理还不过瘾,于是我用同样的元数据,每天晚上8点,随机从所有视频里挑出同一天但不同年份的视频,拼成一个“今天的历史”小片段,比如1月15号,它会挑出2022年1月15号的视频和2023年1月15号的视频,用ffmpeg做个concat,然后自动生成一个临时文件链接,发到群里的webhook。

Go的协程在这里发挥得淋漓尽致,一个goroutine负责扫描元数据索引,一个负责调用ffmpeg拼接,还有一个负责把结果发到钉钉机器人,整个流程跑下来,内存占用不到30MB,CPU也偶尔冒个尖。

有一次,两个朋友隔着两年同一天都录了“今天加班好累”,但是语气从暴躁变成了平静,我们看着那个拼接视频,沉默了好久,那种东西,是算法写不出来的。

不过也别把Go神化了

说实话,用Go写这个工具,也遇到了一些让我挠墙的坑。

比如跨平台路径分隔符,有人的视频存在Windows PC上,路径是C:\Users\...,我一开始用strings.Split(path, "\\"),结果到别人Mac上一跑立刻炸,后来统一用filepath.ToSlashfilepath.SplitList才搞定。

还有GBK编码的Windows文件名,有些文件从老硬盘拷过来,文件名里有中文,用os.Stat直接读就乱码,得先判断系统,然后走golang.org/x/text/encoding/simplifiedchineseGBK.NewDecoder()转一遍。

最离谱的是文件时间戳的精度,有个朋友的手机录像,元数据时间精确到毫秒,但文件系统截断到了秒,导致同一天内的视频排序不稳定,最后我用文件名里的“序号”字段做了secondary key,才压住这个毛病。

这些细节,网上教程基本不会写全,我就是这样边写边试,边试边骂,才把这一年365天视频项目跑起来的。

对一群普通人来说,这个项目意味着什么

代码写完了,工具也跑利索了,现在每天晚上11点多,我们群里会有人把当天的视频传到一个共享目录里,运行在我家里那台小服务器上的Go程序,会自动扫描新文件、提取元数据、生成缩略图、更新统计表,然后静悄悄地把一切归档好。

我们不是博主,不是up主,不是任何试图靠内容赚钱的人,我们只是一群不想让时间过得太快的人,用Go写这么个小东西,其实也是在对抗遗忘——用代码把记忆按时间戳排好序,用哈希校验它们没有被篡改,用并发的调度让你能随时抽出一段过去。

有一回,王五在视频里说:“如果我四十岁回头看现在这个东西,估计会笑出声吧。”李四回了一句:“笑出声就对了,那时候要是还找得到这段视频,说明这件事没白干。”

我觉得这句说得真好。

365天视频,一群人,一个Go写的系统,没有大厂架构,没有高并发,没有分布式,有的只是一点真实代码和更真实的日常,像这样的工具,可能永远不会上GitHub热门,但对我们这十几个人来说,它比很多大系统都贵重。

最后说一句,写Go代码的时候,别怕变量名丑,别怕函数长,先跑起来,至于优化?那是元旦再考虑的事情,哈哈。

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

(10)

文章推荐

发表回复

本站作者才能评论

评论列表(4条)

  • kyadmin
    kyadmin 2026-07-12

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

  • kyadmin
    kyadmin 2026-07-12

    希望本篇文章《一群人一年365天视频,我们用Go语言写了个时间流水账》能对你有所帮助!

  • kyadmin
    kyadmin 2026-07-12

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

  • kyadmin
    kyadmin 2026-07-12

    本文概览:你有没有想过,如果从今天开始,每天录一段视频,一年后回头看,会是什么感觉?我有一群朋友,真就这么干了,不是拍vlog那种精心剪辑的,...

    联系我们

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

    关注我们