feat: NAS端FFmpeg预压缩 — 根治360MB视频跨境上传超时

根因诊断(网络问题,非代码逻辑):
- NAS(中国移动) → Oracle(美国Phoenix) 跨境上行带宽实测仅 0.5-0.9MB/s 且波动大
- 下载方向 3.0MB/s(非对称,典型国际出口拥塞)
- Tailscale P2P: ping 可通(224ms)但持续数据流被阻断(0 B/s, 127s超时)
- 360MB 原始视频上传需 10-20min,任何大分块都会超时

NAS dispatcher:
- 新增 _compress_video: 480p/CRF28/veryfast,静态监控场景实测 ~36x 压缩比
  (360MB → ~12MB,上传时间 20min → ~30s)
- ffmpeg 自动探测: CodecPack ffmpeg41(带libx264) > /usr/local/bin > PATH
  (Synology 系统 ffmpeg 被裁剪,无 h264 编解码)
- scale 两级滤镜: force_original_aspect_ratio=decrease + trunc(iw/2)*2
  (h264 要求偶数尺寸,853x480 会报错)
- 压缩缓存 /tmp/fam_compressed/task_{id}/,源文件未变则重试复用,TTL 24h
- 压缩完成后重置 PROCESSING 状态(重置 stale 回收计时基准)
- 压缩失败回退原始文件分块上传
- _query_uploaded_chunks 失败时记录日志(原静默失败导致全量重传无感知)

Edge api_gateway:
- fix: total_chunks 变更清理旧分块后同步重写 meta.json
  (原 bug: meta.json 不更新导致每块上传都触发清理,删除同批新分块死循环)

config:
- stale_timeout 600→1800(覆盖压缩+上传+Edge队列积压总时长)
- 新增 ffmpeg_path / compress_timeout 配置项
This commit is contained in:
ericwyuan
2026-08-20 14:59:50 +08:00
parent a9a1b1dda5
commit 203b076783
3 changed files with 139 additions and 18 deletions

View File

@@ -21,9 +21,11 @@ scheduler:
dispatcher:
poll_interval: 30 # 轮询间隔(秒)
edge_url: "http://100.x.x.20:5000/api/edge/video/push" # 推送模式端点(视频上传,同步返回结果)
max_retries: 3
push_timeout: 1800 # 推送+分析同步超时(秒)
edge_url: "http://100.x.x.20:5000/api/edge/video/enqueue" # 异步队列端点上传入队Poller 拉取结果)
max_retries: 5 # 文件级重试次数分块级重试另计每块3次
stale_timeout: 1800 # PROCESSING 僵尸回收(秒),需大于压缩+上传+Edge队列积压总时长
# ffmpeg_path: "/var/packages/CodecPack/target/bin/ffmpeg41" # 可选默认自动探测Synology 需 CodecPack 版,系统版无 h264 编码)
compress_timeout: 3600 # 单个视频预压缩超时(秒)
video_server:
base_url: "http://100.x.x.10:8000/media"