video2slides: 新 app — 长视频抽帧 + 逐帧差异 + 拖阈值挑幻灯片
Rust + axum + cube-core,前端纯静态单页。ffmpeg 每 N 秒抽一帧(限宽 1280),image crate 逐帧灰度 MAE 算差异;前端拖阈值实时把相近帧变灰、 关键变化高亮,悬停出彩色大图,分页 + toolbar 常驻。按 X-Client-Id 分目录 隔离,存储走 hostPath。镜像非 scratch:debian-slim + ffmpeg + musl binary。
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
//! video2slides.famzheng.me — 长视频按固定间隔抽帧,逐帧差异比较,
|
||||
//! 拖动阈值挑出关键画面/幻灯片。
|
||||
//!
|
||||
//! - 静态 SPA + SPA fallback 由 cube-core::base 处理。
|
||||
//! - `/api/*` 一组 REST:上传(multipart 流式落盘)→ 分析(后台线程跑 ffmpeg
|
||||
//! 抽帧 + image crate 逐帧灰度差异,前端轮询进度)→ 取帧元数据 / 缩略图 / 大图。
|
||||
//! - 按 `X-Client-Id` 头分目录,每个浏览器只看到自己上传的。
|
||||
//! - 存储靠 hostPath 挂进来的目录(默认 /data),pod 重启不丢。
|
||||
|
||||
mod core;
|
||||
mod handlers;
|
||||
|
||||
use axum::extract::DefaultBodyLimit;
|
||||
use axum::routing::{delete, get, post};
|
||||
use axum::Router;
|
||||
|
||||
use handlers::AppState;
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() -> std::io::Result<()> {
|
||||
cube_core::init_tracing();
|
||||
|
||||
let dist = std::env::var("VIDEO2SLIDES_DIST_DIR").unwrap_or_else(|_| "/dist".into());
|
||||
let data_dir = std::env::var("VIDEO2SLIDES_DATA_DIR").unwrap_or_else(|_| "/data".into());
|
||||
std::fs::create_dir_all(&data_dir)?;
|
||||
tracing::info!(%data_dir, "video2slides data dir");
|
||||
|
||||
let state = AppState::new(data_dir.into());
|
||||
|
||||
let api = Router::new()
|
||||
.route("/videos", post(handlers::upload_video).get(handlers::list_videos))
|
||||
.route("/videos/:id", delete(handlers::delete_video))
|
||||
.route("/videos/:id/analyze", post(handlers::analyze))
|
||||
.route("/videos/:id/job", get(handlers::job_status))
|
||||
.route("/videos/:id/frames", get(handlers::frames))
|
||||
.route("/videos/:id/thumb/:idx", get(handlers::thumb))
|
||||
.route("/videos/:id/frame/:idx", get(handlers::frame))
|
||||
.layer(DefaultBodyLimit::disable()) // 视频上传可能很大,关掉默认 2MB 限制
|
||||
.with_state(state);
|
||||
|
||||
let app = cube_core::base(dist).nest("/api", api);
|
||||
cube_core::serve(app, 8080).await
|
||||
}
|
||||
Reference in New Issue
Block a user