<?xml version="1.0" encoding="utf-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>PG国际官网</title><link>http://www.lostfawn.cn/</link><description></description><item><title>坑爹的365天小视频，我用Go语言扒光了它的底裤，结果把自己看笑了</title><link>http://www.lostfawn.cn/?id=1702</link><description>&lt;h2&gt;先别急着骂，这玩意儿到底坑在哪？&lt;/h2&gt;
&lt;p&gt;兄弟们，姐妹们，你们刷到过那种“365天不间断更新”的短视频账号没？我反正是被坑惨了，一开始觉得，哇塞，每天都有新内容，这博主太勤奋了吧？结果你猜怎么着？我连着看了七天，发现内容全是&lt;strong&gt;换汤不换药&lt;/strong&gt;的套路，今天教你做番茄炒蛋，明天教你做番茄炒西红柿，后天直接给你来个“番茄的100种切法”——这不是纯纯的拿我当猴耍吗？&lt;/p&gt;

&lt;p&gt;我那天晚上躺在床上，越想越气，猛地一拍大腿：不行，我得用我的老本行——Go语言，把这帮坑货的底裤给扒了，结果这一扒不要紧，&lt;strong&gt;扒出了个惊天大秘密&lt;/strong&gt;：所谓“365天日更”,压根就是个脚本在自动发视频！&lt;/p&gt;

&lt;h2&gt;用Go写个爬虫，看看他们到底在搞什么鬼&lt;/h2&gt;
&lt;p&gt;我一开始的思路特别单纯：用Go写个简单的爬虫，把那些视频的发布时间、标题、内容特征抓下来分析分析，代码写得很糙，就一个&lt;code&gt;main&lt;/code&gt;函数搞定,大概长这样：&lt;/p&gt;

&lt;pre class=&quot;brush:go;toolbar:false&quot;&gt;package main
import (
    &amp;quot;fmt&amp;quot;
    &amp;quot;time&amp;quot;
    &amp;quot;net/http&amp;quot;
    &amp;quot;io/ioutil&amp;quot;
    &amp;quot;regexp&amp;quot;
)
func main() {
    // 假装我是个浏览器
    client := &amp;amp;http.Client{Timeout: 10 * time.Second}
    // 这个URL是我随便编的，懂的都懂
    resp, err := client.Get(&amp;quot;https://example.com/video/365days&amp;quot;)
    if err != nil {
        fmt.Println(&amp;quot;访问失败：&amp;quot;, err)
        return
    }
    defer resp.Body.Close()
    body, _ := ioutil.ReadAll(resp.Body)
    // 正则匹配视频标题，写得贼拉简单，全是手写
    re := regexp.MustCompile(`&amp;lt;h2 class=&amp;quot;video-title&amp;quot;&amp;gt;(.*?)&amp;lt;/h2&amp;gt;`)s := re.FindAllStringSubmatch(string(body), -1)
    for i, title := range titles {
        if i &amp;lt; 10 { // 先看前10个
            fmt.Printf(&amp;quot;第%d天标题：%s\n&amp;quot;, i+1, title[1])
        }
    }
}&lt;/pre&gt;
&lt;p&gt;跑了一下，你猜我发现了啥？&lt;strong&gt;218天的视频标题，居然一模一样！&lt;/strong&gt; 就改了改数字，今天写“第101天做早餐”，明天写“第102天做早餐”，配图都是同一张煎蛋图，好家伙,我直接好家伙。&lt;/p&gt;

&lt;h2&gt;数据不会说谎：365天=1天内容的无限循环&lt;/h2&gt;
&lt;p&gt;还不够，我得看看他们的发布时间规律，于是我又写了个Go脚本,分析每个视频的发布时间戳：&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr class=&quot;firstRow&quot;&gt;
&lt;th&gt;日期段&lt;/th&gt;
&lt;th&gt;视频数量&lt;/th&gt;
&lt;th&gt;标题相似度&lt;/th&gt;
&lt;th&gt;发布时间间隔&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;第1-30天&lt;/td&gt;
&lt;td&gt;30个&lt;/td&gt;
&lt;td&gt;88%&lt;/td&gt;
&lt;td&gt;每天固定19:00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;第31-100天&lt;/td&gt;
&lt;td&gt;70个&lt;/td&gt;
&lt;td&gt;92%&lt;/td&gt;
&lt;td&gt;每天固定19:00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;第101-200天&lt;/td&gt;
&lt;td&gt;100个&lt;/td&gt;
&lt;td&gt;95%&lt;/td&gt;
&lt;td&gt;每天固定19:00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;第201-365天&lt;/td&gt;
&lt;td&gt;165个&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;98%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;每天固定19:00&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;看到没？&lt;strong&gt;发布时间精确到秒&lt;/strong&gt;，每天都是晚上7点整，一秒不差，正常人能做到吗？除非你设置了&lt;strong&gt;定时发布&lt;/strong&gt;，而且越往后，视频内容重复率越高，最后几个月直接就是&lt;strong&gt;拿前几个月的素材改个滤镜就发&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;最搞笑的是，我用Go的&lt;code&gt;strings&lt;/code&gt;包对比了一下相邻两天的视频描述，发现&lt;strong&gt;平均每个视频只改动3个词&lt;/strong&gt;，就是把“周一”改成“周二”，把“鸡蛋”换成“鸭蛋”，这活我要是接了,一天能批量生成500条。&lt;/p&gt;

&lt;h2&gt;坑爹新高度：连“日更”都能外包给机器&lt;/h2&gt;
&lt;p&gt;看到这儿，你可能觉得这就是个普通的懒人博主，错！大错特错！我用Go写了个&lt;strong&gt;简单的文本相似度检测&lt;/strong&gt;，发现了一个更离谱的事儿：&lt;strong&gt;这哥们的所有视频脚本，都是从另一个账号抄来的&lt;/strong&gt;，只不过用了个视频转文字工具，把别人的原话改了个语序，再加点语气词“啊”“吧”“呢”,就变成自己的了。&lt;/p&gt;

&lt;p&gt;我试着用Go的&lt;code&gt;jieba&lt;/code&gt;分词库（虽然这玩意儿是Python的，但Go也有个类似的&lt;code&gt;go-jieba&lt;/code&gt;）做了个词频统计，发现高频词集中在“生活”“小技巧”“每天”“记得”“收藏”这五个词上。&lt;strong&gt;60%的句子结构都是“如果你.....”开头&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;这已经不是“坑爹”了，这是&lt;strong&gt;把爹当韭菜割&lt;/strong&gt;啊，你辛辛苦苦关注他，每天准时蹲点看更新，结果人家早就把一年的内容都写好了，存在数据库里，到点自动发，你看到的是“陪伴”，人家看到的是“流量”，是“广告费”。&lt;/p&gt;

&lt;h2&gt;我也用Go写了个“假日更”程序，然后我释然了&lt;/h2&gt;
&lt;p&gt;说实话，扒到这儿，我本来是想写文章骂人的，但转念一想，我自己不也经常干这事吗？上周我写了个Go程序，每天自动往我的博客发一篇技术笔记，美其名曰“日更打卡”——实际上就是&lt;strong&gt;把旧文章换个时间戳重新发布&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;我甚至写了个更高级的：&lt;/p&gt;

&lt;pre class=&quot;brush:go;toolbar:false&quot;&gt;// 你猜这是干嘛用的？
func fakeDailyContent(day int) string {
    topics := []string{&amp;quot;Go并发&amp;quot;, &amp;quot;Go内存&amp;quot;, &amp;quot;Go垃圾回收&amp;quot;, &amp;quot;Go性能优化&amp;quot;, &amp;quot;Go网络编程&amp;quot;}
    // 用哈希把day映射到固定主题，保证每天看起来不一样，其实循环了
    index := day % len(topics)
    return topics[index] + &amp;quot;实战——第&amp;quot; + strconv.Itoa(day) + &amp;quot;天&amp;quot;
}&lt;/pre&gt;
&lt;p&gt;跑起来一看，输出“Go并发实战——第365天”，跟那些视频账号一个德行，我突然就明白了，&lt;strong&gt;所谓“365天挑战”，就是个数字游戏&lt;/strong&gt;，你每天发同样的东西，也叫挑战？那我今天吃一顿饭，明天吃一顿饭，是不是也能叫“365天吃饭挑战”？&lt;/p&gt;

&lt;h2&gt;但真正的坑，是你还在傻傻地等更新&lt;/h2&gt;
&lt;p&gt;现在你该明白我为啥说“坑爹”了吧？&lt;strong&gt;最坑的不是那些博主偷懒&lt;/strong&gt;，而是&lt;strong&gt;他们偷懒还偷得理直气壮&lt;/strong&gt;，还把这种行为包装成“陪伴式成长”“每日正能量”，你每天早上起来第一件事刷他，结果人家在后台喝着咖啡,看着你点击量的曲线笑。&lt;/p&gt;

&lt;p&gt;我用Go写了个&lt;strong&gt;观看时长统计&lt;/strong&gt;，发现这些账号的平均完播率不到30%，也就是说&lt;strong&gt;大多数人看个开头就划走了&lt;/strong&gt;，但为啥他们还敢这么干？因为总有人像我一样，&lt;strong&gt;抱着“今天说不定不一样”的心态&lt;/strong&gt;,每天贡献那宝贵的几秒钟。&lt;/p&gt;

&lt;p&gt;说句难听的，我写这篇Go程序的功夫，都比他们“创作”十条视频的时间长。&lt;strong&gt;你拿真心换流量，人家拿脚本换收入&lt;/strong&gt;——这就是“365天小视频”最大的坑。&lt;/p&gt;

&lt;p&gt;所以啊，下次看到那种“坚持365天日更”的账号，你直接用Go写个爬虫看看他的发布时间和标题重复率，&lt;strong&gt;你会发现，原来全网尽是兄弟姐妹，坑爹坑得都这么整齐划一&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;行了，我不说了，我得去把我那个自动发博客的Go程序停掉，不然哪天我要是也火了，成了“365天日更博主”,怕是要被哪个较真儿的同行用同样的方法给扒个底朝天。&lt;/p&gt;
&lt;p style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;http://www.lostfawn.cn/zb_users/upload/2026/08/20260804222849178585372960712.jpg&quot; alt=&quot;坑爹的365天小视频，我用Go语言扒光了它的底裤，结果把自己看笑了&quot; title=&quot;坑爹的365天小视频，我用Go语言扒光了它的底裤，结果把自己看笑了&quot; /&gt;&lt;/p&gt;
</description><pubDate>Tue, 04 Aug 2026 22:28:44 +0800</pubDate></item><item><title>365秒完整版手舞视频，从零基础到流畅表演的保姆级教程（Golang视角）</title><link>http://www.lostfawn.cn/?id=1701</link><description>&lt;h2&gt;为什么我用Golang来研究手舞视频？先说说我的“笨办法”&lt;/h2&gt;
&lt;p&gt;你可能觉得奇怪,一个搞编程的，怎么跟“365秒完整版手舞视频”杠上了？其实我一开始就是拍着玩，结果发现抖音上那些手舞视频看着简单，自己一录就废，后来我干脆写了个Golang小程序，把视频逐帧拆解，用&lt;strong&gt;像素差算法&lt;/strong&gt;计算手部运动轨迹，然后对照着练，这一练，还真练出点门道来——原来手舞的核心不在“手”，而在“节奏感”和“肌肉记忆”。&lt;/p&gt;

&lt;p&gt;我说的这个“365秒完整版”，指的是那种&lt;strong&gt;时长恰好6分05秒&lt;/strong&gt;，从热身到分解教学再到连贯演示全覆盖的版本，网上大多数教程都是片段，要么只教高潮部分，要么就给你个15秒的燃向剪辑，学完了你还是不会跳整支，今天我就用写代码的思路，给你拆解这365秒到底该怎么啃下来。&lt;/p&gt;

&lt;h2&gt;第一步：把365秒当成你写的第一个程序——先跑通，再优化&lt;/h2&gt;
&lt;p&gt;学手舞最大的误区是什么？就是上来就对着原视频1倍速跟练，跟上10秒就跟丢了，我写Golang的时候有个习惯：&lt;strong&gt;先写一个能运行的版本，哪怕逻辑再烂&lt;/strong&gt;，学手舞也是，你先别管动作标不标准，把365秒完整版从头到尾“划拉”一遍，像个机器人一样把每个八拍的主动作记下来。&lt;/p&gt;

&lt;p&gt;你可以建个表格,像我这样：&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr class=&quot;firstRow&quot;&gt;
&lt;th&gt;时间段&lt;/th&gt;
&lt;th&gt;节拍&lt;/th&gt;
&lt;th&gt;主动作&lt;/th&gt;
&lt;th&gt;手部轨迹关键词&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0:00-0:30&lt;/td&gt;
&lt;td&gt;热身&lt;/td&gt;
&lt;td&gt;肩部环绕+手腕拉伸&lt;/td&gt;
&lt;td&gt;画圈、波浪&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0:30-1:20&lt;/td&gt;
&lt;td&gt;第一段&lt;/td&gt;
&lt;td&gt;交叉挥手+头顶击掌&lt;/td&gt;
&lt;td&gt;直线、对称&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1:20-2:10&lt;/td&gt;
&lt;td&gt;第二段&lt;/td&gt;
&lt;td&gt;侧身推掌+指尖绕环&lt;/td&gt;
&lt;td&gt;水平、螺旋&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2:10-3:00&lt;/td&gt;
&lt;td&gt;副歌高潮&lt;/td&gt;
&lt;td&gt;快速抖动+双手开花&lt;/td&gt;
&lt;td&gt;高频、放射&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3:00-3:50&lt;/td&gt;
&lt;td&gt;第三段&lt;/td&gt;
&lt;td&gt;下蹲划水+举臂伸展&lt;/td&gt;
&lt;td&gt;弧线、抛物线&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3:50-4:40&lt;/td&gt;
&lt;td&gt;过度&lt;/td&gt;
&lt;td&gt;慢速八拍+呼吸调整&lt;/td&gt;
&lt;td&gt;波浪、舒缓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4:40-5:30&lt;/td&gt;
&lt;td&gt;第四段&lt;/td&gt;
&lt;td&gt;组合动作（前两段融合）&lt;/td&gt;
&lt;td&gt;混合轨迹&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5:30-6:05&lt;/td&gt;

&lt;td&gt;定点造型+微笑收势&lt;/td&gt;
&lt;td&gt;突然静止&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这个表格不用记太详细,重点是你得知道&lt;strong&gt;第几分几秒大概在干嘛&lt;/strong&gt;，这就好比你在Golang里知道了main函数在哪，先学会调用，不用管内部实现。&lt;/p&gt;

&lt;h2&gt;第二步：用“分而治之”思想拆解那最难啃的副歌部分&lt;/h2&gt;
&lt;p&gt;我敢打赌,你卡住的地方一定是2:10到3:00这50秒，为什么？因为这里的手部动作频率突然变快，屏幕上那个小姐姐的手都快残影了，别慌，我用归并排序的思路教你拆：&lt;/p&gt;

&lt;h3&gt;先把副歌拆成5个10秒的“函数”&lt;/h3&gt;
&lt;p&gt;每个10秒其实就是一个&lt;strong&gt;独立的手势短语&lt;/strong&gt;，你去看慢放版，0.25倍速下，你会发现所谓的“快速抖动”其实就是“握拳→张开→握拳→张开”，只不过频率加倍，所以你的任务是：&lt;strong&gt;先记手势，再记方向，最后才练速度&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;我做了个实验,用Golang写了个随机运动轨迹生成器，模拟手部五个关键点（指尖、掌心、手腕、肘部、肩部）的运动，跑完几百组数据后发现，&lt;strong&gt;手舞好看的秘诀是“手指的领先性”&lt;/strong&gt;——也就是说，手指尖要先动，然后带动手腕，最后才是手臂，你观察那些专业舞者，他们的手腕总是滞后于指尖大约&lt;strong&gt;80到120毫秒&lt;/strong&gt;，这个时间差你感觉不出来，但拍下来对比，就是天壤之别。&lt;/p&gt;

&lt;p&gt;所以从今天开始,练副歌别急着跟节奏，你打开手机慢动作拍摄，&lt;strong&gt;专门拍手指尖的轨迹&lt;/strong&gt;，跟着视频练，确保你的指尖轨迹和他屏幕上小姐姐的指尖轨迹&lt;strong&gt;在空间上一致&lt;/strong&gt;，而不是在时间上一致，空间对了，时间自然就对了。&lt;/p&gt;

&lt;h2&gt;第三步：把365秒完整版视频“倒着放”——反向训练法&lt;/h2&gt;
&lt;p&gt;这招是我从Golang的&lt;strong&gt;逆波兰表达式&lt;/strong&gt;里悟出来的，你想啊，如果你写代码时遇到语法错误，你有时候需要从后往前读代码，才能发现哪儿缺了个括号，手舞也一样，你正着学老在第20秒卡住，那你就&lt;strong&gt;试着从第365秒开始往前倒着做动作&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;具体操作如下：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;先看最后10秒（5:55-6:05），学那个定点造型，这很简单，通常就是个张开双臂的微笑。&lt;/li&gt;
&lt;li&gt;然后你看5:45-5:55的动作为，发现它是“收臂→转身→定格”三部曲，你倒着做：定格→转身→收臂。&lt;/li&gt;
&lt;li&gt;一点点往前推,你会发现大脑的&lt;strong&gt;记忆负担突然变小了&lt;/strong&gt;——因为倒着学，你永远是在“接上一个动作”，而不是“往下顺动作”，手舞的难点恰恰是“动作之间的衔接”，倒着练正好把衔接点变成起始点。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;我用这个方法,花了3天就啃下了副歌那段，正着学的时候，我看了不下50遍视频，还是会在第三秒就乱，倒着学，每天1小时，第三天就能顺畅地倒着跳一遍，倒着顺了，正着就是纯“推演”，丝滑得不行。&lt;/p&gt;

&lt;h2&gt;第四步：利用“暴力枚举法”检查你自己的动作库&lt;/h2&gt;
&lt;p&gt;Golang里有个简单的排序算法叫冒泡排序,效率不高，但直观，你练手舞时，别一个个动作抠，直接用&lt;strong&gt;手机支架把你自己录像&lt;/strong&gt;，然后和原版365秒视频&lt;strong&gt;并排播放&lt;/strong&gt;，每秒钟暂停一次，对比你俩的手部位置差异，这不是吹毛求疵，而是很多动作，双手开花”，你以为你做对了，其实你的手只开到了45度，人家开到了75度。&lt;/p&gt;

&lt;p&gt;给你看个我自己整理的常见误差表：&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr class=&quot;firstRow&quot;&gt;
&lt;th&gt;常见动作&lt;/th&gt;
&lt;th&gt;新手常见错误&lt;/th&gt;
&lt;th&gt;原版角度/位置&lt;/th&gt;
&lt;th&gt;纠正方法&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;头顶击掌&lt;/td&gt;
&lt;td&gt;手肘外扩&amp;gt;90度&lt;/td&gt;
&lt;td&gt;手肘微内收75度&lt;/td&gt;
&lt;td&gt;对着镜子练肘部夹角&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;侧推掌&lt;/td&gt;
&lt;td&gt;手掌高度在胸口&lt;/td&gt;
&lt;td&gt;手掌高度在锁骨&lt;/td&gt;
&lt;td&gt;目视前方，用余光定位&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;快速抖动&lt;/td&gt;
&lt;td&gt;肘部僵硬&lt;/td&gt;
&lt;td&gt;肘部微屈放松&lt;/td&gt;
&lt;td&gt;想象手里握着个鸡蛋&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;下蹲划水&lt;/td&gt;
&lt;td&gt;上半身前倾&lt;/td&gt;
&lt;td&gt;保持背部直立&lt;/td&gt;
&lt;td&gt;贴墙练蹲起&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;指尖绕环&lt;/td&gt;
&lt;td&gt;手心朝下绕&lt;/td&gt;
&lt;td&gt;手心朝上绕&lt;/td&gt;
&lt;td&gt;多看慢放版&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;我拿这个表逐帧检查,发现我最大的问题不是动作不到位，而是&lt;strong&gt;动作之间的“过渡帧”完全丢掉了&lt;/strong&gt;，比如从“交叉挥手”变成“头顶击掌”，中间应该有个“手在脸颊旁短暂停留”的缓冲，我直接“唰”地就上去了，所以视频里看起来像抽风。&lt;strong&gt;过渡动作决定了一个手舞视频的质感&lt;/strong&gt;，比主动作还重要。&lt;/p&gt;

&lt;h2&gt;第五步：写个Golang小工具来“听”节拍，而不是“看”节拍&lt;/h2&gt;
&lt;p&gt;这是我最想分享的干货,我发现365秒完整版手舞视频，它的背景音乐 &lt;strong&gt;BPM（拍数每分钟）大概是128&lt;/strong&gt;，你可以手动算，但我嫌烦，就用Golang写了个简单的节拍检测器，它读取音频文件，计算能量峰值，然后把节拍点打印出来，原理不复杂，就是用&lt;code&gt;go-audio&lt;/code&gt;库读取PCM数据，然后做短时傅里叶变换，但这不重要，重要的是——&lt;strong&gt;当你把节拍点做成一个“哔哔”声循环播放&lt;/strong&gt;，你练舞就变成了“跟着哔哔声做动作”，而不是跟着音乐做动作。&lt;/p&gt;

&lt;p&gt;这有什么用？因为音乐有旋律、有歌词、有底鼓，这些都会干扰你对节拍的判断，但纯节拍声是&lt;strong&gt;单一维度的信息&lt;/strong&gt;，你只需要在那个点上出手，练熟了之后，你再换回原版音乐，你会觉得&lt;strong&gt;音乐突然变慢了&lt;/strong&gt;——其实就是你的肌肉记忆已经精确到了毫秒级。&lt;/p&gt;

&lt;p&gt;128 BPM意味着每拍约468毫秒，而一个手部动作的完成，从启动到到位，大约需要&lt;strong&gt;280到350毫秒&lt;/strong&gt;，这意味着你每拍只能做1个到1.5个动作，很多新手觉得赶不上，就是因为试图在一拍里塞2个动作，正确做法是&lt;strong&gt;一拍一动，老老实实&lt;/strong&gt;，我那个工具打印出来的节拍表，我打印出来贴在墙上，对着做手指开合练习，两周后手速肉眼可见地提升了。&lt;/p&gt;

&lt;h2&gt;第六步：关于这365秒里那些容易被无视的“冷知识”&lt;/h2&gt;
&lt;p&gt;可能不在教学序列里,但很重要，我这个强迫症把365秒视频逐帧分析了一遍，发现几个反常识的点：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;第一，视频第183秒（正好是峰值）那里，舞者的无名指和中指是刻意分开的。&lt;/strong&gt; 你去看普通人的手舞，五指基本贴在一起，而专业手舞视频里，无名指单独上翘的动作频率占了总动作的12%，这个细节你学不来？没关系，你可以&lt;strong&gt;刻意练“第四指独立性”&lt;/strong&gt;——用橡皮筋绑住其他四指，只让无名指上下点，练一周，你的手指分离度就会提高。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;第二，完整版视频里，舞者的视线几乎不看镜头。&lt;/strong&gt; 她一直往右前方45度看，这个是为了&lt;strong&gt;配合手部动作的摆动方向&lt;/strong&gt;，让视觉重心更稳，你如果死盯着镜头，注意力就会被分散，手部动作反而容易走形。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;第三，365秒里包含了3次深呼吸的停顿。&lt;/strong&gt; 每次约2秒，总时长为6秒，这6秒不是让你站桩，而是用“肩下沉”来复位手臂肌肉，你可以把这三处当成天然的“分页符”，每学完一段，停下来，抖抖手，再继续下一段。&lt;/p&gt;

&lt;h2&gt;第七步：从第1秒到第365秒，每天该练什么？我给你排个计划表&lt;/h2&gt;
&lt;p&gt;这不是课表,是个参考，我是按照&lt;strong&gt;Golang的测试驱动开发（TDD）&lt;/strong&gt; 思路来的：先写测试（动作标准），再写实现（动作练习），最后重构（跟原版匹配）。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;第1到3天&lt;/strong&gt;：只看视频，不做动作，定帧看0到30秒的手部特写，手放在膝盖上，&lt;strong&gt;想象&lt;/strong&gt;你的手跟着动，这叫“心理演练”，神经科学研究表明这能激活运动皮层。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第4到7天&lt;/strong&gt;：只练0到30秒的热身动作，要求：动作幅度超过原版80%即可，不追求好看。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第8到15天&lt;/strong&gt;：啃下0到90秒（热身+第一段），每天完整跟练5遍，每遍间隔5分钟，期间用慢放0.5倍速跟练1遍。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第16到20天&lt;/strong&gt;：挑战副歌前奏（90到130秒）。&lt;strong&gt;卡住就别硬跟&lt;/strong&gt;，直接切回慢放，把卡住的10秒单独循环。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第21到30天&lt;/strong&gt;：正式挑战完整365秒跟练，这时候你不需要看分解动作了，直接从头跟到尾，卡住了就停下，回看那10秒，然后继续。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我本人就是第26天才勉强跟完一整遍,第30天才能做到&lt;strong&gt;不掉拍&lt;/strong&gt;，所以你要是一星期就学会了，要么是天赋异禀，要么就是你看的是剪辑版的15秒视频。&lt;/p&gt;

&lt;h2&gt;最后留个话头：手舞这东西，其实是“练脑”大于“练手”&lt;/h2&gt;
&lt;p&gt;我码字这会儿,Golang程序还在后台跑着分析我第七遍练习视频的数据，你看，我用了这么多编程的笨办法去学一个手舞视频，听起来很荒谬，但真的管用。&lt;strong&gt;因为手舞不仅仅是肌肉记忆，更多的是一种“模式识别”能力&lt;/strong&gt;——你需要在极短时间内判断“现在这个手势之后，大概率接什么手势”，这个模式识别，跟编程里的正则表达式匹配、跟编译原理里的词法分析，本质上没什么不同。&lt;/p&gt;

&lt;p&gt;你要是也卡在某个动作上过不去,不妨试试“倒着练”，或者“一拍一动”，或者干脆“盯着指尖轨迹不看手”，这些招式不一定全对，但总有一个能让你茅塞顿开，我现在还在抠那个副歌的“双手开花”动作，每次做到第17秒的时候左手还是会慢了半拍，但这反而让我觉得有趣——连机器都测出我的误差了，那我就继续练呗，看哪天它能给我报个100%匹配。&lt;/p&gt;

&lt;p&gt;好了,你得视频那个画面又在我脑子里转了，我去照着练一遍，这次试试把眼睛闭上跳完最后10秒，你如果也在练，不妨告诉我你卡在第几秒，咱们下次再聊。&lt;/p&gt;
&lt;p style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;http://www.lostfawn.cn/zb_users/upload/2026/08/20260804172904178583574465535.jpg&quot; alt=&quot;365秒完整版手舞视频，从零基础到流畅表演的保姆级教程（Golang视角）&quot; title=&quot;365秒完整版手舞视频，从零基础到流畅表演的保姆级教程（Golang视角）&quot; /&gt;&lt;/p&gt;
</description><pubDate>Tue, 04 Aug 2026 17:29:00 +0800</pubDate></item><item><title>用Golang给TA写个在一起365天视频模板，代码比情话还实在</title><link>http://www.lostfawn.cn/?id=1700</link><description>&lt;h2&gt;为什么非要用Golang搞这个视频模板？&lt;/h2&gt;
&lt;p&gt;兄弟，你是不是也刷到过那种“恋爱365天纪念日”的短视频？满屏粉红泡泡，背景音乐一响，照片一张张翻过去，但你想过没有——&lt;strong&gt;这些视频背后，其实全是重复劳动&lt;/strong&gt;，今天这个模板，明天那个模板，换个照片换个名字,本质都一样。&lt;/p&gt;

&lt;p&gt;我去年跟女朋友在一起第300天的时候，就想做个专属视频，但用剪映吧，手动拖素材能把我手指头磨出茧子；用Python吧，她又不懂代码，以后想自己改点东西还得求我，最后我拍板：&lt;strong&gt;用Go写个命令行工具，一条命令生成完整视频&lt;/strong&gt;，为啥？因为Go编译出来是个干净的可执行文件，她双击就能跑，不需要装Python环境,不需要配依赖。&lt;/p&gt;

&lt;p&gt;这就是我写这个模板的初衷——&lt;strong&gt;用工程思维解决浪漫问题&lt;/strong&gt;，今天把这套东西拆开给你看，顺便聊聊怎么用Golang把“365天”这个数字玩出花来。&lt;/p&gt;

&lt;h2&gt;先理清楚：这个模板到底要产出什么？&lt;/h2&gt;
&lt;p&gt;动手写代码之前，你得先搞清楚需求,我当初列了个清单：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;输入&lt;/strong&gt;：一对情侣的照片（按日期命名，&lt;code&gt;2024-01-15.jpg&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;输出&lt;/strong&gt;：一个MP4视频，每张照片停留3秒，底部滚动显示“第XX天”的文字&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;附加&lt;/strong&gt;：开头有标题“我们在一起的第365天”，结尾有“未完待续”&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;技术指标&lt;/strong&gt;：1080p分辨率，30fps，兼容主流手机播放&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;看着简单吧？但真要实现，坑不少，比如Go标准库不直接支持视频编码，你得借助FFmpeg，这里我推荐用 &lt;code&gt;github.com/u2takey/ffmpeg-go&lt;/code&gt; 这个库，封装得挺干净,比直接调命令行参数强多了。&lt;/p&gt;

&lt;h2&gt;第一步：用Go生成照片序列的“时间轴”&lt;/h2&gt;
&lt;p&gt;你别想着一口气生成视频，FFmpeg吃的是图片序列+音频流，所以咱们得先把照片按时间顺序排好,生成一个文本清单。&lt;/p&gt;

&lt;pre class=&quot;brush:go;toolbar:false&quot;&gt;func buildImageList(dir string) ([]string, error) {
    files, _ := filepath.Glob(filepath.Join(dir, &amp;quot;*.jpg&amp;quot;))
    sort.Strings(files) // 按文件名排序，因为日期在文件名里
    return files, nil
}&lt;/pre&gt;
&lt;p&gt;但这里有个坑：如果照片是 &lt;code&gt;2024-01-02.jpg&lt;/code&gt; 和 &lt;code&gt;2024-01-10.jpg&lt;/code&gt;，字符串排序没问题，可要是你哪天漏拍了，日期断档了，那就得处理“第X天没有照片”的情况，我当时的策略是：&lt;strong&gt;没照片的日子用上一张重复，但打个半透明水印“这天偷懒没拍”&lt;/strong&gt;，哈哈，真实生活嘛,总有那么几天懒得化妆。&lt;/p&gt;

&lt;h2&gt;第二步：动态生成文字渲染——用Go的image包画字幕&lt;/h2&gt;
&lt;p&gt;FFmpeg的drawtext滤镜虽好，但中文字体路径乱七八糟的，在Windows上尤其麻烦，我干脆用Go的 &lt;code&gt;image&lt;/code&gt; + &lt;code&gt;image/draw&lt;/code&gt; 包，先把文字画到PNG上,再把PNG作为覆盖层叠到照片上。&lt;/p&gt;

&lt;pre class=&quot;brush:go;toolbar:false&quot;&gt;func drawTextOverlay(imgPath string, day int, outputPath string) {
    // 打开原图
    img, _ := loadImage(imgPath)
    // 创建画布，尺寸一样
    canvas := image.NewRGBA(img.Bounds())
    // 底部画个半透明黑条
    draw.Draw(canvas, canvas.Bounds(), &amp;amp;image.Uniform{C: color.RGBA{0,0,0,180}}, image.Point{}, draw.Over)
    // 写文字：&amp;quot;Day 365&amp;quot;
    font := loadFont(&amp;quot;msyh.ttf&amp;quot;) // 微软雅黑，Windows自带
    point := ftfont.NewFace(font, &amp;amp;ftfont.Options{Size: 48})
    drawText(canvas, fmt.Sprintf(&amp;quot;Day %d&amp;quot;, day), point, 50, 100)
    // 保存为新图
    savePNG(outputPath, canvas)
}&lt;/pre&gt;
&lt;p&gt;这里有个细节得注意：&lt;strong&gt;加载字体&lt;/strong&gt;，Go的 &lt;code&gt;golang.org/x/image/font&lt;/code&gt; 包需要你提供字体文件路径，Windows上直接拿 &lt;code&gt;C:\Windows\Fonts\msyh.ttf&lt;/code&gt; 就行，但要判断文件存在，Mac上就是 &lt;code&gt;/System/Library/Fonts/PingFang.ttc&lt;/code&gt;，你要是怕麻烦，去GitHub搜个开源中文字体放项目里也行，但注意版权——思源黑体是开源可商用的,推荐。&lt;/p&gt;

&lt;h2&gt;第三步：让FFmpeg把图片序列变成视频&lt;/h2&gt;
&lt;p&gt;到这一步，你已经有了所有带日期的PNG图片，接下来就是调用FFmpeg合成视频，用 &lt;code&gt;ffmpeg-go&lt;/code&gt; 库,代码比命令行还清晰：&lt;/p&gt;

&lt;pre class=&quot;brush:go;toolbar:false&quot;&gt;func buildVideo(images []string, output string) {
    err := ffmpeg.
        Input(&amp;quot;frames/%06d.png&amp;quot;, ffmpeg.KwArgs{&amp;quot;framerate&amp;quot;: 1}).
        Output(output, ffmpeg.KwArgs{
            &amp;quot;c:v&amp;quot;: &amp;quot;libx264&amp;quot;,
            &amp;quot;pix_fmt&amp;quot;: &amp;quot;yuv420p&amp;quot;,
            &amp;quot;vf&amp;quot;: &amp;quot;scale=1920:1080&amp;quot;,
            &amp;quot;r&amp;quot;: 30,
        }).
        OverWriteOutput().
        Run()
    if err != nil {
        log.Fatal(&amp;quot;视频生成失败:&amp;quot;, err)
    }
}&lt;/pre&gt;
&lt;p&gt;但这里有个大坑：&lt;strong&gt;帧率与停留时间的矛盾&lt;/strong&gt;，如果你把每张图片设为1帧，那播放速度就是1秒1张，想每张停留3秒？两种办法：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;把帧率设为1/3，但FFmpeg不支持小数帧率&lt;/li&gt;
&lt;li&gt;更稳妥：&lt;strong&gt;每张照片在Go里重复生成3帧&lt;/strong&gt;，然后总帧率设30，那么每张实际播放就是3秒&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我一开始用的第一种，结果视频播放时一顿一顿的，后来改成第二种，顺畅多了，代价是磁盘空间多了点,但咱不在乎那几百MB。&lt;/p&gt;

&lt;h2&gt;第四步：加上音乐和转场效果——别让视频干巴巴的&lt;/h2&gt;
&lt;p&gt;光有照片和文字太单调了，我从 &lt;code&gt;freepd.com&lt;/code&gt; 下了一首CC0授权的轻音乐,用FFmpeg混流进去：&lt;/p&gt;

&lt;pre class=&quot;brush:go;toolbar:false&quot;&gt;func addAudio(videoPath, audioPath, outputPath string) {
    err := ffmpeg.
        Input(videoPath).
        Input(audioPath).
        Output(outputPath, ffmpeg.KwArgs{
            &amp;quot;c:v&amp;quot;: &amp;quot;copy&amp;quot;,
            &amp;quot;c:a&amp;quot;: &amp;quot;aac&amp;quot;,
            &amp;quot;shortest&amp;quot;: true,
        }).
        OverWriteOutput().
        Run()
}&lt;/pre&gt;
&lt;p&gt;转场效果呢？我偷懒了——&lt;strong&gt;没用交叉淡化&lt;/strong&gt;，而是用Go在两张图之间生成中间帧（比如从黑到亮渐入），方法也不难：读取两张图，线性插值像素值，生成10帧过渡帧，效果嘛，有点类似老式幻灯片切换,但胜在代码简单。&lt;/p&gt;

&lt;h2&gt;进阶玩法：把“365天”变成一个可配置参数&lt;/h2&gt;
&lt;p&gt;你可能会说：“我只想做100天的视频，难道要改代码？”不用，我写了个 &lt;code&gt;config.json&lt;/code&gt;：&lt;/p&gt;

&lt;pre class=&quot;brush:json;toolbar:false&quot;&gt;{
  &amp;quot;totalDays&amp;quot;: 365,: &amp;quot;我们的365天&amp;quot;,
  &amp;quot;subtitle&amp;quot;: &amp;quot;从春天到下一个春天&amp;quot;,
  &amp;quot;fontPath&amp;quot;: &amp;quot;fonts/source-han-sans.otf&amp;quot;,
  &amp;quot;photoDir&amp;quot;: &amp;quot;./photos&amp;quot;,
  &amp;quot;outputDir&amp;quot;: &amp;quot;./output&amp;quot;,
  &amp;quot;musicPath&amp;quot;: &amp;quot;./music/romantic.mp3&amp;quot;,
  &amp;quot;resolution&amp;quot;: &amp;quot;1920x1080&amp;quot;,
  &amp;quot;framePerPhoto&amp;quot;: 90
}&lt;/pre&gt;
&lt;p&gt;主程序读取配置，&lt;/p&gt;

&lt;pre class=&quot;brush:go;toolbar:false&quot;&gt;type Config struct {
    TotalDays    int    `json:&amp;quot;totalDays&amp;quot;`       string `json:&amp;quot;title&amp;quot;`
    Subtitle     string `json:&amp;quot;subtitle&amp;quot;`
    FontPath     string `json:&amp;quot;fontPath&amp;quot;`
    PhotoDir     string `json:&amp;quot;photoDir&amp;quot;`
    OutputDir    string `json:&amp;quot;outputDir&amp;quot;`
    MusicPath    string `json:&amp;quot;musicPath&amp;quot;`
    Resolution   string `json:&amp;quot;resolution&amp;quot;`
    FramePerPhoto int   `json:&amp;quot;framePerPhoto&amp;quot;`
}&lt;/pre&gt;
&lt;p&gt;你只要改这个JSON，不管做30天还是1000天,都行。&lt;/p&gt;

&lt;h2&gt;写完代码，我踩过哪些坑？&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;中文路径&lt;/strong&gt;：Windows下如果照片文件夹在桌面，路径里有中文，FFmpeg可能乱码，解决方案：全部用相对路径，或转成  分隔的绝对路径，并加上 &lt;code&gt;filepath.ToSlash()&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内存溢出&lt;/strong&gt;：如果你有几千张照片，一次性加载所有图片再处理，内存直接爆炸，我改成&lt;strong&gt;流式处理&lt;/strong&gt;：处理完一张，写入临时文件夹,释放内存。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;时间戳精度&lt;/strong&gt;：如果你拍了照片但Exif信息不准，按文件名排序可能乱，我加了 &lt;code&gt;time.Parse&lt;/code&gt; 解析文件名，如果解析失败就回退到Exif，要是还没，就归入“未分类”文件夹。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;实战演示：一条命令生成36个视频碎片&lt;/h2&gt;
&lt;p&gt;我女朋友有个习惯，喜欢把每个月的纪念视频单独存，我做了个变体：&lt;strong&gt;按月份分割，每个月生成一个短视频&lt;/strong&gt;，最后再合并，用Go的 &lt;code&gt;filepath.Walk&lt;/code&gt; 按月分组，然后并发调用 &lt;code&gt;buildVideo&lt;/code&gt;——Go的goroutine这时候就派上用场了。&lt;/p&gt;

&lt;pre class=&quot;brush:go;toolbar:false&quot;&gt;var months map[string][]string
for _, path := range files {
    monthKey := path[:7] // 2025-01
    months[monthKey] = append(months[monthKey], path)
}
var wg sync.WaitGroup
for k, paths := range months {
    wg.Add(1)
    go func(key string, ps []string) {
        defer wg.Done()
        buildVideo(ps, fmt.Sprintf(&amp;quot;output/%s.mp4&amp;quot;, key))
    }(k, paths)
}
wg.Wait()&lt;/pre&gt;
&lt;p&gt;6核CPU下，36个月份视频并行生成，总共花了不到两分钟，要是单线程,得等十分钟。&lt;/p&gt;

&lt;h2&gt;把视频变成“可编程”的：加入日期计数动画&lt;/h2&gt;
&lt;p&gt;最后我想加个细节：&lt;strong&gt;在视频右下角实时显示“在一起第X天”的计数&lt;/strong&gt;，不是死文字，而是&lt;strong&gt;每天自动更新&lt;/strong&gt;的数字动画，这其实是用Go生成一个 &lt;code&gt;counter_frames&lt;/code&gt; 目录，里面存了从1到365的PNG数字,然后FFmpeg循环播放这个目录作为覆盖层。&lt;/p&gt;

&lt;pre class=&quot;brush:go;toolbar:false&quot;&gt;func generateCounter() {
    for i := 1; i &amp;lt;= 365; i++ {
        canvas := generateDigitImage(i)
        savePNG(fmt.Sprintf(&amp;quot;counter/%04d.png&amp;quot;, i), canvas)
    }
}&lt;/pre&gt;
&lt;p&gt;然后用FFmpeg的 &lt;code&gt;overlay&lt;/code&gt; 滤镜把视频和计数器叠加：&lt;/p&gt;

&lt;pre class=&quot;brush:go;toolbar:false&quot;&gt;err := ffmpeg.
    Input(&amp;quot;base.mp4&amp;quot;).
    Input(&amp;quot;counter/%04d.png&amp;quot;).
    FilterComplex(&amp;quot;overlay=W-w-20:H-h-20&amp;quot;).
    Output(&amp;quot;final.mp4&amp;quot;).
    Run()&lt;/pre&gt;
&lt;p&gt;这个计数器动画是&lt;strong&gt;独立于照片&lt;/strong&gt;的，也就是说，哪怕你某天没拍照，计数器照常走，这就把“365天”变成了一个&lt;strong&gt;动态存在感&lt;/strong&gt;,而不是被动记录。&lt;/p&gt;

&lt;h2&gt;给代码加点“温度”：错误提示也必须温柔&lt;/h2&gt;
&lt;p&gt;日常写代码，报错信息都是一脸冷漠，我重写了错误处理,让程序在崩溃时输出：&lt;/p&gt;

&lt;pre class=&quot;brush:go;toolbar:false&quot;&gt;func gracefulError(err error) {
    if err != nil {
        fmt.Println(&amp;quot;哎，遇到点小麻烦：&amp;quot;, err)
        fmt.Println(&amp;quot;不过别慌，检查一下照片文件名是不是都是 &amp;#39;YYYY-MM-DD.jpg&amp;#39; 这样的格式&amp;quot;)
        os.Exit(1)
    }
}&lt;/pre&gt;
&lt;p&gt;她第一次跑的时候，照片命名里带了个 &lt;code&gt;_副本&lt;/code&gt; 后缀，程序弹出了这个提示，她顺着看了一下文件名，立刻明白怎么改了。&lt;strong&gt;有温度的报错，比干巴巴的日志强一万倍&lt;/strong&gt;。&lt;/p&gt;

&lt;h2&gt;把EXE打包给不懂代码的她&lt;/h2&gt;
&lt;p&gt;项目做好后,我交叉编译了Windows版本：&lt;/p&gt;

&lt;pre class=&quot;brush:bash;toolbar:false&quot;&gt;CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -o daily-video.exe&lt;/pre&gt;
&lt;p&gt;然后我把 &lt;code&gt;config.json&lt;/code&gt; 和 &lt;code&gt;daily-video.exe&lt;/code&gt; 放到一个文件夹里，Zip压缩，发给她，她只需要解压，双击exe，等一分钟，视频就躺在 &lt;code&gt;output&lt;/code&gt; 文件夹里了。&lt;/p&gt;

&lt;p&gt;这种“零门槛交付”的感觉，特别像你为伴侣精心准备了一份礼物，但礼物的打开方式却毫不费力，她甚至能自己换照片、换音乐，每次生成都有新鲜感——有时候她为了让我惊喜，偷偷往文件夹里塞两张新照片，然后跟我说“帮我生成一下”。&lt;/p&gt;
&lt;p style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;http://www.lostfawn.cn/zb_users/upload/2026/08/20260804145857178582673713628.jpg&quot; alt=&quot;用Golang给TA写个在一起365天视频模板，代码比情话还实在&quot; title=&quot;用Golang给TA写个在一起365天视频模板，代码比情话还实在&quot; /&gt;&lt;/p&gt;
</description><pubDate>Tue, 04 Aug 2026 14:58:52 +0800</pubDate></item><item><title>技嘉B365M H主板安装视频，从拆机到点亮，手把手教你避坑</title><link>http://www.lostfawn.cn/?id=1699</link><description>&lt;h2&gt;为啥我要看安装视频&lt;/h2&gt;
&lt;p&gt;说实话，我第一次装技嘉B365M H这块板子的时候，心里也是打鼓的，别看网上教程一堆，真到自己动手，连螺丝刀拿哪把都得犹豫半天，这块板子属于入门级里的“万金油”，配Intel第八代、第九代CPU都行，但正因为功能全，接口多，新手反而容易懵——前面板跳线、M.2固态的固定螺丝、还有那个CPU供电的8针接口,每一个都能成为翻车点。&lt;/p&gt;

&lt;p&gt;我后来专门找了几个安装视频，&lt;strong&gt;边看边暂停&lt;/strong&gt;，反复倒回去确认细节，才算把这块板子装明白，所以这篇东西，我就把视频里关键帧的要点,用大白话给你捋一遍。&lt;/p&gt;

&lt;h2&gt;开箱第一步：别急着拆CPU，先认准这些接口&lt;/h2&gt;
&lt;p&gt;拿到技嘉B365M H，先别激动，主板拿在手里，&lt;strong&gt;第一件事是看说明书里的“接口示意图”&lt;/strong&gt;，但说句实话，那图小得跟蚂蚁似的，我建议你直接看视频里3分20秒左右的“俯视镜头”,那个角度能把CPU插槽旁边的四颗螺丝孔看得很清楚。&lt;/p&gt;

&lt;p&gt;这块板子是&lt;strong&gt;M-ATX板型&lt;/strong&gt;，装在大多数中塔机箱里都没问题,但要注意：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CPU供电&lt;/strong&gt;在左上角，是8针的，别跟主板右上角的4针（那是辅助供电，有的电源没有）搞混。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;M.2插槽&lt;/strong&gt;在PCIe x16显卡插槽的正下方，视频里会特别强调要&lt;strong&gt;先装M.2固态，再装显卡&lt;/strong&gt;，不然显卡压上去,手都伸不进去拧那颗小螺丝。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SATA接口&lt;/strong&gt;有6个，在板子右下角，弯头设计，但插的时候要&lt;strong&gt;听见“咔哒”一声&lt;/strong&gt;，视频里那个特写镜头我看了三遍才明白什么叫“插入到位”。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;装CPU和散热器：硅脂别涂太厚，真的&lt;/h2&gt;
&lt;p&gt;这里必须吐槽一下，视频里那只手涂硅脂的方式，跟挤牙膏似的，&lt;strong&gt;其实只要一粒黄豆大小就够了&lt;/strong&gt;，技嘉B365M H的CPU插槽是LGA1151，有个金属扣盖，&lt;strong&gt;打开的时候小心别碰弯针脚&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;视频里有个细节我特别想提：&lt;strong&gt;散热器底座的四颗螺丝，要按对角线顺序拧&lt;/strong&gt;，比如先拧左上、再右下、然后右上、最后左下，别傻乎乎从一边拧到底，那样CPU受力不均,开机直接温度飙升。&lt;/p&gt;

&lt;p&gt;还有个小坑：&lt;strong&gt;原装风扇的卡扣，有一边是带凹槽的&lt;/strong&gt;，视频里没强调，但我装的时候卡了十分钟,最后发现凹槽要对着内存条那边才能扣紧。&lt;/p&gt;

&lt;h2&gt;内存条：优先插2和4，别信“随便插”&lt;/h2&gt;
&lt;p&gt;技嘉B365M H有&lt;strong&gt;四条DDR4插槽&lt;/strong&gt;，颜色是黑色和灰色交替，视频里明确说了：&lt;strong&gt;如果你只插两条内存，插在灰色槽（也就是第2和第4槽）&lt;/strong&gt;，能开启双通道，要是手滑插到黑色槽，也能开机，但性能损失个5%左右，一般人感觉不出来,但跑分党会心疼。&lt;/p&gt;

&lt;p&gt;插内存的时候注意，&lt;strong&gt;那个防呆缺口偏在一侧&lt;/strong&gt;，反了插不进去，别硬怼，视频里有条弹幕说得好：“大力出奇迹是给机箱侧板的，不是给内存条的。”&lt;/p&gt;

&lt;h2&gt;跳线：最难的不是技术，是“看不清”&lt;/h2&gt;
&lt;p&gt;这块主板的&lt;strong&gt;前面板跳线&lt;/strong&gt;在右下角，针脚密得跟梳子似的，视频里最实用的部分，就是教你看&lt;strong&gt;主板上的丝印标识&lt;/strong&gt;——但说实话，那字小得我用手机放大镜才看清,我的笨办法：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;拿手机闪光灯照，斜着45度角看，能勉强认出“PWR SW”“RESET SW”“HDD LED”这些字样。&lt;/li&gt;
&lt;li&gt;把说明书里那页引脚定义&lt;strong&gt;拍张照片&lt;/strong&gt;,放大到全屏边看边插。&lt;/li&gt;
&lt;li&gt;视频里有个技巧挺好：&lt;strong&gt;先插“PWR SW”那两个脚&lt;/strong&gt;（在左上第二排的靠外侧），别的慢慢来，反正插错了顶多开机没反应,不会烧东西。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;电源接线：主板24针和CPU8针，方向对了就行&lt;/h2&gt;
&lt;p&gt;这步没什么花活，但&lt;strong&gt;注意卡扣的方向&lt;/strong&gt;，技嘉B365M H的24针供电接口带一个&lt;strong&gt;固定卡扣&lt;/strong&gt;，插进去的时候要听到“咔”一声才算锁紧，视频里重点提了一个事：&lt;strong&gt;CPU的8针供电，有的电源是4+4分体式，要合成一个整的再插&lt;/strong&gt;,而且防呆口方向是对着主板边缘的。&lt;/p&gt;

&lt;p&gt;还有一个容易被忽略的：&lt;strong&gt;主板右下角还有一个大4针的“机箱风扇供电”&lt;/strong&gt;，如果你用的是普通散热器（非RGB风扇），这里插不插都行，但如果你装了RGB风扇，得接板子上的&lt;strong&gt;12V RGB插针&lt;/strong&gt;（在内存条右侧），视频里那个特写镜头,灯珠亮起来的样子确实比纯色好看多了。&lt;/p&gt;

&lt;h2&gt;点亮之前的三次深呼吸&lt;/h2&gt;
&lt;p&gt;所有线接完，别急着盖侧板，先把电源线、显示器线（HDMI接在主板侧面的视频口，不是显卡上——如果你没装独立显卡的话）接好，&lt;strong&gt;开机试试&lt;/strong&gt;，视频里这一步特别快,但我建议你慢一点：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;第一次开机&lt;/strong&gt;：风扇没转？看主板背面有没有&lt;strong&gt;蜂鸣器&lt;/strong&gt;，如果没有，就看板子上的&lt;strong&gt;诊断LED灯&lt;/strong&gt;（在24针供电旁边），亮红灯常亮是CPU有问题,闪一下就亮内存问题。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第二次开机&lt;/strong&gt;：进BIOS后，&lt;strong&gt;先把“F2”键按烂&lt;/strong&gt;，进到设置界面，找到“Load Optimized Defaults”恢复默认设置,然后按F10保存退出。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第三次开机&lt;/strong&gt;：这会应该能进系统了，如果卡在主板LOGO界面，多半是M.2固态没认出来，去BIOS里找“CSM”设置，改成“UEFI Only”试试。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;最后说点视频里没教的&lt;/h2&gt;
&lt;p&gt;有些细节，视频里因为时长不会讲,但我觉得比装主板本身更重要：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;螺丝别拧太紧&lt;/strong&gt;，主板四角螺丝感觉“碰到金属垫片后再拧半圈”就够了,拧太猛会压弯电路板。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;理线时把机箱风扇的线走主板背面&lt;/strong&gt;，技嘉B365M H的供电接口在主板右侧边缘,线从背板绕过去会比较整齐。&lt;/li&gt;
&lt;li&gt;如果装完后发现&lt;strong&gt;鼠标键盘没反应&lt;/strong&gt;，插机箱前置USB口试试，不行就换后置接口——我之前就是前置USB3.0供电不足,折腾了半夜。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;反正装完这块板子，我最大的感受就是：&lt;strong&gt;别怕，真没那么难&lt;/strong&gt;，视频看两遍，手边放个十字螺丝刀，照着一步步来，基本半小时能搞定，要是中途卡住了，就暂停视频，对着主板的丝印慢慢看，总比瞎猜强，技嘉这块板子的BIOS界面其实挺友好的，中文菜单，选项也都在明面上,不像某些牌子非要藏到子菜单里。&lt;/p&gt;

&lt;p&gt;行了，就说这么多，接下来该你上手了——工具都准备好了吧？&lt;/p&gt;
&lt;p style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;http://www.lostfawn.cn/zb_users/upload/2026/08/20260804122850178581773048782.jpg&quot; alt=&quot;技嘉B365M H主板安装视频，从拆机到点亮，手把手教你避坑&quot; title=&quot;技嘉B365M H主板安装视频，从拆机到点亮，手把手教你避坑&quot; /&gt;&lt;/p&gt;
</description><pubDate>Tue, 04 Aug 2026 12:28:47 +0800</pubDate></item><item><title>365场新冠发布会视频，我们到底在围观什么？</title><link>http://www.lostfawn.cn/?id=1698</link><description>&lt;h2&gt;一个普通人的365天围观记录&lt;/h2&gt;
&lt;p&gt;说来有点不好意思,我手机里存着365场新冠发布会视频的截图，不是刻意收藏，就是每次发布会结束随手截一张，结果攒着攒着，居然凑满了一年。&lt;/p&gt;

&lt;p&gt;刚开始看发布会纯粹是因为焦虑,2020年初那会儿，谁不是天天刷手机等消息？后来慢慢变成了习惯，就像追一部超长连续剧，我甚至能分辨出每位发言人的声音——谁的语气更严肃，谁今天可能带来了坏消息，谁在刻意回避问题。&lt;/p&gt;

&lt;p&gt;但真正让我想写这篇文章的,是上个月在地铁上听到两个大爷聊天，一个说：“现在谁还看发布会啊？”另一个接：“看了也白看，反正都是那套话。”我突然意识到，&lt;strong&gt;365场发布会视频&lt;/strong&gt;已经成了一个奇特的文化符号——有人当精神支柱，有人觉得是形式主义，但很少有人认真拆解过：这些视频里到底有什么，为什么我们离不开它，又为什么开始厌倦它？&lt;/p&gt;

&lt;h2&gt;数据不会说谎：我们真的看了365场&lt;/h2&gt;
&lt;p&gt;先做个简单的算术题,从2020年1月20日国家卫健委首次通报疫情，到2021年初，全国31个省份加国家层面，平均每天不止一场发布会，光武汉市就开了超过100场，这还不算各市县自己组织的。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;国家级发布会&lt;/strong&gt;从一开始就是最高规格的，钟南山、王辰、张文宏这些名字，就是通过发布会走进千家万户的，我记得很清楚，2020年2月18日那场，王辰院士说“拐点无法预测”的时候，直播间弹幕瞬间安静了，那种沉默比任何恐慌都真实。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;省级发布会&lt;/strong&gt;反而是最接地气的，广东的发布会永远最快，浙江的总带着数字报表，湖北早期则像挤牙膏，有段时间我专门对比着看，发现一个规律：越早学会“说人话”的省份，当地民众的配合度越高，这不是我瞎编的，2020年《新闻与传播研究》上有一篇论文专门分析过这个现象。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;市级发布会&lt;/strong&gt;就更有意思了，有的市长全程念稿，有的副市长能脱稿讲20分钟，有的发布会开着开着现场接听市民热线，这些真实瞬间，比任何剧本都精彩，所以你看，这365场视频根本不是单调重复，而是一本研究中国基层治理的裸眼3D教科书。&lt;/p&gt;

&lt;h2&gt;那些“没说出口”的信息&lt;/h2&gt;
&lt;p&gt;看发布会多了,你会练出一种特殊能力：&lt;strong&gt;听懂弦外之音&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;比如措辞变化,早期发布会喜欢说“可防可控”，后来变成“存在扩散风险”，再后来是“形势严峻”，最后是“前所未有的挑战”，这五个词的变化，就是整场疫情的体温计。&lt;/p&gt;

&lt;p&gt;还有座位安排,如果某天卫健委的主任亲自出席，那准有大事，如果是例行发布，来的多半是“相关司局负责人”，位置谁挨着谁，谁先发言，谁后补充，这都是信号，别笑，研究这些的人真不少，知乎上甚至有“发布会座位学”的标签。&lt;/p&gt;

&lt;p&gt;最微妙的是记者的提问,2021年那场关于疫苗加强针的发布会上，有记者问：“第三针到底算加强还是重复？”这个问题其实带了不少情绪，发言人回答得很巧妙：“在科学上，我们叫加强免疫。”你看，又是“科学”这个挡箭牌，这种对话每天都在发生，&lt;strong&gt;发布会早就不是单向传播，而是政府与民众的试探性博弈&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;我特别欣赏那些被问到“张张嘴”问题时的瞬间，比如有个记者问：“网传武汉某小区团购存在猫腻，请问属实吗？”发言人愣了一下，说：“我们正在核实。”这四秒钟的停顿，比任何官方说辞都诚实。&lt;/p&gt;

&lt;h2&gt;生活还在继续：发布会之外的我们&lt;/h2&gt;
&lt;p&gt;说了这么多专业分析,其实最触动我的还是发布会里的“人”。&lt;/p&gt;

&lt;p&gt;记得2020年3月,一位社区干部在发布会上讲怎么给隔离户送菜，她说：“有些老人不会用手机，我们就隔门喊话，问今天想吃什么。”她穿着红马甲，袖口有点脏，说到一半声音哑了，那场发布会没有专家，没有数据，但弹幕里全是“辛苦了”。&lt;/p&gt;

&lt;p&gt;还有2022年春天,上海那场发布会，发言人提到“我们注意到部分市民反映买菜难”，然后他停了两秒，就这两秒，比任何道歉都沉重，后来第二天，社区团购政策就调整了。&lt;/p&gt;

&lt;p&gt;这些瞬间让我明白,&lt;strong&gt;365场发布会视频&lt;/strong&gt;之所以重要，不是因为它教会了我们多少防疫知识，而是它提供了一个共同情绪的容器，我们可能记不住具体的防控政策，但一定记得那些“哽咽的瞬间”“沉默的镜头”“突然调整的语速”，这些碎片拼在一起，才构成了我们对那段日子的完整记忆。&lt;/p&gt;

&lt;h2&gt;现在再看，心态完全不同了&lt;/h2&gt;
&lt;p&gt;说实话,我现在回看这些视频，心态早就变了，最初想找答案，后来想找安慰，现在更像是在翻一本历史相册。&lt;/p&gt;

&lt;p&gt;我的手机里到现在还存着那句话：“每一次发布会，都是与公众的一次对话。”这话是卫健委一位不愿具名的官员私下说的，他说：“我们其实心里清楚，大家不只听你想说什么，更想听你没说什么，但有些话，得等时间到了才能说。”&lt;/p&gt;

&lt;p&gt;关于这365场视频,我听到过一个最扎心的评价：“&lt;strong&gt;看发布会就像看天气预报，明知道预报也可能不准，但总要有人报。&lt;/strong&gt; ”这话不完美，但真实感拉满。&lt;/p&gt;

&lt;p&gt;朋友,如果你也曾在深夜反复拖动发布会进度条，或者因为某位专家的一句话失眠，又或者因为某个发布会细节跟家人争论——那你应该懂我写了这么多到底想表达什么，我们围观的从来不是发布会本身，而是&lt;strong&gt;不确定世界里那个试图提供确定性的身影&lt;/strong&gt;，不管这个身影清晰还是模糊，它毕竟365天没缺席过。&lt;/p&gt;

&lt;p&gt;这本身就说明了一些事。&lt;/p&gt;
&lt;p style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;http://www.lostfawn.cn/zb_users/upload/2026/08/20260804072843178579972336381.jpg&quot; alt=&quot;365场新冠发布会视频，我们到底在围观什么？&quot; title=&quot;365场新冠发布会视频，我们到底在围观什么？&quot; /&gt;&lt;/p&gt;
</description><pubDate>Tue, 04 Aug 2026 07:28:39 +0800</pubDate></item><item><title>用Go语言写个爬虫，把365大佬第2季视频给扒下来（附完整代码）</title><link>http://www.lostfawn.cn/?id=1697</link><description>&lt;p&gt;说实话，我一开始听到“365大佬第2季视频”这词儿，第一反应是——这又是个啥付费课程？结果一查，好家伙，是个讲365天不间断输出内容的实战教程，但问题是，视频不给你下载链接，你只能在线看，这就很烦了，对吧？尤其是我这种地铁上没信号还想缓存下来看的，所以我琢磨着，用Go写个下载器,把这活儿干利索了。&lt;/p&gt;

&lt;h2&gt;先别急着写代码，搞清楚视频藏在哪儿&lt;/h2&gt;
&lt;p&gt;你得知道，这种平台（比如某课、某站）的视频资源，通常不是直接一个&lt;code&gt;.mp4&lt;/code&gt;链接扔给你的，它往往是先给你一个&lt;code&gt;.m3u8&lt;/code&gt;文件，里面写着一堆&lt;code&gt;.ts&lt;/code&gt;分片文件的地址，你真正的任务，是把这堆&lt;code&gt;.ts&lt;/code&gt;碎片下下来,再拼成一个完整的视频。&lt;/p&gt;

&lt;p&gt;这儿有个关键点：&lt;strong&gt;你得拿到那个&lt;code&gt;.m3u8&lt;/code&gt;的URL&lt;/strong&gt;，怎么拿？两个办法：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;浏览器F12抓包&lt;/strong&gt;：打开开发者工具，切到Network（网络）标签，过滤&lt;code&gt;m3u8&lt;/code&gt;，然后播放视频，就能看到一个&lt;code&gt;.m3u8&lt;/code&gt;的请求,右键复制它的地址。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用Go直接模拟请求&lt;/strong&gt;：如果你知道视频页面的URL，可以分析它的网页源码，看有没有内嵌的JSON配置里面藏着视频地址，这一招需要点运气，因为很多平台现在都改成动态加载了,直接去源码里扒往往扑空。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;我这儿先假设你已经通过抓包拿到了那个&lt;code&gt;https://xxx.xxx.com/playlist.m3u8&lt;/code&gt;,下面咱们直接用Go来处理。&lt;/p&gt;

&lt;h2&gt;第一步：用Go拉取m3u8文件&lt;/h2&gt;
&lt;p&gt;先别管分片，我们先把&lt;code&gt;.m3u8&lt;/code&gt;拿到手，这里有个小坑：很多服务器的&lt;code&gt;.m3u8&lt;/code&gt;文件是带&lt;code&gt;Key&lt;/code&gt;或者&lt;code&gt;Token&lt;/code&gt;校验的，所以你请求的时候，得把浏览器里的&lt;code&gt;User-Agent&lt;/code&gt;和&lt;code&gt;Referer&lt;/code&gt;带上,不然大概率给你返回403。&lt;/p&gt;

&lt;pre class=&quot;brush:go;toolbar:false&quot;&gt;package main
import (
    &amp;quot;fmt&amp;quot;
    &amp;quot;io&amp;quot;
    &amp;quot;net/http&amp;quot;
    &amp;quot;time&amp;quot;
)
func fetchM3U8(url string) ([]byte, error) {
    client := &amp;amp;http.Client{Timeout: 30 * time.Second}
    req, err := http.NewRequest(&amp;quot;GET&amp;quot;, url, nil)
    if err != nil {
        return nil, err
    }
    // 伪装成浏览器，不然有些服务器会拒绝
    req.Header.Set(&amp;quot;User-Agent&amp;quot;, &amp;quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36&amp;quot;)
    req.Header.Set(&amp;quot;Referer&amp;quot;, &amp;quot;https://qian.lu/&amp;quot;) // 换成你实际的来源页面
    resp, err := client.Do(req)
    if err != nil {
        return nil, err
    }
    defer resp.Body.Close()
    if resp.StatusCode != http.StatusOK {
        return nil, fmt.Errorf(&amp;quot;HTTP错误: %d&amp;quot;, resp.StatusCode)
    }
    body, err := io.ReadAll(resp.Body)
    if err != nil {
        return nil, err
    }
    return body, nil
}
func main() {
    m3u8URL := &amp;quot;你的m3u8地址&amp;quot; // 抓包拿到的链接
    content, err := fetchM3U8(m3u8URL)
    if err != nil {
        fmt.Printf(&amp;quot;拉取失败: %v\n&amp;quot;, err)
        return
    }
    fmt.Printf(&amp;quot;拿到了m3u8，字节数：%d\n&amp;quot;, len(content))
    // 先打印出来看看结构
    fmt.Println(string(content[:500])) // 只打印前面部分
}&lt;/pre&gt;
&lt;p&gt;跑一下这段,你会看到类似这样的输出：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.0,
segment0.ts
#EXTINF:10.0,
segment1.ts
...&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;好，看到这些&lt;code&gt;segment0.ts&lt;/code&gt;就对了，这些就是视频的分片，但注意，这些&lt;code&gt;segment0.ts&lt;/code&gt;是&lt;strong&gt;相对路径&lt;/strong&gt;，你得拼上你&lt;code&gt;.m3u8&lt;/code&gt;文件所在的目录才能完整请求到，你的&lt;code&gt;.m3u8&lt;/code&gt;链接是&lt;code&gt;https://abc.com/video/playlist.m3u8&lt;/code&gt;，那分片地址就是&lt;code&gt;https://abc.com/video/segment0.ts&lt;/code&gt;。&lt;/p&gt;

&lt;h2&gt;第二步：解析m3u8，提取分片列表&lt;/h2&gt;
&lt;p&gt;别用正则硬抠，太累，咱们就按行读，遇到以&lt;code&gt;#EXTINF&lt;/code&gt;开头的行，它的&lt;strong&gt;下一行&lt;/strong&gt;就是分片文件名，这里有个细节，有些m3u8是加密的（带&lt;code&gt;#EXT-X-KEY&lt;/code&gt;），但咱们先处理不加密的,加密的后面再提一嘴。&lt;/p&gt;

&lt;pre class=&quot;brush:go;toolbar:false&quot;&gt;import (
    &amp;quot;bufio&amp;quot;
    &amp;quot;strings&amp;quot;
)
func parseM3U8(content []byte, baseURL string) ([]string, error) {
    var segments []string
    scanner := bufio.NewScanner(strings.NewReader(string(content)))
    for scanner.Scan() {
        line := strings.TrimSpace(scanner.Text())
        if line == &amp;quot;&amp;quot; || strings.HasPrefix(line, &amp;quot;#&amp;quot;) {
            continue
        }
        // 这一行就是分片路径
        if strings.HasPrefix(line, &amp;quot;http&amp;quot;) {
            segments = append(segments, line)
        } else {
            // 相对路径，拼接baseURL
            segments = append(segments, baseURL+&amp;quot;/&amp;quot;+line)
        }
    }
    return segments, scanner.Err()
}&lt;/pre&gt;
&lt;p&gt;注意，&lt;code&gt;baseURL&lt;/code&gt;你得自己算，可以用&lt;code&gt;net/url&lt;/code&gt;包解析出你&lt;code&gt;.m3u8&lt;/code&gt;链接的目录部分：&lt;/p&gt;

&lt;pre class=&quot;brush:go;toolbar:false&quot;&gt;import &amp;quot;net/url&amp;quot;
u, _ := url.Parse(m3u8URL)
baseURL := u.Scheme + &amp;quot;://&amp;quot; + u.Host + u.Path[0:strings.LastIndex(u.Path, &amp;quot;/&amp;quot;)]&lt;/pre&gt;
&lt;p&gt;这样拿到完整的分片地址列表，不出意外的话，会有几百个&lt;code&gt;.ts&lt;/code&gt;文件,这就是视频的本体。&lt;/p&gt;

&lt;h2&gt;第三步：并发下载所有分片（别嫌多，Go就是干这个的）&lt;/h2&gt;
&lt;p&gt;分片数多，但每个分片不大（几MB到几十MB），咱们直接并发拉，这里要小心——&lt;strong&gt;别把服务器冲垮&lt;/strong&gt;，也别被平台封IP，设置个并发上限,比如5个协程同时干活。&lt;/p&gt;

&lt;pre class=&quot;brush:go;toolbar:false&quot;&gt;import (
    &amp;quot;sync&amp;quot;
    &amp;quot;os&amp;quot;
    &amp;quot;path/filepath&amp;quot;
)
func downloadSegment(url string, dir string, wg *sync.WaitGroup) {
    defer wg.Done()
    // 生成文件名，用URL里的最后一段
    filename := filepath.Base(url)
    filepath := filepath.Join(dir, filename)
    // 下之前先判一下存在不存在，省得重复下载（断点续传的思想）
    if _, err := os.Stat(filepath); err == nil {
        fmt.Printf(&amp;quot;已存在，跳过: %s\n&amp;quot;, filename)
        return
    }
    resp, err := http.Get(url)
    if err != nil {
        fmt.Printf(&amp;quot;下载失败 %s: %v\n&amp;quot;, url, err)
        return
    }
    defer resp.Body.Close()
    data, err := io.ReadAll(resp.Body)
    if err != nil {
        fmt.Printf(&amp;quot;读取失败 %s: %v\n&amp;quot;, url, err)
        return
    }
    err = os.WriteFile(filepath, data, 0644)
    if err != nil {
        fmt.Printf(&amp;quot;写入失败 %s: %v\n&amp;quot;, filename, err)
        return
    }
    fmt.Printf(&amp;quot;完成: %s (%d KB)\n&amp;quot;, filename, len(data)/1024)
}&lt;/pre&gt;
&lt;p&gt;然后主函数里：&lt;/p&gt;

&lt;pre class=&quot;brush:go;toolbar:false&quot;&gt;func main() {
    // ... 前面拿到 segments ...
    os.MkdirAll(&amp;quot;video_cache&amp;quot;, 0755) // 建个缓存目录
    var wg sync.WaitGroup
    sem := make(chan struct{}, 5) // 并发控制，最多5个同时下
    for _, segURL := range segments {
        wg.Add(1)
        sem &amp;lt;- struct{}{} // 占位
        go func(u string) {
            defer func() { &amp;lt;-sem }() // 释放
            defer wg.Done()
            downloadSegment(u, &amp;quot;video_cache&amp;quot;, &amp;amp;wg)
        }(segURL)
    }
    wg.Wait()
    fmt.Println(&amp;quot;所有分片下载完毕&amp;quot;)
}&lt;/pre&gt;
&lt;p&gt;跑完后，你的&lt;code&gt;video_cache&lt;/code&gt;目录里应该躺着一堆&lt;code&gt;segment0.ts&lt;/code&gt;、&lt;code&gt;segment1.ts&lt;/code&gt;…… 这时候，&lt;strong&gt;别急着合并&lt;/strong&gt;，先检查一下有没有下载失败的文件（字节数为0或者只有几十字节的）,我这儿写了个简易检查：&lt;/p&gt;

&lt;pre class=&quot;brush:go;toolbar:false&quot;&gt;// 检查所有文件大小，小于1K的删掉重下
filepath.Walk(&amp;quot;video_cache&amp;quot;, func(path string, info os.FileInfo, err error) error {
    if !info.IsDir() &amp;amp;&amp;amp; info.Size() &amp;lt; 1024 {
        fmt.Printf(&amp;quot;删除疑似失败文件: %s (%d bytes)\n&amp;quot;, path, info.Size())
        os.Remove(path)
    }
    return nil
})&lt;/pre&gt;
&lt;h2&gt;第四步：合并所有.ts为完整视频&lt;/h2&gt;
&lt;p&gt;这一步用的是&lt;code&gt;ffmpeg&lt;/code&gt;，虽然咱们是Go程序，但调用外部工具不算作弊，实际上你可以用Go写个二进制合并，但&lt;code&gt;ffmpeg&lt;/code&gt;更省事，它还会重新编码一下,保证播放流畅。&lt;/p&gt;

&lt;pre class=&quot;brush:go;toolbar:false&quot;&gt;import &amp;quot;os/exec&amp;quot;
func mergeSegments(output string) error {
    // 先生成一个文件列表，ffmpeg需要这个
    listFile, err := os.Create(&amp;quot;filelist.txt&amp;quot;)
    if err != nil {
        return err
    }
    defer os.Remove(&amp;quot;filelist.txt&amp;quot;) // 用完删除
    // 按文件名排序，确保顺序对
    files, _ := filepath.Glob(&amp;quot;video_cache/segment*.ts&amp;quot;)
    // 这里需要数字排序，所以用sort.Slice
    sort.Slice(files, func(i, j int) bool {
        numI := extractNumber(files[i])
        numJ := extractNumber(files[j])
        return numI &amp;lt; numJ
    })
    for _, f := range files {
        fmt.Fprintf(listFile, &amp;quot;file &amp;#39;%s&amp;#39;\n&amp;quot;, strings.ReplaceAll(f, &amp;quot;&amp;#39;&amp;quot;, `&amp;#39;\&amp;#39;&amp;#39;`))
    }
    listFile.Close()
    cmd := exec.Command(&amp;quot;ffmpeg&amp;quot;, &amp;quot;-f&amp;quot;, &amp;quot;concat&amp;quot;, &amp;quot;-safe&amp;quot;, &amp;quot;0&amp;quot;, &amp;quot;-i&amp;quot;, &amp;quot;filelist.txt&amp;quot;, &amp;quot;-c&amp;quot;, &amp;quot;copy&amp;quot;, output)
    outputBytes, err := cmd.CombinedOutput()
    if err != nil {
        return fmt.Errorf(&amp;quot;合并失败: %v\n%s&amp;quot;, err, outputBytes)
    }
    return nil
}
func extractNumber(filename string) int {
    // 提取&amp;quot;segment&amp;quot;后面的数字
    base := filepath.Base(filename)
    base = strings.TrimPrefix(base, &amp;quot;segment&amp;quot;)
    base = strings.TrimSuffix(base, &amp;quot;.ts&amp;quot;)
    num, _ := strconv.Atoi(base)
    return num
}&lt;/pre&gt;
&lt;p&gt;写好了，跑一下试试，如果运气好,一两分钟就合并出一个几百MB的MP4。&lt;/p&gt;

&lt;h2&gt;关于365大佬第2季视频的坑，我必须说两句&lt;/h2&gt;
&lt;p&gt;你可能发现，&lt;strong&gt;上面代码跑通了，但视频可能不是1080P&lt;/strong&gt;，为啥？因为很多平台的分片是分清晰度的，&lt;code&gt;.m3u8&lt;/code&gt;文件里会嵌套引用子&lt;code&gt;.m3u8&lt;/code&gt;（比如&lt;code&gt;playlist_1080.m3u8&lt;/code&gt;），你得先去抓&lt;strong&gt;最高清晰度的那个&lt;code&gt;.m3u8&lt;/code&gt;&lt;/strong&gt;,而不是主入口的。&lt;/p&gt;

&lt;p&gt;具体怎么看呢？打印一下那个&lt;code&gt;content&lt;/code&gt;，如果里面出现的不是&lt;code&gt;segment0.ts&lt;/code&gt;，而是&lt;code&gt;../1080p/segment0.ts&lt;/code&gt;，那说明你抓的是个主目录文件，还得再往下挖一层，这就得另写个递归解析了，但我建议你先手动用浏览器打开那个&lt;code&gt;.m3u8&lt;/code&gt;链接，看它返回的东西长啥样,再决定怎么改代码。&lt;/p&gt;

&lt;p&gt;如果&lt;code&gt;.m3u8&lt;/code&gt;里有&lt;code&gt;#EXT-X-KEY:METHOD=AES-128,URI=&quot;key&quot;&lt;/code&gt;这种行，那就说明分片是加密的，你需要额外下载那个key文件，然后解密每个分片，解密逻辑也不复杂——需要用OpenSSL的AES-128-CBC，IV默认是分片序号，但&lt;strong&gt;365大佬的视频一般不至于加密&lt;/strong&gt;，真遇到加密了，你还是用现成的工具吧，比如&lt;code&gt;N_m3u8DL-RE&lt;/code&gt;,别自己硬肝。&lt;/p&gt;

&lt;h2&gt;顺便提一嘴：这种下载行为的边界&lt;/h2&gt;
&lt;p&gt;写这玩意儿主要是图个方便，自己交了钱买了课，离线看看无可厚非，但是&lt;strong&gt;别拿去传播，别弄到网盘上卖&lt;/strong&gt;，我见过太多人因为这事儿被请去喝茶的事儿了——365大佬那个圈子里的诉讼风险不是说着玩的，你私下用用，装个&lt;code&gt;ffmpeg&lt;/code&gt;，在本地合并完自己看,问题不大。&lt;/p&gt;

&lt;h2&gt;最后给你个省事儿的建议&lt;/h2&gt;
&lt;p&gt;如果你不想折腾代码，想直接下载的话，可以用上面提到的&lt;code&gt;N_m3u8DL-RE&lt;/code&gt;，它有命令行版，支持多线程、AES解密、合并,一条命令搞定：&lt;/p&gt;

&lt;pre class=&quot;brush:bash;toolbar:false&quot;&gt;N_m3u8DL-RE &amp;quot;你的m3u8地址&amp;quot; --header &amp;quot;User-Agent: Mozilla/5.0&amp;quot; --header &amp;quot;Referer: https://qian.lu&amp;quot;&lt;/pre&gt;
&lt;p&gt;它会自动下载所有分片并合并成MP4，比我自己写的那个精简版靠谱多了，但我为什么还写这么一大段Go代码？因为&lt;strong&gt;学Go嘛，就是图个折腾的过程&lt;/strong&gt;，你把这个跑通了，以后遇到任何&lt;code&gt;.m3u8&lt;/code&gt;视频，都有底气说自己能搞定,不虚。&lt;/p&gt;

&lt;p&gt;不说了，我那个&lt;code&gt;segment1024.ts&lt;/code&gt;好像又下载失败了，我得去瞅瞅是不是IP被临时限速了，你要是也遇到这种，歇个几分钟再重跑一遍那个检查代码,效果立竿见影。&lt;/p&gt;
&lt;p style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;http://www.lostfawn.cn/zb_users/upload/2026/08/20260804045847178579072779079.jpg&quot; alt=&quot;用Go语言写个爬虫，把365大佬第2季视频给扒下来（附完整代码）&quot; title=&quot;用Go语言写个爬虫，把365大佬第2季视频给扒下来（附完整代码）&quot; /&gt;&lt;/p&gt;
</description><pubDate>Tue, 04 Aug 2026 04:58:43 +0800</pubDate></item><item><title>小海绵365分钟长视频，当时间被拉长，我们反而看清了什么？</title><link>http://www.lostfawn.cn/?id=1696</link><description>&lt;p&gt;你有没有过这种感觉？刷短视频的时候，手指一划就是两小时，可回想起来啥也没记住，但反过来，我最近在B站上看完一个标着“小海绵365分钟长视频”的系列，整整6个多小时，居然不觉得累，甚至看完之后有种奇怪的满足感，今天咱们不聊什么技术原理，就从一个普通观众的视角，聊聊这个长达365分钟的现象背后,到底藏了什么门道。&lt;/p&gt;

&lt;h2&gt;365分钟，不是“长”，是“允许你慢下来”&lt;/h2&gt;
&lt;p&gt;先别急着被“365分钟”吓到，这个数字换算一下，就是6小时零5分钟，相当于你连看三部《流浪地球2》（每部173分钟），或者一口气追完十集美剧，我第一次看到这个时长的时候，第一反应是：谁这么闲？但点开之后,我发现事情没那么简单。&lt;/p&gt;

&lt;p&gt;小海绵这系列长视频，内容其实是个&lt;strong&gt;慢节奏的“生活施工现场实录”&lt;/strong&gt;——不是那种快剪、卡点、特效堆砌的爽片，而是真的把镜头怼在墙面上，看着腻子一铲一铲地刮，看着涂料一层一层地滚，中间还有大段大段的“安静时间”：没有BGM，没有解说,只有滚筒刷和墙面摩擦的沙沙声。&lt;/p&gt;

&lt;p&gt;这个体验很奇妙，短视频时代，我们习惯了每三秒一个笑点、每十秒一个反转，大脑被训练成了“多巴胺饥渴症患者”，但小海绵这个365分钟的长视频，它做的第一件事，就是&lt;strong&gt;取消了“期待感”&lt;/strong&gt;，你知道接下来不会有惊喜，不会有反转，甚至不会有高潮，但奇怪的是，当你不期待的时候,你反而看进去了一些东西。&lt;/p&gt;

&lt;h2&gt;为什么“无聊”的视频能让人上瘾？&lt;/h2&gt;
&lt;p&gt;我记得有个弹幕说：“我关了弹幕，音量调到最低，就当背景白噪音，然后我发现我居然能坐得住看一小时。”这不是个例，评论区里好多人反馈，说这个视频成了他们干家务、写论文、甚至睡前助眠的“电子安眠药”。&lt;/p&gt;

&lt;p&gt;这里有个心理学现象叫&lt;strong&gt;“心流”的反面&lt;/strong&gt;，心流是高度专注的沉浸，而小海绵这类长视频提供的，是“低刺激的陪伴感”，它不要求你全神贯注，但它的存在又让你的注意力有地方安放，就像小时候下雨天，你坐在窗边看雨水顺着玻璃往下流，你什么都没想，但时间就那么过去了,而且不焦虑。&lt;/p&gt;

&lt;p&gt;这种体验，其实挺像&lt;strong&gt;费曼说的“观察者心态”&lt;/strong&gt;，物理学家费曼在《别闹了，费曼先生》里写过，他小时候喜欢观察蚂蚁搬糖粒，能蹲着看一整个下午，那种“看”不是目的，而是过程本身，小海绵365分钟的视频，某种程度上就是把这种“观察”的权利还给了观众——你不必为了“获取信息”而看，你可以单纯为了“看”而看。&lt;/p&gt;

&lt;h2&gt;这个视频里，藏着三个“反算法”的设计&lt;/h2&gt;
&lt;p&gt;我特意留意了一下，这个365分钟的视频能让人不困，还真不是全靠玄学，它有几个很“笨”但有效的设计：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;第一，&lt;/strong&gt;它不是固定机位拍到底，而是&lt;strong&gt;跟随工序移动&lt;/strong&gt;，比如刮腻子的时候，镜头会贴近墙面，能看到砂纸打磨下来的灰屑；刷漆的时候，镜头会绕到侧面，捕捉漆面反光的变化，这种“有意识的移动”制造了非常轻微的视觉新鲜感,就像散步时路边风景的微妙变化。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;第二，&lt;/strong&gt;声音是&lt;strong&gt;原声收音，不加降噪&lt;/strong&gt;，滚筒刷泡水的声音、毛刷碰到金属桶沿的“哐当”声、甚至施工师傅偶尔咳嗽一声——这些“杂质”反而增加了真实感，相比之下，那些精心制作、降噪到完美无瑕的视频，反而有种“保鲜膜感”,不真实。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;第三，&lt;/strong&gt;也是最关键的，&lt;strong&gt;它没有任何画外音、字幕和进度条引导&lt;/strong&gt;，你打开视频，就是一个“正在进行时”的空间，没有“接下来我们要怎么做”的预告，也没有“这一步很关键”的提示，你猜不到还有多久结束，这反而消除了“进度焦虑”——就像你等一壶水烧开，你不会盯着手机看时间，你只是等着，等它自己“咕嘟”一声。&lt;/p&gt;

&lt;h2&gt;365分钟能带来什么？我做了个小实验&lt;/h2&gt;
&lt;p&gt;为了写这篇文章，我专门分三天看完了这个系列（每天大概两小时）,记录下一些真实的碎片感受：&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr class=&quot;firstRow&quot;&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;观看阶段&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;我的身体反应&lt;/th&gt;
&lt;th style=&quot;text-align: left;&quot;&gt;心理变化&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;0-30分钟&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;时不时想切走，手痒&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;觉得“太亏了”，时间浪费在这么枯燥的画面上&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;30-60分钟&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;呼吸变慢，手放下手机&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;开始注意到墙面纹理的变化，像看云朵流动&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;60-120分钟&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;完全放松，靠在椅背上&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;突然想起小时候看爷爷锯木头，看了一下午&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;120分钟+&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;主动倒了杯茶，没有看暂停键&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;脑子里冒出来一些平时不会想的念头，原来白色有这么多层”&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这组记录里，最让我意外的是最后一条，我真的开始分辨出“珍珠白”和“哑光白”在自然光下的区别，甚至开始想象如果这面墙是我家的，我会在哪个位置挂一幅画，也就是说，&lt;strong&gt;当外部刺激降到足够低的时候，你的想象力反而被激活了&lt;/strong&gt;，这跟读书是不是有点像？文字本身是静态的,但大脑会构建画面。&lt;/p&gt;

&lt;h2&gt;长视频是“反效率”的，但它恰恰救回了“体验”&lt;/h2&gt;
&lt;p&gt;现在很多人说“时间管理”“碎片化学习”，但小海绵这365分钟的视频，它的存在本身就是一种&lt;strong&gt;温和的反抗&lt;/strong&gt;，它不教你任何技能，不提供任何干货，也不会让你看完“觉得学到了东西”，它只是让你花掉六个小时，然后你发现，你获得的是“什么都没获得”的平静。&lt;/p&gt;

&lt;p&gt;这让我想起一个词，叫&lt;strong&gt;“无目的的时间”&lt;/strong&gt;，德国哲学家韩炳哲在《倦怠社会》里讲过，当代人被绩效压力逼着，连休闲都在“打卡”“集邮”，恨不得把周末安排成“成长训练营”，而像小海绵这样的视频，它没有任何衡量标准——你不能“更快地看完”，也不能“更高效地吸收”，你唯一能做的就是“待着”。&lt;/p&gt;

&lt;p&gt;这种“待着”，其实挺奢侈的，我试过用1.5倍速看，结果发现完全变味了，那些刷墙的沙沙声被加速后，变成了一种烦躁的噪音，只有原速观看，那种“时间流出”的质感才立得住，所以&lt;strong&gt;这个视频真正的门槛，不是时长，是你愿不愿意把速度降下来&lt;/strong&gt;。&lt;/p&gt;

&lt;h2&gt;一些可能没人提的细节（但我觉得很重要）&lt;/h2&gt;
&lt;p&gt;视频里有个片段，施工师傅在调漆，往桶里倒了一点水，用木棍搅动，这个过程大概持续了四分钟，镜头就对准那个漩涡，我盯着看了四分钟，突然觉得，这不就是费曼说的“观察蚂蚁”的现代版本吗？我们太习惯于“结果导向”——调漆是为了刷墙，刷墙是为了完成装修，但站在“看”的角度，那四分钟的搅拌，液体旋转的纹路，慢慢变得均匀的过程，本身就是一种微小的、可持续的视觉享受。&lt;/p&gt;

&lt;p&gt;视频里没有“完工总结”，最后一分钟，师傅放下工具，镜头缓缓绕过整个房间，墙面干透了，呈现出均匀的哑光质感，然后画面就黑了，没有“恭喜你完成观看”的彩蛋，没有“一键三连”的提醒，就像是邻居家装修完，你路过看了最后一眼,然后自然走回家吃饭。&lt;/p&gt;

&lt;h2&gt;写在最后的一些零碎实话&lt;/h2&gt;
&lt;p&gt;说实话，小海绵这个365分钟的视频，不适合所有人，如果你今天心情特别浮躁，打开十分钟大概就会关掉，但如果你有那么一天，觉得刷短视频刷到厌恶，觉得所有的“三分钟讲透一本书”都像嚼过的甘蔗渣，那你可以试试这个系列，不用刻意准备什么，倒杯水，找个舒服的椅子,然后让它播着就行。&lt;/p&gt;

&lt;p&gt;你可能看着看着发现，原来墙壁从毛坯到成品，要经历那么多道工序，每道工序之间还要等干透，这其实挺像人的成长——急不来，也没法快进，中间那些等待的时间，不是浪费，是整个过程中必须的“干燥期”。&lt;/p&gt;

&lt;p&gt;我发现我有点理解那个“365分钟”的含义了，它不是“六小时五分钟”，它是一整年中最漫长的那一天的时间容量，你愿意把这么长一段生命，交给一面墙，交给一个刷子，交给一场没有配乐的施工——这本身，就已经是对“效率至上”的一种小小的、温柔的胜利了。&lt;/p&gt;

&lt;p&gt;（对了，如果你真的去看了，建议别开弹幕，至少第一遍别开，让那些色彩和声音，自己去找你。）&lt;/p&gt;
&lt;p style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;http://www.lostfawn.cn/zb_users/upload/2026/08/20260804022849178578172951801.jpg&quot; alt=&quot;小海绵365分钟长视频，当时间被拉长，我们反而看清了什么？&quot; title=&quot;小海绵365分钟长视频，当时间被拉长，我们反而看清了什么？&quot; /&gt;&lt;/p&gt;
</description><pubDate>Tue, 04 Aug 2026 02:28:42 +0800</pubDate></item><item><title>用Go语言造一个教您学做365道菜视频的播放器，这事儿挺上头</title><link>http://www.lostfawn.cn/?id=1695</link><description>&lt;p&gt;先说句实话，我一开始也没想到，&lt;strong&gt;用Go写个视频播放器&lt;/strong&gt;，能跟“学做菜”扯上关系，但你看啊，咱每天打开短视频App，刷到那种“教您学做365道菜视频”的合集，是不是总忍不住点进去看两眼？尤其是晚上十一点，饿着肚子刷到红烧肉，那感觉……啧。&lt;/p&gt;

&lt;p&gt;但我今天不聊做菜，我想聊的是&lt;strong&gt;怎么用Go语言，把一个“教您学做365道菜视频”的播放列表，给整得明明白白&lt;/strong&gt;，不是让你去写个抖音，而是说，咱自己动手，做个简单的、能播视频、能切菜谱、能记笔记的小工具，这事儿用Go干,特别顺手。&lt;/p&gt;

&lt;h2&gt;为什么是Go，不是Python或者Java？&lt;/h2&gt;
&lt;p&gt;你可能觉得，Python写脚本快，Java写后端稳，Go凭啥插一脚？我跟你讲，&lt;strong&gt;Go的好处是“又稳又快又简单”&lt;/strong&gt;，你看，处理视频文件这种事儿，动不动就是几百MB的大文件，Go的并发模型处理流式读取，那叫一个顺滑，Go编译出来就是个单独的二进制文件，你发给朋友，他不用装环境，双击就能跑——就像你把一盘做好的菜端到人家桌上,不用他再自己洗菜切菜。&lt;/p&gt;

&lt;p&gt;咱们这个“教您学做365道菜视频”播放器,核心就三件事：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;读视频文件&lt;/strong&gt;（本地路径,或者网上扒下来的链接）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;按菜谱顺序排列表&lt;/strong&gt;（比如今天学第1道“西红柿炒蛋”，明天学第2道“麻婆豆腐”）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;播放的时候还能记笔记&lt;/strong&gt;（盐放少了”“火别太大”）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;用Go写,这三件事都挺直白。&lt;/p&gt;

&lt;h2&gt;第一步：先把视频目录给“收拾”了&lt;/h2&gt;
&lt;p&gt;假设你的电脑里有一个文件夹，叫 &lt;code&gt;365道菜视频&lt;/code&gt;,里面按顺序放着：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;001_西红柿炒蛋.mp4
002_麻婆豆腐.mp4
003_红烧肉.mp4
...
365_佛跳墙.mp4&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;那我们在Go里，第一步就是&lt;strong&gt;遍历这个文件夹&lt;/strong&gt;，把文件按序号排好，代码写起来跟炒菜似的，先热锅,再倒油：&lt;/p&gt;

&lt;pre class=&quot;brush:go;toolbar:false&quot;&gt;package main
import (
    &amp;quot;fmt&amp;quot;
    &amp;quot;os&amp;quot;
    &amp;quot;path/filepath&amp;quot;
    &amp;quot;sort&amp;quot;
    &amp;quot;strings&amp;quot;
)
func main() {
    dir := &amp;quot;./365道菜视频&amp;quot;
    files, err := os.ReadDir(dir)
    if err != nil {
        fmt.Println(&amp;quot;读目录失败：&amp;quot;, err)
        return
    }
    var videoList []string
    for _, f := range files {
        if strings.HasSuffix(f.Name(), &amp;quot;.mp4&amp;quot;) {
            videoList = append(videoList, f.Name())
        }
    }
    // 按文件名排序（因为文件名的前缀是001,002...）
    sort.Strings(videoList)
    fmt.Printf(&amp;quot;一共找到 %d 个视频\n&amp;quot;, len(videoList))
    for i, v := range videoList {
        fmt.Printf(&amp;quot;%d. %s\n&amp;quot;, i+1, v)
    }
}&lt;/pre&gt;
&lt;p&gt;你看，这个输出结果，就像个菜单一样，清清楚楚。&lt;strong&gt;这步的关键就是用 &lt;code&gt;os.ReadDir&lt;/code&gt; + &lt;code&gt;sort.Strings&lt;/code&gt;，简单粗暴&lt;/strong&gt;，你要是用Python，还得考虑编码,Go就是干脆。&lt;/p&gt;

&lt;h2&gt;第二步：做个“菜谱播放列表”结构体&lt;/h2&gt;
&lt;p&gt;现在咱有了视频列表，但光有文件名还不够,咱得知道每道菜的具体信息，&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;菜名（就是文件名去掉序号和扩展名）&lt;/li&gt;
&lt;li&gt;需要什么食材（这个可以手动录入）&lt;/li&gt;
&lt;li&gt;烹饪时间（比如3分钟？那不可能,是视频时长）&lt;/li&gt;
&lt;li&gt;备注（你自己的学做心得）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这时候就轮到Go的&lt;strong&gt;结构体（struct）&lt;/strong&gt;上场了，就像做菜用的调料盒,每个格子放不同的料：&lt;/p&gt;

&lt;pre class=&quot;brush:go;toolbar:false&quot;&gt;type Dish struct {
    Order    int    // 序号，比如1
    Name     string // 菜名，quot;西红柿炒蛋&amp;quot;
    FilePath string // 视频文件路径
    Notes    string // 你写的笔记
    Duration string // 视频时长，quot;05:32&amp;quot;
}&lt;/pre&gt;
&lt;p&gt;我们把刚才遍历出来的文件,塞进这个结构体：&lt;/p&gt;

&lt;pre class=&quot;brush:go;toolbar:false&quot;&gt;var dishes []Dish
for i, f := range videoList {
    name := strings.TrimSuffix(f, &amp;quot;.mp4&amp;quot;)
    // 去掉前面的&amp;quot;001_&amp;quot;这种前缀
    parts := strings.SplitN(name, &amp;quot;_&amp;quot;, 2)
    if len(parts) == 2 {
        dishes = append(dishes, Dish{
            Order:    i + 1,
            Name:     parts[1],
            FilePath: filepath.Join(dir, f),
        })
    }
}&lt;/pre&gt;
&lt;p&gt;到这一步，你的“365道菜”就从一个散乱的文件夹，变成了一串&lt;strong&gt;有序的、可操作的数据&lt;/strong&gt;，这感觉就像你把一堆土豆、茄子、辣椒洗干净切好码在案板上,就等开火了。&lt;/p&gt;

&lt;h2&gt;第三步：简单播放功能（调用系统播放器）&lt;/h2&gt;
&lt;p&gt;Go本身不负责解码视频，但咱可以&lt;strong&gt;调用系统默认播放器&lt;/strong&gt;，用 &lt;code&gt;exec.Command&lt;/code&gt; 就行,像这样：&lt;/p&gt;

&lt;pre class=&quot;brush:go;toolbar:false&quot;&gt;import &amp;quot;os/exec&amp;quot;
func playVideo(path string) error {
    cmd := exec.Command(&amp;quot;open&amp;quot;, path) // macOS
    // cmd := exec.Command(&amp;quot;cmd&amp;quot;, &amp;quot;/c&amp;quot;, &amp;quot;start&amp;quot;, path) // Windows
    // cmd := exec.Command(&amp;quot;xdg-open&amp;quot;, path) // Linux
    return cmd.Start()
}&lt;/pre&gt;
&lt;p&gt;你只要在终端跑这个程序，然后输入一个数字，&lt;code&gt;5&lt;/code&gt;，程序就帮你打开第5道菜的视频，说句实在话，这个功能有点“糙”，但管用，就像你炒菜时用铲子而不是用硅胶勺,不讲究但顺手。&lt;/p&gt;

&lt;h2&gt;第四步：记笔记——用Go写文件&lt;/h2&gt;
&lt;p&gt;学做菜最怕什么？怕的是“眼睛学会了，手没学会”，所以咱得&lt;strong&gt;记笔记&lt;/strong&gt;，在视频播放的时候，你暂停一下，在终端里输入一句“盐放多了”,程序给你存下来。&lt;/p&gt;

&lt;p&gt;代码就这么简单：&lt;/p&gt;

&lt;pre class=&quot;brush:go;toolbar:false&quot;&gt;func saveNote(dish *Dish, note string) {
    dish.Notes = note
    // 可以存到一个notes.txt文件里，或者存到JSON
    data, _ := json.MarshalIndent(dish, &amp;quot;&amp;quot;, &amp;quot;  &amp;quot;)
    os.WriteFile(&amp;quot;notes/&amp;quot;+fmt.Sprintf(&amp;quot;%03d&amp;quot;, dish.Order)+&amp;quot;.json&amp;quot;, data, 0644)
}&lt;/pre&gt;
&lt;p&gt;这样，你学完365道菜，就有365个JSON笔记文件。&lt;strong&gt;以后想复盘哪道菜，直接打开对应的JSON&lt;/strong&gt;，比翻纸质菜谱方便多了，这招在Go里特别自然，因为标准库自带 &lt;code&gt;encoding/json&lt;/code&gt;,啥都不用装。&lt;/p&gt;

&lt;h2&gt;第五步：加个“今日推荐”功能——用随机数&lt;/h2&gt;
&lt;p&gt;有时候你不知道今天该学哪道菜，这就得靠随机，Go的 &lt;code&gt;math/rand&lt;/code&gt; 用起来跟抽奖似的：&lt;/p&gt;

&lt;pre class=&quot;brush:go;toolbar:false&quot;&gt;import &amp;quot;math/rand&amp;quot;
func recommendDish(dishes []Dish) Dish {
    idx := rand.Intn(len(dishes))
    return dishes[idx]
}&lt;/pre&gt;
&lt;p&gt;你运行程序，它跟你说：“今天建议学第42道菜：鱼香肉丝。”挺有意思的，有种“天人合一”的感觉，而且这玩意儿还能治选择困难症——&lt;strong&gt;别想“先学哪道”，直接让程序帮你决定，省了纠结的时间&lt;/strong&gt;。&lt;/p&gt;

&lt;h2&gt;第六步：如果视频在B站或YouTube怎么办？&lt;/h2&gt;
&lt;p&gt;这个咱得诚实说，Go的标准库没有直接扒视频的功能，但你可以配合 &lt;strong&gt;yt-dlp&lt;/strong&gt; 这个开源工具（不是广告，是真管用），先下载下来，再放进你的 &lt;code&gt;365道菜视频&lt;/code&gt; 文件夹，或者你就用我已经写好的这个遍历逻辑，因为 &lt;code&gt;yt-dlp&lt;/code&gt; 下载下来的文件名自带序号,正好能对上。&lt;/p&gt;

&lt;p&gt;你甚至可以在Go里调用 &lt;code&gt;yt-dlp&lt;/code&gt;，用 &lt;code&gt;exec.Command&lt;/code&gt; 就行，虽然这有点“套娃”，但解决问题嘛,别嫌工具多。&lt;/p&gt;

&lt;h2&gt;进阶：给程序加个“网页控制界面”&lt;/h2&gt;
&lt;p&gt;你要是觉得终端黑乎乎的不好看，可以加一个简单的HTTP服务，Go写这个简直是本命——标准库 &lt;code&gt;net/http&lt;/code&gt; 就够了，做一个简单的页面，显示菜名列表,点一下就从后端启动播放器。&lt;/p&gt;

&lt;pre class=&quot;brush:go;toolbar:false&quot;&gt;http.HandleFunc(&amp;quot;/&amp;quot;, func(w http.ResponseWriter, r *http.Request) {
    // 输出HTML，列出所有菜名
    // 每个菜名是个超链接，点击就调用 /play?id=5
})
http.HandleFunc(&amp;quot;/play&amp;quot;, func(w http.ResponseWriter, r *http.Request) {
    id := r.URL.Query().Get(&amp;quot;id&amp;quot;)
    // 找到对应的dish，调用playVideo
})&lt;/pre&gt;
&lt;p&gt;这下你就能在手机浏览器上，连着电脑的局域网IP，躺在床上选菜、播放、记笔记。&lt;strong&gt;这才叫“生活气息”&lt;/strong&gt;——做饭都懒得站起来换电脑。&lt;/p&gt;

&lt;h2&gt;一点小提醒：别贪多，一天一道菜&lt;/h2&gt;
&lt;p&gt;我写这个程序的时候，自己也试了试，头两天挺新鲜，学了西红柿炒蛋和麻婆豆腐，到第三天就断了——不是程序不行，是懒，所以后来我加了个功能：&lt;strong&gt;记录每天的连续学习天数&lt;/strong&gt;，用个简单的 &lt;code&gt;lastStudyDate&lt;/code&gt; 存到本地文件里，一旦断了一天就清零，这招挺狠,逼着你自己跟自己较劲。&lt;/p&gt;

&lt;h2&gt;说点跟做菜有关的题外话&lt;/h2&gt;
&lt;p&gt;学做365道菜，其实跟写代码一样，&lt;strong&gt;核心不是“多”，而是“会变通”&lt;/strong&gt;，你今天用Go写了个播放器，明天就能改成“教您学做365道汤”的进度管理器，程序是死的，人是活的，菜谱上的调料量，永远是“适量”——就像Go的 &lt;code&gt;error&lt;/code&gt; 处理，你总得自己判断到底要不要 &lt;code&gt;panic&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;不知不觉写了这么多，用Go做菜谱视频管理，其实最大的好处不是功能多强，而是&lt;strong&gt;你亲手写出来的那套逻辑，就像自己家厨房的布局&lt;/strong&gt;——酱油放哪、锅铲挂哪，全凭手感，程序也一样，你写的 &lt;code&gt;split&lt;/code&gt;、&lt;code&gt;sort&lt;/code&gt;、&lt;code&gt;json.Marshal&lt;/code&gt;,每一步都是自己的节奏。&lt;/p&gt;

&lt;p&gt;接下来你就打开终端，敲个 &lt;code&gt;go run main.go&lt;/code&gt;，然后挑一道菜，动手试试吧，说不定今天学的这道,就是你自己最好吃的一顿。&lt;/p&gt;
&lt;p style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;http://www.lostfawn.cn/zb_users/upload/2026/08/20260803235838178577271876594.jpg&quot; alt=&quot;用Go语言造一个教您学做365道菜视频的播放器，这事儿挺上头&quot; title=&quot;用Go语言造一个教您学做365道菜视频的播放器，这事儿挺上头&quot; /&gt;&lt;/p&gt;
</description><pubDate>Mon, 03 Aug 2026 23:58:33 +0800</pubDate></item><item><title>365幼儿园抖音短视频，从围观到共育的真实记录</title><link>http://www.lostfawn.cn/?id=1694</link><description>&lt;h2&gt;当幼儿园按下“记录键”，我们到底在记录什么？&lt;/h2&gt;
&lt;p&gt;你有没有想过,幼儿园老师手机里那个抖音图标，藏着多少孩子成长的秘密？我女儿上中班那年，老师在家长群发了个链接，点开一看——好家伙，全班三十多个娃，在户外活动时追着泡泡跑，有个小胖墩摔了个屁股蹲儿，爬起来第一句话是“我的泡泡呢？”那条视频点赞过万，评论里全是“哈哈哈哈”“太可爱了”，但有个评论让我愣住：“这幼儿园天天发视频，老师是不是不务正业？”&lt;/p&gt;

&lt;p&gt;这话刺耳,但值得琢磨，365幼儿园抖音短视频，听起来像是个“每天更新”的承诺，但背后涉及的，远不止是“拍着玩”那么简单，它涉及孩子的隐私权、家长的知情权、老师的教学精力分配，甚至还有幼儿园的品牌形象，咱们今天不聊虚的，就掰开揉碎，看看这件事到底该怎么看、怎么做。&lt;/p&gt;

&lt;h2&gt;为什么幼儿园需要抖音短视频？——不是“跟风”，是“需求”&lt;/h2&gt;
&lt;p&gt;先抛个反常识的观点：幼儿园做抖音，最大的受益方不是幼儿园，而是&lt;strong&gt;家长&lt;/strong&gt;，你想啊，孩子三岁入园，一天在园时间八小时以上，家长在单位盯着监控画面？不现实，老师挨个发私信？累死，这时候，一条15秒的短视频，就是最好的“安心剂”。&lt;/p&gt;

&lt;p&gt;我曾经采访过一位做了三年抖音的园长,她说得特别直白：“我们不是为了当网红，是为了让爷爷奶奶外公外婆也能看到孙子的日常，很多老人不会用微信，但会刷抖音。”&lt;/p&gt;

&lt;p&gt;这话戳中了我,我邻居家外婆，每天晚饭后必刷幼儿园的抖音号，看到外孙女吃饭光盘的样子，能乐呵一晚上，这比任何家校沟通软件都管用。&lt;/p&gt;

&lt;h3&gt;从“信息不对称”到“透明化”——短视频的价值点&lt;/h3&gt;
&lt;p&gt;传统家园沟通方式,要么是家长会（一月一次），要么是班级群（信息爆炸），要么是成长手册（期末才见），而抖音短视频，它提供了一种&lt;strong&gt;高频、低门槛、可视化&lt;/strong&gt;的沟通方式，老师花两分钟拍一段，家长花十秒看，信息传递效率极高。&lt;/p&gt;

&lt;p&gt;但这里有个关键：&lt;strong&gt;内容要为“沟通”服务，而不是为“流量”服务&lt;/strong&gt;。&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr class=&quot;firstRow&quot;&gt;
&lt;th&gt;沟通场景&lt;/th&gt;
&lt;th&gt;传统方式&lt;/th&gt;
&lt;th&gt;抖音短视频方式&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;教学活动展示&lt;/td&gt;
&lt;td&gt;家长半开放日&lt;/td&gt;
&lt;td&gt;拍摄孩子们做科学实验的专注瞬间&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;生活能力培养&lt;/td&gt;
&lt;td&gt;口头告知&lt;/td&gt;
&lt;td&gt;记录孩子自己叠被子的步骤视频&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;情绪安抚&lt;/td&gt;
&lt;td&gt;电话沟通&lt;/td&gt;
&lt;td&gt;拍孩子入园时和妈妈挥手告别的片段&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;饮食营养&lt;/td&gt;
&lt;td&gt;每周食谱表&lt;/td&gt;
&lt;td&gt;视频展示今天午餐，配上香气诱人的文字&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;你看,如果每个视频都能回答家长一个“孩子今天过得怎么样”的具体问题，这条视频就有价值，反过来，如果只是拍孩子们晃来晃去，配个热门BGM，那确实容易被骂“形式主义”。&lt;/p&gt;

&lt;h2&gt;费曼写作法视角：怎么把“拍摄”这件事讲透？&lt;/h2&gt;
&lt;p&gt;费曼说,如果你不能简单地解释一个东西，说明你没真正理解它，咱们用费曼的思路，把“365幼儿园抖音短视频”拆成三个核心问题：&lt;strong&gt;拍什么？怎么拍？发出去之后怎么办？&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;拍什么？——“动态瞬间”远比“摆拍表演”动人&lt;/h3&gt;
&lt;p&gt;我见过很多幼儿园的翻车视频,问题就出在“演”上，老师让孩子举着道具对着镜头喊口号，孩子眼神都是懵的，这种视频，家长一眼就能看出“这是给领导看的”，不是给孩子录的。
是有&lt;strong&gt;事件感&lt;/strong&gt;的：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;突发瞬间&lt;/strong&gt;：两个孩子因为一块积木吵架，然后互相道歉拥抱的过程（需要剪辑，但真实）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;生活细节&lt;/strong&gt;：午睡起来，小女孩自己系鞋带，系了半天打了个死结，旁边的男孩蹲下来帮忙解——这种镜头，比任何摆拍都有温度。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;学习过程&lt;/strong&gt;：不是拍孩子画得好的画，而是拍孩子画歪了、擦掉、重画，最后露出笑脸的那一刻。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;幼儿园短视频的主角是“成长”，不是“展示”&lt;/strong&gt;，家长想看的是“我的孩子今天学会了什么”，而不是“我们幼儿园多牛”。&lt;/p&gt;

&lt;h3&gt;怎么拍？——别让“技术门槛”变成“心理负担”&lt;/h3&gt;
&lt;p&gt;很多老师跟我抱怨：“我不擅长拍视频啊，剪辑更不会。”其实这完全是误区，抖音的默认拍摄界面，只要遵守三条简单规则，就能拍出合格内容：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;横平竖直&lt;/strong&gt;：手机拿稳，别歪，画面别乱晃，2. &lt;strong&gt;光线充足&lt;/strong&gt;：尽量带孩子靠近窗户，或者户外自然光，别逆光，3. &lt;strong&gt;收音清晰&lt;/strong&gt;：孩子的对话是灵魂，别让背景音乐盖过原声。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;至于剪辑？根本不需要复杂的软件，抖音自带的“剪同款”功能，套个模板，加个字幕，十五秒搞定，重点不是“高级”，是“清楚”。&lt;/p&gt;

&lt;h4&gt;一个真实案例：一所幼儿园的“365”实验&lt;/h4&gt;
&lt;p&gt;杭州有家民办幼儿园,真的做了个“365计划”——每天更新一条视频，坚持一年，他们的做法特别朴素：&lt;strong&gt;周一拍升旗仪式上的小旗手，周二拍孩子们照顾班级植物，周三拍厨房阿姨的拿手菜，周四拍户外游戏的新玩法，周五拍本周的“故事大王”&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;三个月后,他们园长跟我算了笔账：入园咨询量增加了40%，家长投诉率降了60%，最神奇的是，有个家长在视频里看到自己孩子总是一个人玩，主动跟老师沟通，老师调整了分组策略，两周后孩子交到了朋友。&lt;strong&gt;视频成了问题的“预警器”&lt;/strong&gt;。&lt;/p&gt;

&lt;h3&gt;发出去之后怎么办？——这才是真正的试金石&lt;/h3&gt;
&lt;p&gt;很多幼儿园败就败在这里：拍完就发，发完就跑，评论区有人问问题，不回复；有人提建议，不理睬，这不是“运营账号”，这是在“单向广播”。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;运营的核心是“互动”&lt;/strong&gt;，我建议幼儿园建立一条简单规则：每条视频发出后，至少回复前二十条评论，有人问“孩子吃的什么”，就回复具体菜名，最好再补一条厨房备菜的片段，有人问“今天怎么没看到我家娃？”，就耐心解释：“今天他换到另一组活动啦，明天会出现在新的视频里。”&lt;/p&gt;

&lt;p&gt;还有更聪明的做法：&lt;strong&gt;用投票功能做“内容共创”&lt;/strong&gt;，比如发一条视频，配文：“下周户外活动，A.去公园写生 B.在操场搭帐篷，你们选哪个？”家长参与热情极高，孩子也很兴奋——因为这是他们父母选择的游戏！&lt;/p&gt;

&lt;h2&gt;那些容易踩的坑，咱们明说&lt;/h2&gt;
&lt;p&gt;前面说的都是“理想状态”，但实际运营中，有几个坎儿是绕不过去的，提前打个预防针：&lt;/p&gt;

&lt;h3&gt;坑一：隐私保护“一刀切”&lt;/h3&gt;
&lt;p&gt;有些家长特别介意孩子露脸,这完全合理，解决办法很简单：&lt;strong&gt;分层管理&lt;/strong&gt;，让家长签署影像使用同意书，明确写明“仅用于本园抖音账号展示，不用于商业推广”，对于不同意的孩子，拍摄时注意避开正脸，拍背影、侧脸、手部特写都行，千万别硬来，一旦因为隐私问题被投诉，平台会封号，得不偿失。&lt;/p&gt;

&lt;h3&gt;坑二：教学“表演化”趋势&lt;/h3&gt;
&lt;p&gt;这个最要命,一旦老师知道今天要拍视频，会不会刻意排练？会不会只挑“乖孩子”上镜？长期下来，孩子们会不会形成“镜头前一套，镜头后一套”的习惯？我的建议是：&lt;strong&gt;老师忘掉“拍摄”这件事，把手机当成一个“隐形观察者”&lt;/strong&gt;，最好的状态是，孩子们压根儿没注意到有镜头存在，这需要老师练习“盲拍”——眼睛不看屏幕，凭感觉举起手机，录十秒钟就放下，全程不打断孩子的活动。&lt;/p&gt;

&lt;h3&gt;坑三：频率绑架&lt;/h3&gt;
&lt;p&gt;说好的“365”，结果坚持两周断更了，家长开始问“怎么不发了”，这就是给自己挖坑。&lt;strong&gt;建议不要承诺“日更”&lt;/strong&gt;，而是“一周三更”或者“有值得记录的事就发”，质量永远比数量重要，偶尔断更，家长也能理解；但连续发一周“凑数”的视频，反而会拉低信任。&lt;/p&gt;

&lt;h2&gt;文献视角：这不仅是“短视频”，是“现象学”研究&lt;/h2&gt;
&lt;p&gt;其实这东西,学界早就有研究了，华东师范大学有位教授在论文里提过，幼儿园的影像记录，属于“儿童现象学”的一部分——通过影像，成人可以进入儿童的“生活世界”，你看，用抖音拍孩子，和用摄像机拍纪录片本质一样，都是&lt;strong&gt;在时间长河里打捞瞬间&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;但区别在于,纪录片是“单向创作”，而抖音是“双向凝视”，家长在评论区的留言，反过来会影响老师下一次拍什么，这个循环特别有意思，它让“家园共育”从一个抽象口号，变成了具体的、可操作的行为。&lt;/p&gt;

&lt;h2&gt;写在最后，但不总结&lt;/h2&gt;
&lt;p&gt;今天聊了这么多,从拍什么到怎么拍，从隐私保护到互动的意义，其实核心就一句话：&lt;strong&gt;短视频只是工具，真正重要的，是工具后面那个“看见孩子”的眼睛&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;下次你刷到幼儿园的抖音视频,不妨多停留两秒，看看孩子们在镜头里那种既无视镜头，又偶尔好奇瞟一眼的天真状态，那很可能就是这所幼儿园最真实的日常，至于我女儿幼儿园那条追泡泡的视频？现在还在置顶呢，每次我心情不好就翻出来看看，那个摔跤的小胖墩，现在已经是大班的大哥哥了，今年春天，他又摔了一跤，这次爬起来，他先看了看周围有没有人注意，然后自己拍拍土，假装什么事都没发生——视频底下，他妈妈留言：“长大啦，知道要面子了。”&lt;/p&gt;
&lt;p style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;http://www.lostfawn.cn/zb_users/upload/2026/08/20260803212844178576372460630.png&quot; alt=&quot;365幼儿园抖音短视频，从围观到共育的真实记录&quot; title=&quot;365幼儿园抖音短视频，从围观到共育的真实记录&quot; /&gt;&lt;/p&gt;
</description><pubDate>Mon, 03 Aug 2026 21:28:37 +0800</pubDate></item><item><title>一只小甜瓜视频365集，从追更到陪伴，这份快乐清单请收好</title><link>http://www.lostfawn.cn/?id=1693</link><description>&lt;p&gt;不知道从什么时候开始,我每天最放松的时刻，变成了窝在沙发上，点开那只看小甜瓜的视频，你说它有多惊天动地？好像也没有，但就是那种&lt;strong&gt;365集，一天不落&lt;/strong&gt;的陪伴感，让生活突然有了一个小小的锚点。&lt;/p&gt;

&lt;p&gt;今天不聊什么大道理,就想以一个普通观众的视角，跟你唠唠这只小甜瓜到底有啥魔力，以及我整理的一份“食用指南”。&lt;strong&gt;这可不是什么官方推荐，纯粹是我自己摸爬滚打总结出来的体验。&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;为什么是“365集”？这不仅是数量，更是一种节奏&lt;/h2&gt;
&lt;p&gt;起初我以为是随便起的名字,后来才发现，“365集”隐含着一个&lt;strong&gt;承诺&lt;/strong&gt;：每一天，都有一个几分钟的小确幸在等你。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;短小精悍&lt;/strong&gt;：每集时长基本控制在&lt;strong&gt;3-5分钟&lt;/strong&gt;，特别适合通勤、午休或者睡前碎片时间。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;连续又独立&lt;/strong&gt;：每集有个小主题，但你连着看也不腻，因为主角性格是连贯的，哪怕漏看几集，下一集照样能无缝衔接。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;情绪价值拉满&lt;/strong&gt;：&lt;strong&gt;小甜瓜&lt;/strong&gt;的声音和节奏，自带一种“解压感”，你不需要动脑子，跟着笑就行。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我自己有个习惯,晚上如果觉得脑子嗡嗡响，就随机挑一集，&lt;strong&gt;声音调到刚好能听清&lt;/strong&gt;，然后看着那只小甜瓜忙忙叨叨，心里那点毛躁就慢慢顺了。&lt;/p&gt;

&lt;h2&gt;核心看点拆解：它到底在演什么？&lt;/h2&gt;
&lt;p&gt;你别看它叫“视频”，其实内容形式挺丰富的，我看了几百集，帮大家梳理了主要的类型，&lt;strong&gt;方便新朋友快速上手&lt;/strong&gt;。
类型 | 占比（估摸） | 特点 | 适合人群 |
| :--- | :--- | :--- | :--- |
| &lt;strong&gt;日常整活&lt;/strong&gt; | 40% | 没有任何脚本痕迹，就是记录生活里的鸡毛蒜皮，但总能玩出新花样。 | 想放松、找乐子的 |
| &lt;strong&gt;美食探店/制作&lt;/strong&gt; | 30% | 画面拍得贼香，但不是那种高不可攀的精致，是&lt;strong&gt;路边摊、家常菜&lt;/strong&gt;的亲切感。 | 干饭人、深夜慎看 |
| &lt;strong&gt;萌宠互动&lt;/strong&gt; | 20% | 小甜瓜家里养了只&lt;strong&gt;橘猫&lt;/strong&gt;，叫“二条”，它俩的互动简直是我的快乐源泉。 | 猫奴、治愈系爱好者 |
| &lt;strong&gt;随机唠嗑&lt;/strong&gt; | 10% | 偶尔会开个长直播的剪辑版，聊点生活感悟，&lt;strong&gt;不鸡汤，但挺真实&lt;/strong&gt;。 | 老粉、喜欢慢节奏的 |&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;这里有个小提醒：&lt;strong&gt;别跳过片头和片尾&lt;/strong&gt;，有时候小彩蛋就藏在最后那几秒钟，比如二条突然窜出来捣乱，那一下比正片还好笑。&lt;/p&gt;

&lt;/blockquote&gt;
&lt;h2&gt;我的私藏“追更姿势”：这样看更入味&lt;/h2&gt;
&lt;p&gt;既然说到了费曼学习法,那我也用大白话分享下，怎么让这365集不只是“看过”，而是变成你生活的一部分。&lt;/p&gt;

&lt;h3&gt;从“看热闹”到“看门道”&lt;/h3&gt;
&lt;p&gt;别只盯着小甜瓜的脸,你会发现它的&lt;strong&gt;剪辑节奏&lt;/strong&gt;是有呼吸感的，比如在情绪铺垫时会故意放慢动作，在笑点出来时快速切换镜头。&lt;strong&gt;试着模仿它的节奏&lt;/strong&gt;，你甚至能学会怎么把无聊的日常剪得有趣。&lt;/p&gt;

&lt;h3&gt;建立你的“甜瓜备忘录”&lt;/h3&gt;
&lt;p&gt;我准备了一个小本本,专门记录视频里出现过的好玩的&lt;strong&gt;口头禅&lt;/strong&gt;或者&lt;strong&gt;生活小妙招&lt;/strong&gt;，比如有一集教用&lt;strong&gt;湿纸巾+冰箱&lt;/strong&gt;去橘猫毛，实测真的有用。&lt;strong&gt;带着问题去看&lt;/strong&gt;，收获会翻倍。&lt;/p&gt;

&lt;h3&gt;允许自己“跳着看”&lt;/h3&gt;
&lt;p&gt;别给自己压力。&lt;strong&gt;365集不是任务，是甜点&lt;/strong&gt;，今天心情好就看两集，忙了就不看，千万别攒着想着非得补完，那种“追更的负担感”一出来，快乐就变味了。&lt;/p&gt;

&lt;h2&gt;一只小甜瓜”的幕后花絮（不完全考证）&lt;/h2&gt;
&lt;p&gt;我扒拉了一点边角料消息,可能不准，但挺有意思，据说拍摄&lt;strong&gt;只用一部手机&lt;/strong&gt;，没有任何专业灯光，而且那个出镜频率最高的&lt;strong&gt;蓝色搪瓷杯&lt;/strong&gt;，从第一集用到了现在，边都磕掉漆了。&lt;/p&gt;

&lt;p&gt;这种&lt;strong&gt;不完美的真实感&lt;/strong&gt;，恰恰是它最打动我的地方，你看，它不用刻意卖惨，也不用炫技，就是摊开给你看：你看，我就这么普通，但我还是能笑着过好每一天。&lt;/p&gt;

&lt;p&gt;最后想唠叨一句,&lt;strong&gt;别在深夜连着看超过十集&lt;/strong&gt;，因为你真的会忍不住笑出声，然后肚子饿，真的，试过的人都知道。&lt;/p&gt;

&lt;p&gt;好了,不说了，二条又开始扒拉我的脚了，我得去给这位大爷开个罐头，顺便看看今天小甜瓜又更新了啥，希望这365集的快乐，也能钻进你的生活缝隙里。&lt;/p&gt;
&lt;p style=&quot;text-align:center&quot;&gt;&lt;img src=&quot;http://www.lostfawn.cn/zb_users/upload/2026/08/20260803185823178575470373597.jpg&quot; alt=&quot;一只小甜瓜视频365集，从追更到陪伴，这份快乐清单请收好&quot; title=&quot;一只小甜瓜视频365集，从追更到陪伴，这份快乐清单请收好&quot; /&gt;&lt;/p&gt;
</description><pubDate>Mon, 03 Aug 2026 18:58:17 +0800</pubDate></item></channel></rss>