Skip to content

fix: make ffmpeg audio repair verifiable and recoverable - #127

Open
PristineStream wants to merge 4 commits into
ylw1997:mainfrom
PristineStream:agent/fix-ffmpeg-audio-replacement
Open

fix: make ffmpeg audio repair verifiable and recoverable#127
PristineStream wants to merge 4 commits into
ylw1997:mainfrom
PristineStream:agent/fix-ffmpeg-audio-replacement

Conversation

@PristineStream

Copy link
Copy Markdown

变更内容

  • 重写 reaplace-ffmpeg.py 的替换流程:
    • 自动识别 VS Code、Electron 版本和 CPU 架构
    • 新增 --check 只读诊断模式
    • 替换前后比较 SHA-256,避免误报成功
    • 替换前自动备份,失败时自动回滚
    • 检测仍在运行的编辑器进程
    • macOS 替换后执行 ad-hoc 签名并验证
    • 支持通过 VSCODE_INSTALLATION 指定非标准安装路径
  • 扩充 README 的无声音故障排查:
    • 说明终端中的 code 可能指向其他编辑器
    • 说明必须完全退出并重新启动编辑器
    • 说明编辑器更新会覆盖已替换的 FFmpeg
    • 记录哈希检查、备份、恢复和 macOS 签名风险

根因

实际复现环境为 macOS arm64、VS Code 1.130.0、Electron 42.6.0、TouchFish 17.9.0。用户曾运行旧脚本,但 VS Code 更新后重新写入了自带的精简 FFmpeg。旧脚本只输出 replace done,没有哈希校验、备份或更新覆盖提示,因此用户无法判断当前安装是否仍然有效。

匹配 Electron 42.6.0 的媒体库安装并重新签名后,TouchFish 视频声音恢复正常。

用户影响

用户现在可以在修改编辑器前安全检查当前 FFmpeg 是否匹配;替换失败时不会丢失原媒体库。编辑器升级导致问题复发时,README 也提供了明确的判断和恢复步骤。

验证

  • Python 语法编译通过
  • --help 命令通过
  • Electron 版本解析和 SHA-256 辅助函数测试通过
  • 离线集成测试通过:
    • --check 检出不匹配且不修改文件
    • 不匹配时完成备份和替换
    • 已匹配时不重复修改
  • git diff --check 通过
  • macOS arm64 / VS Code 1.130.0 / Electron 42.6.0 实机替换、签名验证及声音播放验证通过

注意

macOS 的 ad-hoc 签名会替换编辑器的官方应用签名,README 已明确提示风险。重新安装官方编辑器可恢复原始文件和签名。

@ylw1997
ylw1997 marked this pull request as ready for review July 28, 2026 07:13
@PristineStream
PristineStream force-pushed the agent/fix-ffmpeg-audio-replacement branch from 74cc473 to 915ef63 Compare July 28, 2026 07:22
@ylw1997

ylw1997 commented Jul 28, 2026

Copy link
Copy Markdown
Owner

感谢提交,这次重构增加了备份、哈希检查和 --check,整体方向很好。但合并前请先处理以下问题:

  1. macOS 的 resign_macos_app() 移除了现有实现中的自动 sudo。Issue macOS 26.1 + VSCode 1.130.0 ARM64 使用 replace-ffmpeg.py 后 VSCode 无法启动(可能其他高版本也有这个问题) #124 的环境已经确认需要 sudo codesign,否则替换成功后可能重签失败;回滚阶段又执行相同的无权限命令,也可能再次失败。请保留非 root 用户下的提权逻辑,并验证签名和回滚结果。

  2. 设置 VSCODE_INSTALLATION 但路径不存在时,当前实现会静默回退到默认 VS Code 路径,可能修改和重签错误的编辑器。显式指定的路径无效时应直接报错,不应继续搜索其他安装目录。

另外建议处理:

  1. editor_is_running() 在 Windows 下固定返回 False,与 PR 描述中的“检测正在运行的编辑器”不一致,被占用的 DLL 也可能让替换和回滚同时失败。

修复后我再重新 review,非常感谢。

@ylw1997

ylw1997 commented Jul 29, 2026

Copy link
Copy Markdown
Owner

感谢提交,之前反馈的三个问题已经修复,新增的 11 个测试也都通过了。

不过 Windows 当前还有一个阻塞问题:新版 VS Code 的实际程序文件可能位于安装目录下的版本子目录。例如我的 VS Code 1.130.0:

C:\Users\ylwgg\AppData\Local\Programs\Microsoft VS Code\1b6a188127\resources\app\package.json
C:\Users\ylwgg\AppData\Local\Programs\Microsoft VS Code\1b6a188127\ffmpeg.dll

当前 find_installation() 返回 Microsoft VS Code 根目录,package_path() 随后固定查找根目录下的 resources/app/package.json,实际运行 --check 会报:

Error: VS Code package.json was not found at ...\Microsoft VS Code\resources\app\package.json

旧脚本原本包含扫描安装目录下一级子目录的兼容逻辑。请恢复该逻辑,并确保找到版本目录后,package.json 和 ffmpeg.dll 都基于同一个版本目录处理。建议增加一个 Windows 版本子目录布局测试。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants