Skip to content

尝试支持类似Apple Music的AutoMix[Beta]#888

Merged
kazukokawagawa merged 126 commits into
SPlayer-Dev:devfrom
kazukokawagawa:dev-mix
Feb 18, 2026
Merged

尝试支持类似Apple Music的AutoMix[Beta]#888
kazukokawagawa merged 126 commits into
SPlayer-Dev:devfrom
kazukokawagawa:dev-mix

Conversation

@kazukokawagawa
Copy link
Copy Markdown
Collaborator

@kazukokawagawa kazukokawagawa commented Feb 14, 2026

现在已经处于可用状态了,打上了beta标签和开启告示
仍然需要精确拍数和更精准的计算,但是现在已经可用了,效果没啥问题
有歌曲出问题一般也不会太离谱,至少我还没遇到

可以看着合并了

- 添加音频分析模块,使用 Symphonia 库检测音频淡入淡出点
- 实现交叉淡入淡出播放功能,支持自动混音过渡
- 新增设置选项:启用自动混音和过渡时间配置
- 优化音频上下文管理,使用共享 AudioContext 避免资源浪费
- 在播放控制器中添加自动混音逻辑,歌曲结束前自动触发下一首过渡
- 在 native/tools 包中添加 index.d.ts 类型定义文件,导出 analyzeAudioFile 函数及 AudioAnalysis 接口
- 将主进程中对原生模块的导入从相对路径改为使用包名 "tools"
- 在 package.json 中通过本地链接添加 tools 依赖,确保 TypeScript 能正确解析类型
- 简化音频分析函数的实现,移除未使用的代码以提升可维护性
添加原生模块加载检查,当 tools.node 模块未成功加载时抛出明确错误
添加启用自动混音开关及其过渡时间设置项,用于控制音频播放时的自动混音行为。
- 扩展音频分析接口,新增 BPM 置信度、首拍位置和响度等字段
- 为本地歌曲添加预分析机制,支持 Automix 功能开关
- 实现分析结果缓存,避免重复分析相同文件
- 在播放控制器中集成智能切入切出与 BPM 对齐逻辑
- 优化原生分析模块,使用包络检测替代原始样本处理以提升性能
- 将 TypeScript 接口中的 snake_case 属性名改为 camelCase,以保持项目命名一致性
- 清理 Rust 分析代码中未使用的导入
- 重构静音检测函数,使用更简洁的条件赋值逻辑
- 在音频分析中新增人声检测与智能切点(cut_in_pos/cut_out_pos)计算
- 为播放引擎添加淡入淡出曲线选项(线性、指数、等功率)
- 扩展音频分析缓存机制,支持版本与最大分析时间参数
- 重构自动混音播放逻辑,分离 UI 状态设置与音频播放
- 改进交叉淡入淡出切换流程,支持延迟 UI 切换以避免卡顿
- 在设置界面添加自动混音最大分析时间配置项
- 在 PlayerController 中创建安全的音频源对象,确保 url 不为空并提供默认值
- 修复音频分析中尾部跳转逻辑,使用已提取的 n_frames 变量计算总时长
- 移除未使用的闭包和内联注释,简化音频分析的窗口处理逻辑
- 将播放状态更新中的 quality 和 source 强制转换为正确的类型
- 移除硬切逻辑,改为基于 BPM 匹配的平滑过渡
- 新增下一曲预分析缓存,提前获取分析数据
- 智能计算交叉淡化时长、起始点和播放速率
- 删除不再使用的自动混音过渡时间设置项
- 更新分析版本至 3 以保持前后端同步
在BPM匹配的自动混音场景中,根据下一首歌曲的第一个强拍位置计算UI切换延迟,使界面切换与音乐节拍对齐。如果未找到合适的节拍点,则默认使用交叉淡化时长的50%作为延迟。同时添加了混音开始时的用户提示信息。
- 在音频分析结果中新增 `loudness` (LUFS) 和 `drop_pos` 字段
- 实现 ITU-R BS.1770 K-weighting 响度计,提供专业响度测量
- 为 AutoMIX 功能添加高通和低通滤波器,支持切入/切出时的低频过滤
- 在音频处理管线中串联专用滤波器,实现平滑的频率渐变效果
- 新增 bassSwap 混音类型,在BPM匹配时自动启用,通过高通滤波器实现低频切换
- 添加响度匹配功能,根据歌曲LUFS值自动计算增益,限制在±9dB范围内
- 支持Drop点对齐,智能调整混音起始位置以优化过渡效果
- 扩展AudioAnalysis接口,新增dropPos字段用于识别歌曲高潮位置
- 改进ReplayGain应用逻辑,支持在混音时传递增益值
将 TypeScript 接口和 Rust 结构体的字段名从驼峰式改为蛇形命名,以保持跨语言命名一致性。
为 Rust 结构体字段添加 `napi(js_name)` 属性,确保与 JavaScript 端的映射正确。
- 在 BaseAudioPlayer 中为渐变操作添加安全延迟,避免音频上下文队列过载
- 音频分析新增 vocal_last_in_pos 字段,用于检测最后一段人声起始位置
- 智能混音算法优化:优先对齐下一首的人声进入点或 Drop 点,并支持小节对齐
- 触发时间计算改进:基于最后人声段提前触发,并确保在小节第一拍对齐
在 analyze_audio_file 函数返回的 AudioAnalysis 结构中新增 vocal_last_in_pos 字段,以记录人声最后进入的时间位置,提供更完整的音频分析信息。
- 优化 Automix 混音触发逻辑,优先使用 cut_in_pos 跳过前奏
- 放宽 BPM 匹配误差范围至 20% 以提高匹配成功率
- 添加主音量字段用于跨引擎音量同步
- 修复高音滤波器参数格式化问题
- 统一代码缩进和换行格式,移除多余空行
添加 vocal_last_in_pos 字段至 AudioAnalysis 接口,以支持记录人声最后一次进入的位置,扩展音频分析功能。
@kazukokawagawa kazukokawagawa self-assigned this Feb 14, 2026
@kazukokawagawa kazukokawagawa added 高优先级 P0 这个问题将被高优先级处理 正在处理 labels Feb 14, 2026
@gemini-code-assist

This comment was marked as outdated.

gemini-code-assist[bot]

This comment was marked as outdated.

kazukokawagawa and others added 8 commits February 15, 2026 10:27
- 重构 Rust 分析模块,优先使用 first_beat_pos 作为 cut_in_pos
- 新增 cut_out_pos 计算逻辑,结合人声结束点、小节吸附与能量边界
- 前端 AutoMix 同时消费 cut_in_pos 和 cut_out_pos,并根据能量差调整过渡时长
- 修复分析缓存版本不一致问题,确保缓存命中
- 使用条件表达式直接赋值替代可变变量与条件块
- 移除冗余的变量声明与重复的默认值设置
- 保持原有逻辑不变,仅改进代码结构与可读性
防止将 .trae 目录下的文件提交到版本控制。
- 重构 Rust 分析模块,增强 `snap_to_bar` 函数支持三种吸附模式,改进尾奏能量计算和智能切入/切出点逻辑
- 在 TypeScript 播放控制器中引入高频检测循环,实现更精确的自动混音触发时机计算
- 优化 BPM 匹配范围,收紧至 +/-6%,并改进能量流调整和过渡时长计算
移除 AudioElementPlayer 中的独立 ReplayGain 节点,在 BaseAudioPlayer 中统一处理增益。
这简化了子类实现,并确保所有播放器类型的音量控制(包括 ReplayGain)行为一致。
- 将音频分析缓存版本从5升级到6,以同步Rust端的算法更新
- 在Rust分析中增加切出点缓冲至8拍,确保人声结束后展示足够器乐段
- 为无BPM检测情况添加后备切出逻辑(倒数15秒)
- 在PlayerController中新增智能过渡时长计算方法,基于BPM、可用空间和能量差异动态调整
- 优先使用Rust计算的智能切出点作为混音锚点
- 在BassSwap混音类型中应用智能过渡时长计算,替代固定的32拍过渡
调整快速混合策略的名称为“Rapid Bass Swap (2 Bars)”,并更新其过滤策略为“Bass Swap / LPF”。
为激进混合策略增加2小节候选时长,并调整逻辑使4小节使用“Quick Fade”,而更长(及2小节)的混合使用“Bass Swap / LPF”。
添加关于在线歌曲限制的说明,明确当前仅支持本地分析,在线歌曲使用固定8秒过渡。
- 使用 Prettier 统一格式化多个 TypeScript 文件,包括换行、缩进和引号
- 修复 package.json 文件末尾缺少换行符的问题
- 统一音频分析 worker 和 IPC 处理中的代码格式
- 规范自动化混音和音频管理器中的代码结构
- 调整元组和函数参数的多行格式,保持一致的缩进
- 拆分过长的表达式以提高可读性
- 统一代码风格,不改变任何逻辑行为
@kazukokawagawa kazukokawagawa marked this pull request as ready for review February 15, 2026 14:50
@kazukokawagawa kazukokawagawa requested a review from imsyy February 15, 2026 14:51
kazukokawagawa and others added 18 commits February 16, 2026 11:55
- 新增 peekPrefetch、getMusicCachePath 和 ensureMusicCachePath 方法,支持音乐文件缓存管理
- 增强音频分析功能,支持自定义分析时长并通过文件路径或 URL 进行识别
- 添加 currentAudioSource 和 currentAnalysisKey 状态跟踪,提高分析准确性
- 新增 ensureAutomixAnalysisReady 方法,提前预加载当前和下一首歌曲的音频分析
- 增加 nextAnalysisSongId 和 ensureAutomixAnalysisKey 等状态字段,支持基于歌曲ID的缓存管理
- 改进分析路径获取逻辑,优先使用缓存路径,支持网络资源的本地缓存分析
- 在播放状态更新时触发预加载,减少混音切换时的分析延迟
- 在 AudioElementPlayer 中移除 ts-ignore,使用类型断言确保类型安全
- 在 AudioManager 中清理未使用的变量以消除冗余代码
在自动混音切换时,强制对在线音频源进行缓存以确保无缝过渡。同时防止歌曲结束时因过渡状态而重复触发结束事件。
添加 currentAnalysisKind 和 nextAnalysisKind 字段以精确跟踪分析类型(none/head/full)。
修复 ensureAutomixAnalysis 中仅检查 currentAnalysis 存在性而未检查其完整性的逻辑错误。
在 prepareAudioSource 中新增 analysis 选项以支持按需进行头部或完整分析,避免不必要的分析开销。
在 crossfade 场景下使用头部分析以提升性能,并确保分析状态在歌曲切换时正确同步。
统一使用两个空格进行缩进,并调整对象参数的多行格式以提升代码可读性。
将 AutomationPoint 接口从 PlayerController 移至 IPlaybackEngine 以统一类型定义
修复多个文件的代码格式问题,包括缩进和换行
将冗长的match语句替换为预定义的映射数组,提高代码可读性和维护性。
将重复的音频帧处理逻辑重构为通用的 process_decoded_frames 函数,减少代码重复。
引入 WindowState 和 TempBuffers 结构体来管理处理状态,提高代码可读性和可维护性。
重构后支持所有音频格式的统一处理,并修复了时间计算逻辑。
- 重构复杂的过渡计划生成方法,拆分为更清晰的策略分支
- 提取 snapToBeat、createAutomixPlan 和 applyAggressiveOutro 辅助方法
- 简化退出点计算逻辑,移除冗余的边界检查和条件分支
- 保持原有超激进尾奏快切功能,但将其封装为独立方法
将硬编码的策略条件提取为策略数组,使用循环统一匹配逻辑,提高可维护性和可读性。
重构 TrackAnalyzer 的 process_sample 方法为静态方法 process_sample_static,通过传入 loudness_meter 和 head_pcm 的引用,解决了在 process_segment 方法中同时借用 self 多个可变部分导致的编译错误。同时简化了 detect_key 函数的返回值逻辑,移除冗余的 Some 包装。
- 仅在完整分析数据可信时才使用分析中的退出点
- 当淡出点早于人声结束点时,回退到文件末尾
- 增加切出点的有效性检查,防止无效分析数据影响退出点
- 优化警告日志,统一使用可信任的变量
在单曲循环模式下,当 Automix 未触发过渡时,确保下一首歌曲正确指向当前歌曲而非索引越界。同时增加播放列表为空时的保护检查。
优化警告信息,移除关于在线歌曲固定过渡时长的说明,并调整对效果差异的描述以更准确反映当前实现。
@kazukokawagawa kazukokawagawa marked this pull request as draft February 18, 2026 11:02
确保自动混音特效状态在歌曲切换和混音结束时都能被正确清理,避免特效残留。通过引入新的状态变量和统一清理逻辑,替换原有的依赖歌曲ID变化的监听,使特效关闭行为更可靠。
@kazukokawagawa kazukokawagawa marked this pull request as ready for review February 18, 2026 12:54
@kazukokawagawa kazukokawagawa merged commit 238c15f into SPlayer-Dev:dev Feb 18, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

正在处理 重要 重要信息 需要帮助 需要特别关注 高优先级 P0 这个问题将被高优先级处理

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants