老周那台 2012 年的 MacBook Air 上,我数出了 214 个 ts 切片
老周把电脑递给我时,屏幕上只剩半截进度条。214 个切片散在桌面,
命名从 seg-0.ts 到 seg-213.ts。他说“你帮我合并吧”,
语气像托付一盆快枯的绿植。我插上硬盘,听风扇响了四分钟。
昨天深夜两点十七分,我在 2019 年那块旧硬盘的 /hls_cache 文件夹里,
翻出三百多个 .ts 切片和一个孤零零的 index.m3u8。
它们像一箱没贴地址的信,我坐在地板上,决定一封一封拆开。
共 10 篇 · 从索引文件写起,写到 ffmpeg 的报错信息为止
老周把电脑递给我时,屏幕上只剩半截进度条。214 个切片散在桌面,
命名从 seg-0.ts 到 seg-213.ts。他说“你帮我合并吧”,
语气像托付一盆快枯的绿植。我插上硬盘,听风扇响了四分钟。
那条链接在第 7 分钟断过一次。我盯着日志里“connection reset by peer”, 把下载器的并发从 16 调到 2。转成 mp4 只要 11 秒,可重新下载花了 38 分钟。 这就是我坚持先落地、再转码的全部理由。
ffmpeg -i index.m3u8 -c copy out.mp4,十二个词。
图书馆管理员路过看了两眼,没说话。隔壁桌的男生抄了一遍,
问我“copy 是什么意思”。我说,是不重新编码,像把散页装订,不动纸上的字。
#EXT-X-ENDLIST 看了很久索引文件末尾少了这行标记时,播放器会以为还有下一段。我把缺失的一行补回去, 转码在 23 秒后结束。那晚我在日志里写下:“有些结束,是被写出来的, 不是被等出来的。”这句话有点矫情,但我没删。
我拿他家书架打比方:m3u8 是目录,ts 是每一册。他想了想说, 那转成 mp4 就是把整套书装进一个箱子。我点头。他十岁, 比我二十二岁时理解得快。那天下午我给他演示了三次合并。
文件夹名是“to_convert”,意思是“待转换”。一待就是七年。 转码用了一分零四秒,文件从 312 个切片变成一个 1.2GB 的 mp4。 我双击播放,听到 2018 年秋天的风声,和一段我早已忘记的对话。
小林在 GitHub 评论区回我:“先读索引,再动手。”六个字。 我照做,把 m3u8 从头到尾读了一遍,发现码率标记和实际切片对不上。 改了两行,转码成功。后来我把这六个字写进了自己的脚本注释里。
日志文件夹叫“fail_logs”,里面有 63 个文本文件。最早一份是 2020 年 4 月 11 日, 报错是“moov atom not found”。每一条我都读过不止一遍。 失败比成功更具体,它告诉你,哪一步没有接上。
从国贸到三元桥,信号断两次。我用 Termux 里装的 ffmpeg, 把三个短视频的 m3u8 逐个转成 mp4,每个不到 40MB。 出站时手机发烫,像握着一块刚烤好的石头。我把它们命名为“通勤_01”到“通勤_03”。
第一,-c copy 能解决的不重编码;第二,输出文件名保留原索引里的时间戳; 第三,原 ts 切片留 30 天。三条都是踩坑踩出来的。 第三条最常被人笑,但去年我靠它救回一个被人误删的片段。
这些词,都是转码时反复碰到的石头
页面角落里那些反复被点开的名字