使用 Web Audio API 进行离线/非实时渲染

Posted

技术标签:

【中文标题】使用 Web Audio API 进行离线/非实时渲染【英文标题】:Offline / Non-Realtime Rendering with the Web Audio API 【发布时间】:2012-11-27 18:48:46 【问题描述】:

问题

我正在开发一个网络应用程序,用户可以在该应用程序中对音频样本进行排序,并可选择将效果应用于他们使用网络音频 API 创建的音乐模式。模式存储为 JSON 数据,我想对每个模式服务器端的渲染音频进行一些分析。据我所知,这给我留下了两个选择:

    在服务器端运行我自己的渲染代码,尝试使其尽可能忠实于浏览器内的渲染。也许我什至可以从 Chromium 项目中提取 Web Audio 代码并对其进行修改,但这似乎需要大量工作。

    在客户端进行渲染,希望比实时更快,然后将渲染的音频发送到服务器。这是理想的(并且 DRY),因为只有一个引擎用于模式渲染。

可能的解决方案

This question 将我带到this code sample in the Chromium repository,这似乎表明离线处理是可能的。诀窍似乎是用一些参数构造webkitAudioContext(通常使用零参数构造函数)。以下是我对参数含义的猜测:

new webkitAudioContext(2,          // channels
                       10 * 44100, // length in samples
                       44100);     // sample rate

我稍微修改了示例,并在 Windows、Mac 和 Linux 上的 Chrome 23.0.1271.91 中对其进行了测试。 Here's the live example,以及结果(打开 Dev Tools javascript 控制台查看发生了什么):

Mac - 有效!! Windows - 失败 - SYNTAX_ERR:DOM 异常 12 Linux - 失败 - SYNTAX_ERR:DOM 异常 12

我上面描述的 webkitAudioContext 构造函数在 Windows 和 Linux 上会导致异常。

我的问题

离线渲染对于我正在尝试做的事情来说是完美,但我在任何地方都找不到文档,而且支持也不太理想。有没有人有这方面的更多信息?我应该期待很快在 Windows 和/或 Linux 中对此提供支持,还是应该期待很快在 Mac 上消失支持?

【问题讨论】:

webkitAudioContext 构造函数在 Mac 上的 Chrome 23.0.1271.101 中失败。当前的 Canary 说在使用参数构造时使用 OfflineAudioContext 而不是,但是当我这样做时,它仍然说引用错误,因为 OfflineAudioContext 实际上还没有实现(我想)。我认为规格 ATM 仍有可能发生变化。 OfflineAudioContext 仍然是前缀,所以现在是webkitOfflineAudioContext。这适用于 Chrome。 w3.org/TR/webaudio/#OfflineAudioContext-section(目前最好的文档) 【参考方案1】:

几个月前我对此进行了一些研究,并且在 audioContext 上有一个 startRendering 函数,但谷歌的人告诉我,当时的实现是由于更改。我认为这还没有发生,它仍然不是官方文档的一部分,所以我会小心构建一个依赖它的应用程序。

当前实现的渲染速度也不比实时快(在非常轻量级的应用程序中可能稍微快一点),有时甚至比实时慢。

如果您需要非实时渲染,最好的办法是深入研究并在服务器端实施 Web Audio。如果您可以使用实时渲染,那么https://github.com/mattdiamond/Recorderjs 上的一个项目可能会很有趣。

请注意,我自己不是谷歌用户,我被告知的内容绝不是承诺。

【讨论】:

是的,这种方法是非官方的并且在不断变化。相关的 SO 问题以及更多信息:***.com/questions/8074152/…

以上是关于使用 Web Audio API 进行离线/非实时渲染的主要内容,如果未能解决你的问题,请参考以下文章

离线处理——文件加载,非实时算法

使用 Web Audio API 和 Wrtc 进行远程音频处理

Audio Unit 介绍

如何使用 Web Audio API 移动/调制音频缓冲频率

如何在没有 Web Audio API 的情况下直接从 ArrayBuffer 获取通道数据?

使用 Web Audio API 为声音的开头添加静音 [关闭]