标签不支持裸AAC(ADTS流),必须使用MP4封装的AAC(.m4a/.mp4)并配audio/mp4 MIME类型及CORS头,否则静音或报错;fallback推荐MP3/OGG;裸AAC需Web Audio API手动解码。

HTML 的 <audio></audio> 标签本身不拒绝 AAC,但浏览器只认“封装好的 AAC”——裸 .aac 文件(ADTS 流)在 Chrome/Firefox 里根本不会响,Safari 虽能播但条件苛刻。别怪标签,要查格式、MIME 类型、CORS。
为什么 <audio></audio> 加 .aac 路径总是静音或报错
常见错误现象:页面没报错,但一点声音都没有;或者控制台抛出 DOMException: The element has no supported sources。
根本原因不是 AAC 编码不被支持,而是浏览器要求 AAC 必须装进 MP4 容器(即 .m4a 或 .mp4),且服务端返回的 Content-Type 必须是 audio/mp4 或 audio/x-m4a。裸 .aac 是 ADTS 帧流,Chrome/Firefox 直接跳过,不尝试解码。
容易踩的坑:
立即学习“前端免费学习笔记(深入)”;
- 后缀是
.m4a,但实际内容仍是裸 ADTS(可用ffprobe file.m4a验证,看是否显示codec_name=aac且format_name=mp4) - 服务器返回
Content-Type: audio/aac—— 这对 Chrome/Firefox 无效,仅 Safari 在跨域干净时可能勉强接受 - 没配
Access-Control-Allow-Origin,请求成功但静音(DevTools Network 里看响应头)
正确用法:MP4 封装 + 正确 MIME + 多源 fallback
推荐路径写法和结构:
把任意文章或文档内容转换成精美的全屏翻页 HTML 演示文件(幻灯片风格)。当用户发来一篇文章、文档链接、Markdown 内容、或粘贴的文本,并且希望生成演示用的 HTML 时触发。支持任意内容来源:iWiki 链接、KM 链接、本地文件路径、直接粘贴的文本。生成的 HTML 文件保存到本地工作区,并通过企微直接发送给用户。触发词示例:帮我把这篇文章做成PPT、转成演示文档、生成HTML幻灯片、做个演示、转成可以演示的格式、article to deck、make a slide。
<audio controls> <source src="sound.m4a" type="audio/mp4"> <source src="sound.mp3" type="audio/mpeg"> <source src="sound.ogg" type="audio/ogg"> 您的浏览器不支持 audio 元素。 </audio>
关键点:
-
sound.m4a必须是 MP4 容器封装的 AAC(可用ffmpeg -i input.aac -c copy -f mp4 output.m4a转) -
type="audio/mp4"比audio/x-m4a更稳妥,主流浏览器识别更一致 - 保留
.mp3和.ogg作为 fallback,尤其照顾旧版 Firefox 或某些 Linux 发行版 - 不要省略 fallback 文案,否则低版本浏览器里连提示都没有
实在只有裸 .aac 怎么办:Web Audio API 解码
如果你拿到的是 IoT 设备直推的 ADTS 流、或无法重封的 .aac 文件,<audio></audio> 标签走不通,必须换 Web Audio API 手动解码。
注意限制:
-
AudioContext.decodeAudioData()只接受完整、一次性的 ADTS 数据(不能是分块流) - 不支持边下边播;实时流需用
AudioWorklet+ 自定义解码器,复杂度高得多 - 必须确保响应头含
Access-Control-Allow-Origin,否则 fetch 会失败
最小可行示例:
fetch('stream.aac')
.then(r => r.arrayBuffer())
.then(buf => {
const ctx = new (window.AudioContext || window.webkitAudioContext)();
return ctx.decodeAudioData(buf);
})
.then(audioBuf => {
const src = ctx.createBufferSource();
src.buffer = audioBuf;
src.connect(ctx.destination);
src.start();
});
服务端响应头检查清单
哪怕格式和路径全对,漏掉下面任意一项,<audio></audio> 都可能哑火:
-
Content-Type必须为audio/mp4(.m4a)或audio/mpeg(.mp3)等标准类型,不能是application/octet-stream或audio/aac -
Access-Control-Allow-Origin: *(开发期)或具体域名(生产) - 如果用了
credentials: true,还需加Access-Control-Allow-Credentials: true
验证方式:DevTools → Network → 点击音频请求 → 查看 Response Headers。没有这两项,前端再怎么写 JS 也白搭。


















