A:增加文档

This commit is contained in:
jimmy committed 2025-11-16 18:13:25 +08:00
1 parent f15fb85251
commit 1241d147a6
3 files changed
+67 -5

No files matched your search

-5
View File
@@ -1,5 +0,0 @@
2025年8月16日 13点56分
1. 空文件夹自动删除
2. 不支持的文件通过ICON或文字配置可展示对应的图标或内容
3. ZIP、Tar 等常见压缩格式,支持自动解压或者手动解压
4. 重复照片检测并存储,方便删除
+7
View File
@@ -0,0 +1,7 @@
2025-08-16 13:06
1. 空文件夹自动删除
2. 不支持的文件通过 ICON 或文字配置可展示对应的图标或内容
3. ZIP、Tar 等常见压缩格式,支持自动解压或者手动解压
4. 重复照片检测并存储,方便删除
+60
View File
@@ -0,0 +1,60 @@
# 视频处理策略与经验
本项目需要统一管理本地视频(多格式、超高分辨率、HDR 等),并在桌面环境中提供稳定、流畅的播放体验。下面是后续实现视频处理功能时可以参考的思路。
## 目标与原则
- 统一播放体验:前端始终播放“易解码、兼容好”的视频流,不让前端处理格式细节。
- 按需转换:只对用户真正播放的视频做预处理,避免全库批量转码。
- 控制资源占用:在 CPU / 磁盘空间 / I/O 之间平衡,避免 8K / 10G 视频拖垮整机。
## 格式与编码策略
- 优先直接播放(无需转码):
- 容器 `mp4`/`webm`,视频编码 H.264,音频 AAC,分辨率 ≤1080p,非 HDR。
- 这类文件可直接通过 HTTP Range 输出原始文件给 `<video>` 播放。
- 统一代理格式:
- 对 mov、mkv、avi 等容器,或 HEVC/AV1 等复杂编码,一律转成 `MP4 + H.264 + AAC + SDR + 1080p`。
- 使用 ffmpeg 封装(`ffmpeg_tool.go`)提供探测信息 + 转码接口。
## 分辨率与大文件
- 屏幕驱动分辨率:
- 前端固定在 1080p 布局时,超出 1080p 的分辨率意义不大,可以统一生成 1080p 代理。
- 按需生成代理视频:
- 用户第一次点击播放时:
- 若满足“可直接播放”条件 → 直接播放原片;
- 否则投递“生成 1080p 预览/代理”的后台任务,并记录状态。
- 不在扫描阶段批量转码所有视频。
- 超大文件(如 10G+):
- 后端必须用流式读取 + Range 响应,禁止一次性读完整个文件。
- 若用户频繁观看,可为其生成 1080p 代理,减少后续 I/O 压力。
## HDR 与色彩空间
- 不考虑原生 HDR 播放时:
- 在转码过程中将 HDR 映射为 SDR(Rec.709,8-bit),统一处理为普通视频。
- 在元数据 / UI 中标注“该视频为 HDR,已转为 SDR 预览”,原片保留给外部工具或高级用户。
## 缓存与磁盘占用
- 所有代理视频放在独立缓存目录(如 `cache/video`):
- 使用统一命名(基于哈希 + 分辨率 / 格式),避免重复生成。
- 维护“最大缓存体积”配置(如 `video_cache_max_size_gb`),溢出时按 LRU 删除旧代理。
- 对已满足播放要求的源文件,不生成代理,直接使用原片。
## 实时性与转码模式
- 离线转码优先:
- 先实现“先转完再播”:用户发起播放 → 若需代理则排队转码 → 完成后返回 1080p 代理进行播放。
- 转码进度通过任务系统 + SSE 推送到前端。
- 流式 / 实时转码(后期优化):
- 对特大文件或需要“秒播”的场景,可考虑:
- ffmpeg 输出 HLS(`.m3u8 + .ts`),前端边拉边播;
- 或使用分片 MP4,边写边通过 Range 输出。
## 前后端协作建议
- 后端:
- 提供统一播放接口(如 `GET /api/v1/video/play?id=...`),内部自动选择原片或代理;
- 提供“确保预览 / 代理存在”的接口,通过任务队列执行 ffmpeg 转码;
- 暴露视频基础信息 API(时长、分辨率、编码、是否 HDR)。
- 前端:
- 固定使用一个播放 URL,不关心具体格式;
- 根据“预览状态”显示等待 / 进度 / 可播放等 UI,避免用户误以为程序卡死。
整体思路:能直接播就直接播,播不稳或不兼容就为它做一份 1080p SDR 代理,并用有限缓存控制空间,这样既能覆盖 8K / HDR / 特殊格式,又不会无限占用用户磁盘。