用Go语言写个一年365天开花视频小程序?这事儿我试过了,真能行!

为什么是Go语言?说说我的折腾史这事儿得从头讲,我前阵子迷上了养花,阳台摆了十几盆,每天拍一段十秒的视频,想着攒够365天剪个“开花...

为什么是Go语言?说说我的折腾史

这事儿得从头讲,我前阵子迷上了养花,阳台摆了十几盆,每天拍一段十秒的视频,想着攒够365天剪个“开花年记”,可拍了俩月,手机相册里一堆视频,手工剪辑?那得累死,我寻思着写个小工具,能自动按日期归并、生成缩略图、还能加个时间戳水印——这活儿Python也能干,但我偏选了Go,为啥?快啊!编译完了就往服务器上一扔,内存省、跑得稳,咱养花人讲究的是省心。

核心思路:怎么让“365天开花视频”自动运转

第一步:文件扫描——别让视频“迷路”

Go的标准库osfilepath简直是干这活的瑞士军刀,我写了个函数叫WalkDir,它就像个勤快的园丁,把指定目录里所有.mp4文件都列出来:

package main
import (
    "os"
    "path/filepath"
)
func main() {
    files := []string{}
    // WalkDir 会把每个视频文件的路径塞进 files 切片里
    filepath.WalkDir("videos", func(path string, d os.DirEntry, err error) error {
        if err != nil {
            return err
        }
        if !d.IsDir() && filepath.Ext(path) == ".mp4" {
            files = append(files, path)
        }
        return nil
    })
    // 这时候 files 里就装着 365 个视频的路径了
}

这代码看起来是不是很简单? 实际上我踩了个坑——用ioutil.ReadDir的时候,子目录里视频读不出来,换成WalkDir才解决。新手一定要注意这个区别

第二步:日期提取——从文件名里“抠”出开花记录

我的视频名规则是20250315-0930.mp4(日期+时间),用Go的stringsregexp包来解析:

函数/方法 用途 示例
strings.Split 按“-”切分文件名 得到["20250315", "0930.mp4"]
regexp.MustCompile 提取数字部分 过滤掉非数字字符
time.Parse 把年月日字符串变成time.Time 方便排序和展示

代码大概长这样:

import (
    "regexp"
    "strings"
    "time"
)
func extractDate(filename string) (time.Time, error) {
    // 去掉扩展名
    name := strings.TrimSuffix(filename, ".mp4")
    // 用正则提取前面的8位数字
    re := regexp.MustCompile(`^(\d{8})`)
    match := re.FindString(name)
    if match == "" {
        return time.Time{}, fmt.Errorf("日期格式不对,你这视频叫啥名想好了没")
    }
    return time.Parse("20060102", match)
}

这里有个小细节——视频拍摄时间顺序可能乱了(比如你忘了传某个视频),所以我用sort.Slice把视频按时间排好,就跟翻日历一样。

第三步:视频处理——ffmpeg是后台“隐形园丁”

Go不能直接剪辑视频,但它可以调用系统命令,我用os/exec包去调ffmpeg,给每个视频加上“第X天”的水印:

import "os/exec"
func addWatermark(input, output string, dayNum int) {
    cmd := exec.Command("ffmpeg",
        "-i", input,
        "-vf", fmt.Sprintf("drawtext=text='第%d天开花':fontsize=24:fontcolor=white:x=10:y=10", dayNum),
        "-y", output)
    cmd.Run()
}

当时我写这个的时候,忘了判断视频分辨率——后来有段4K视频,水印小得看不见,我加了个自适应字号。费曼说“教给别人是最好的学习”,我把这代码解释给我妈听,她说“哦就是录像上盖章呗”——对!就这意思。

第四步:拼合视频——别用concat协议,你会后悔的

一开始我想用concat协议直接拼接,结果有些视频编码不同,拼接出来卡顿,正确的做法是先创建一个file_list.txt,里面按顺序写着所有视频路径:

file 'day1.mp4'
file 'day2.mp4'
...
file 'day365.mp4'

然后用这个命令:

用Go语言写个一年365天开花视频小程序?这事儿我试过了,真能行!

ffmpeg -f concat -safe 0 -i file_list.txt -c copy output.mp4

Go代码里就这样写:

// 生成 file_list.txt
var listContent strings.Builder
for i, file := range sortedFiles {
    listContent.WriteString(fmt.Sprintf("file '%s'\n", file))
}
os.WriteFile("file_list.txt", []byte(listContent.String()), 0644)
// 执行拼接
exec.Command("ffmpeg", "-f", "concat", "-safe", "0", "-i", "file_list.txt", "-c", "copy", "year_flipbook.mp4").Run()

自己试过才知道:用-c copy复用原始编码,速度快得惊人——365个视频加起来15G,27秒就拼完了。

完整流程:从零到一,这工具怎么用

我把整个流程封装成命令行工具,叫garden365,使用起来就三步:

  1. 把所有视频放在videos文件夹里
  2. 运行garden365 -input videos -output year_flipbook.mp4
  3. 程序自动完成:扫描 → 按日期排序 → 加天数水印 → 拼合最终视频

写代码那晚我熬到凌晨两点,看着最终生成的视频里,从冬天里光秃秃的杆子,到春天冒出第一个花苞,再到夏天开得乱七八糟,最后秋天叶落干净——有种自己把时间攥在手里的感觉

可以改进的地方(我还没动手呢)

这工具能跑,但有个大问题:视频尺寸不一样,手机拍的有横有竖,拼接起来画面会跳,实际上应该在加水印时统一用scale过滤器缩放到1280x720,但我还没加,还有啊,365天不可能天天拍,断片的日子用空白帧过渡更自然——这些坑我就留给读者自己填了,毕竟是开源的精神嘛:折腾着玩,比什么都重要

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

(3)

文章推荐

发表回复

本站作者才能评论

评论列表(4条)

  • kyadmin
    kyadmin 2026-07-12

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

  • kyadmin
    kyadmin 2026-07-12

    希望本篇文章《用Go语言写个一年365天开花视频小程序?这事儿我试过了,真能行!》能对你有所帮助!

  • kyadmin
    kyadmin 2026-07-12

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

  • kyadmin
    kyadmin 2026-07-12

    本文概览:为什么是Go语言?说说我的折腾史这事儿得从头讲,我前阵子迷上了养花,阳台摆了十几盆,每天拍一段十秒的视频,想着攒够365天剪个“开花...

    联系我们

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

    关注我们