林知夏把她那台 iPhone 8 寄来时,附了张纸条:“第 47 段坏了,我修不好。”
拆开快递那天我蹲在玄关半小时。手机壳是褪色的雾霾蓝,背面贴着一张 2019 年的演唱会贴纸。iCloud 里躺着 3.2G 的 m3u8 缓存,被切成了 412 个小片段,倒数第二段缺了 8 秒。她说那 8 秒里有人喊了她的名字。
今天是 2026 年 5 月 18 日,下午四点十七分,我把手机插上线,看着进度条一格一格爬。窗外有雨。我想起五年来的每一次下载、每一次失败、每一次把碎掉的片段重新缝起来的手感——于是有了这一页。
拆开快递那天我蹲在玄关半小时。手机壳是褪色的雾霾蓝,背面贴着一张 2019 年的演唱会贴纸。iCloud 里躺着 3.2G 的 m3u8 缓存,被切成了 412 个小片段,倒数第二段缺了 8 秒。她说那 8 秒里有人喊了她的名字。
凌晨三点十七分,水壶第三次响。我对着终端里那行 ffmpeg -f concat 发呆,旁边贴着一张便利贴,写着我自己的话:“顺序错了,就都错了。” m3u8 这东西好就好在它诚实,一段一段摆在那儿,骗不了人。
她原话是:“组合数那么多种,可播放的顺序只有一条。”我觉得这句话可以写进任何一本讲流媒体的书里。那天我们在便利店门口站着聊了四十分钟,她手里那瓶乌龙茶一直没开。
楼主 ID 叫 “半截铅笔”,最后回复停在 2016 年 11 月 3 日。他说:“别急着合并,先确认每一段的时长。”九年了,这句话还在救我。我把网页存了下来,打印成一页纸,夹在笔记本里。
人对顺序是有直觉的。乱掉的片段像被打乱的章节,你能读,但你读不出那个喘气的节奏。那天我把读到的那页折了个角,折在第九行——正好是我觉得整段最像 .ts 切开的一处。
但转念一想,人搜的从来不是词,是某个下午。就像我搜 m3u8,其实搜的是那段没看完的直播。搜索框是一个很诚实的器官,它记住你手指打过、又删掉的那半句话。
说实话,我觉得一键合并是被严重高估的。我不止一次见过朋友点了那个按钮,等了三分钟,得到一个 6.4G 的怪东西:画面和声音差半秒,字幕在飘。我更愿意打开那个只有 11 行的 m3u8 列表,一行一行看过去,看 EXTINF 后面的 9.98 还是 10.00,看 372 段里是不是混进了两段广告切片。这个过程慢得像用镊子夹起碎掉的瓷片,可它诚实——你用多少耐心对它,它就还你多少完整。上次帮 郭宇欣主演的全部作品 的一个剪辑片段做恢复,我在第 218 段发现了一个 3 秒的静音缺口,正是它让整条时间轴往后错了整整半拍。补上,重新跑,凌晨四点二十一分,画面里那个人终于把话说完了。那一刻的满足,比任何一键工具都真实。
一个负责嗅探,一个负责下载,一个负责排序。分工明确得像三班倒。朋友笑我小题大做,我说:22 秒里有一句我想留下的话,就够了。工具永远比欲望慢一点点,这是好事。
就 4 秒。我数过。刚好够你看见一个画面亮起来,然后黑掉。像一个只肯告诉你开头的人。我那天反复点了二十几次,就为了确认这个数字,最后在便签上写:“4 秒的预览,是为了让你想 merge 剩下的一切。”
别删它。别删它。别删它。我在厨房里对自己说了三遍。它像一封信最后的落款,没有它,播放器永远觉得后面还有,永远在等。凌晨一点半,我把那个文件重新加回去,时长 58 分 12 秒,一切恢复正常。
他戴着一只耳机,屏幕光是暖的。你知道那种拖动吗——找的其实是某一秒钟,一个人正好回头。m3u8 把时间切成小段,可人的记忆从来不是平均分配的。有人一格就走,有人会停在 0.3 秒的地方,看了很久。
先备份,再动手。先看清单末尾,再动手。把顺序写在纸上,再动手。别在你困的时候补最后一段。别信那个 “已经完成 100%” 的提示。以及——如果第 47 段坏了,不要难过,它坏掉的地方,正是你记住它的地方。