From ed04c04d9384dd9112b42e857e7795a79d585a60 Mon Sep 17 00:00:00 2001 From: baiqing Date: Tue, 23 Jun 2026 22:58:54 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20export=20audio=20mixdown=20(#117)=20lan?= =?UTF-8?q?ded=20=E2=80=94=20Phase=205=20progress=20+=20changelog?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 5 +++-- docs/ROADMAP.md | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4324e0a..4a29b55 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,7 +15,8 @@ - 上游 palmier-pro 无此模块,#37 为 OpenTake 新增子系统,不要求 1:1。剩:库→时间线拖拽(现用「导入当前项目」按钮)、媒体面板「星标→library_favorite」接线、收藏从 localStorage 迁后端。 - **文本工具 MVP**(#96,PR #107):Toolbar `T` 按钮接线 `addTextClip()`、新增 `TextTab.tsx` 文字内容编辑、Inspector 路由 text tab。字体/字号/颜色等 `textStyle` 留后续(依赖后端 ClipProperties 扩展)。 - **SRT/VTT 字幕导出纯逻辑**(#29 D 层切片,PR #110):`crates/opentake-domain/src/subtitle_export.rs` 把按 `caption_group_id` 分组的字幕 clip 序列化为 SubRip/WebVTT 字符串(零 IO、零新依赖、16 单测)。导出层/agent 工具/前端对话框留后续切片。 -- **整条时间线视频导出编排**(Phase 5 spine,PR #112):`src-tauri/src/export.rs` + `export_video` 命令,逐帧 `Compositor::render_to_rgba` → `VideoEncoder::push_frame` → `finish`,全分辨率 H.264/.mp4(H.265/ProRes/音频/进度取消留后续)。含 ffmpeg/GPU 门控集成测试。自包含复制 preview 路径,未碰 `composite_frame`。 +- **整条时间线视频导出编排**(Phase 5 spine,PR #112):`src-tauri/src/export.rs` + `export_video` 命令,逐帧 `Compositor::render_to_rgba` → `VideoEncoder::push_frame` → `finish`,全分辨率 H.264/.mp4(H.265/ProRes/进度取消留后续)。含 ffmpeg/GPU 门控集成测试。自包含复制 preview 路径,未碰 `composite_frame`。 +- **导出线性音频混音**(Phase 5,PR #117):`crates/opentake-media/src/encode/mix.rs` 逐 clip 单声道 PCM 按帧偏移铺放 + `volume_at` 增益包络 + 叠加 + 硬限幅;`VideoEncoder::finish()` 第二趟 ffmpeg mux AAC(`-c:v copy`/`-shortest`,mux 失败回退视频-only),真接通原 dead `push_audio`;含 AAC 轨 + 视频-only 不漏音轨 + 临时件清理集成测试。无音频时仍产出与 #112 相同视频-only 文件。 - **`list_models` 工具接线**(#9/#10 切片,PR #111):`opentake-agent` 从存根接 `opentake-gen` 内置静态 catalog,`?type=` 过滤 + `{ models, loaded }` JSON,纯本地无网络/BYOK。 - **caption-group 样式批量同步纯逻辑**(#29 切片,PR #113):`crates/opentake-domain/src/caption_sync.rs` 把某 `text_style` 批量套到同一 `caption_group_id` 的所有字幕 clip(不可变 / 跨组隔离 / legacy 安全,12 单测)。接 UI/命令留后续。 @@ -23,7 +24,7 @@ | PR | 处置 | 说明 | |---|---|---| -| #104 #106 #107 #110 #111 #112 #113 #115 | **已合并** | CI 双绿 + 审核通过(对抗验证 CONFIRM / 主控亲审)的纯新增项;**#115 收口 #37 全局库 epic** | +| #104 #106 #107 #110 #111 #112 #113 #115 #117 | **已合并** | CI 双绿 + 审核通过(对抗验证 CONFIRM / 主控亲审)的纯新增项;**#115 收口 #37 全局库 epic**;#117 导出加音频混音 | | #76 | **已关闭** | bundle id 改名冗余(main 已是 `com.opentake.desktop`,#74 已合) | | #77 #78 #79 #105 #108 | **请修改(@作者)** | 详见下「待审 PR」 | diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index 1f0c409..02fb449 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -45,7 +45,7 @@ ## Phase 5 — 导出 - **做**:wgpu 逐帧合成 → ffmpeg 编码;复刻预设(H.264/H.265/ProRes × 三档分辨率),逐项对齐码率/profile/色彩逼近上游;`renderSize` 取偶数。 - **验证**:导出 mp4 可播放;与上游导出对比画质/时长/音画同步一致。 -- **进度**:整条时间线逐帧导出 spine 已落地(#112,`src-tauri/src/export.rs` + `export_video` 命令,H.264/.mp4 全分辨率,逐帧 `Compositor::render_to_rgba` → `VideoEncoder` 编码,含 ffmpeg/GPU 门控集成测试)。剩 H.265/ProRes 预设 + 音频混流 + 进度/取消。 +- **进度**:整条时间线逐帧导出 spine 已落地(#112,`src-tauri/src/export.rs` + `export_video` 命令,H.264/.mp4 全分辨率,逐帧 `Compositor::render_to_rgba` → `VideoEncoder` 编码,含 ffmpeg/GPU 门控集成测试)。**线性音频混音已接入**(#117,`opentake-media/src/encode/mix.rs` 逐 clip PCM 按帧偏移 + volume_at 增益 + 叠加硬限幅,`finish()` 第二趟 ffmpeg mux AAC/`-shortest`,mux 失败回退视频-only,含 AAC 轨集成测试)。剩 H.265/ProRes 预设 + 进度/取消(音频重采样曲线/pan/立体声/动态为后续)。 ## Phase 6 — React 前端 对应 ui-rebuild 模块(Timeline/MediaPanel/Inspector/Settings/Toolbar/Help/UI)。