没有声音:音频不播放 / 自动播放策略被拦
桌面版没有声音
先做最简单的两件事:
- 看系统音量——Windows 任务栏右下角喇叭图标、或者 macOS 菜单栏音量,有没有被静音
- Ruffle 参数设置里「音频输出设备」是不是选对了(插了 HDMI 显示器但声音从显示器出来了、你想切回耳机)
还不行的话:
看 Windows 音量混合器
Windows 右下角喇叭图标右键 → 打开音量混合器 → 找到 Ruffle 那一条 → 是不是被单独静音了、或者音量被拉到 0?
这是一个非常高频但很蠢的小问题——Windows 会给每个应用单独存一份音量设置,Ruffle 可能被你不小心静音过。
看 SWF 本身的音量设置
有些 Flash 游戏里自己有「静音 / 音量」按钮,默认可能是关的。
OpenH264 视频的声音
SWF 里如果是 FLV 视频(自带 MP3 音轨),Ruffle 内置 FLV 解码器,声音应该正常。如果是 H.264 + AAC 的视频,桌面版需要开启 OpenH264——没开的话视频能显示但 AAC 音频会被跳过。去 Ruffle 参数设置里勾上 OpenH264 编解码。
Web 版(浏览器扩展 / 网站嵌入)没有声音
90% 是浏览器自动播放策略拦的。
Chrome / Edge / Safari(iOS Safari 尤其严格)规定:用户没有跟页面发生交互之前(点击、按键),WebAssembly / <video> / <audio> 的自动播放会被静音。
Ruffle 的 Web 版默认在页面加载后就尝试播放 SWF,但用户如果还没点过页面 → 音频通道被浏览器保持静音状态。
解决办法
在设计上假设「首次进入页面不会自动播放」:
- 页面加载完后显示一个「点击开始」按钮 / 覆盖层
- 用户点一下 →
player.play()或player.load()触发 - 从那一刻起,浏览器认为用户已授权,音频自动解禁
Chrome 桌面版和 Android Chrome 对 Canvas 内容(没声音的那种)自动播放策略稍松,但带声音的一律要用户交互。iOS Safari 连 Canvas 内容的自动播放也拦,必须用户交互。
用 JS API 检查播放状态
player.addEventListener("play", () => {
// 播放开始时检查一下音量
if (player.volume === 0) {
// 提示用户点一下页面
}
});
扩展版本地解决
浏览器扩展没办法强制绕过站点的自动播放策略——同样要用户先点一下画布。
其他可能原因
- SWF 本身没有音频文件:老 Flash 动画很多是 silent 的
- Windows 声音增强功能干扰:右键音量图标 → 声音设置 → 相关设置 → 声音控制面板 → 扬声器属性 → 增强 → 勾掉「禁用所有声音效果」,某些增强驱动(杜比、SRS)会跟 WASAPI 冲突
- 多显示器切换后:HDMI 显示器切换回来,声音设备没跟着切,回到 Ruffle 参数设置里手动选一下