上传 120MB 视频分了 24 片,合并后文件 115MB,播放前 5 秒黑屏,ffprobe 报 moov atom not found,重新上传同一文件结果一样。乍看像缓存或者权限的锅,追下去往往不是。
parts = [read_part(i) for i in range(total)] assert sum(len(p) for p in parts) == expected_size write(b''.join(parts))
追下去是这么回事:前端分片下标从 0 开始,后端合并循环写的是 1 到 total,第 0 片从来没有被写进目标文件。合并接口只校验片数,不校验总字节数,所以没报错。
碰到「分片编号错位」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。
能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。报错里带路径的,先去看那个路径在不在、权限对不对。
具体做法是,前后端统一从 0 开始编号并在接口文档里写死;合并前检查 0 到 total-1 是否全部存在 缺一片就拒绝;合并后比对总大小和分片 md5 再标记完成。
验收就看一点,同一文件重新合并后大小是 120MB,ffprobe 能读出完整时长,首帧正常显示。
