b36e30ecbf
deploy articulate / build-and-deploy (push) Successful in 58s
deploy cube / build-and-deploy (push) Successful in 1m22s
deploy karaoke / build-and-deploy (push) Successful in 59s
deploy llm-proxy / build-and-deploy (push) Successful in 1m49s
deploy music / build-and-deploy (push) Successful in 2m6s
deploy notes / build-and-deploy (push) Successful in 1m42s
deploy simpleasm / build-and-deploy (push) Successful in 1m18s
deploy webgl / build-and-deploy (push) Successful in 1m5s
deploy video2slides / build-and-deploy (push) Successful in 2m3s
deploy werewolf / build-and-deploy (push) Successful in 1m5s
deploy write / build-and-deploy (push) Successful in 1m24s
- 点击卡片切换 use/discard,手动覆盖阈值判定;手动标记角标 + 重置按钮 - 导出 PDF:后台 job,逐张把帧 JPEG 以 DCTDecode 直接嵌入、边读边写到磁盘, 内存峰值只一张帧,防大视频 OOM;前端轮询进度条 - 下载走流式(ReaderStream),不把整份 PDF 读进内存;?c= query 触发下载 - 手撸极简 PDF writer(无新 PDF 依赖),只扫 JPEG 头取宽高分量数
video2slides
把一段长视频(演讲 / 课程录屏)按固定间隔抽帧,逐帧比差异,拖动阈值就能把重复画面变灰、留下关键变化(≈ 幻灯片翻页点)。
线上:https://video2slides.famzheng.me
架构
跟 cube 其它 app 同款:Rust + axum + cube-core,前端纯静态单页(零构建)。唯一特殊处——依赖 ffmpeg/ffprobe,所以镜像不是 FROM scratch 而是 debian-slim 装 ffmpeg + 拷静态 musl binary。
- 后端
src/:core.rs(存储 / 后台任务 / ffmpeg 抽帧 / image crate 逐帧灰度 MAE 差异)、handlers.rs(REST)、main.rs(路由)。 - 前端
frontend/index.html:上传(进度) → 分析(进度) → 结果网格;顶部常驻 toolbar(阈值滑块 + 仅显示保留帧 + 保留/总数 + 分页),悬停缩略图浮出彩色大图。
流程
- 上传 —— 拖拽或选文件,multipart 流式落盘,进度条到 100% 后 ffprobe 校验。
- 分析 —— 设「每隔 N 秒抽一帧」(默认 8),
ffmpeg fps=1/N抽帧(限宽 1280),逐帧生成缩略图并算相邻帧灰度逐像素 MAE(0–100)。后台线程跑,前端轮询进度。 - 挑帧 ——
diff ≥ 阈值= 关键变化高亮保留;< 阈值= 跟上一帧太像变灰。纯前端实时切换,不回后端。
隔离与存储
- 前端在
localStorage存随机v2s_client,所有请求带X-Client-Id,后端按 client 分目录。换浏览器 = 换身份,互相看不到。 - 每个视频一个目录:
source.*原片、frames/抽出的彩色帧(大图预览)、thumbs/缩略图、meta.json(含每帧时间戳与 diff)。 - 线上数据落 hostPath
/var/lib/cube/video2slides(单节点 k3s,pod 重启不丢)。
本地跑
# 后端(数据 / 前端目录用 env 指过去,端口 8080)
VIDEO2SLIDES_DATA_DIR=/tmp/v2sdata VIDEO2SLIDES_DIST_DIR=apps/video2slides/frontend \
cargo run -p video2slides
打开 http://localhost:8080。需要本机有 ffmpeg / ffprobe。
部署
push 到 master 且改了 apps/video2slides/** → .gitea/workflows/deploy-video2slides.yml 自动 build musl → 打 debian+ffmpeg 镜像(--no-cache)→ push registry → kubectl apply + rollout。
namespace cube-video2slides,已手工建好 registry-creds(从别的 ns 拷的,不进 git)。换 ns 重建命令:
kubectl -n cube-webgl get secret registry-creds -o yaml \
| sed 's/namespace: cube-webgl/namespace: cube-video2slides/' \
| kubectl apply -f -