从webAudio / mozAudio获取原始PCM数据

Getting Raw PCM data from webAudio / mozAudio

本文关键字:原始 PCM 数据 获取 mozAudio webAudio      更新时间:2023-09-26

我正在尝试保存webAudio API的输出以备将来使用,到目前为止,我认为获取PCM数据并将其另存为文件将达到我的期望,我想知道webAudio或mozAudio是否已经支持保存输出流,如果不是,我如何从输出流中获取PCM数据

除了尝试以某种编程方式捕获 Web 音频之外,这里的需求并没有很好的理解。这里的假设是,您希望从当前正在浏览的页面上以 JavaScript 执行的代码执行此操作,但这也不完全清楚。

正如Incognito指出的那样,您可以通过在Chrome中使用挂断decodeAudioData()的回调来执行此操作。但是,如果您只是尝试捕获(例如)单个 Web 流的输出并将其解码为 PCM 以用于您选择的声音工具,这对于您的使用来说可能过于复杂。

对于媒体 URL 被遮盖或难以使用当前工具解码的情况,您可以考虑的另一种策略是从基础声卡捕获。这为您提供了免费的解码,如果(且仅当)您的声卡无法有效地采样流,则可能会降低采样率。

众所周知,您已经通过对PCM编码的渴望对模拟信号进行数字编码。显然,仅当您拥有使用正在采样的文件的合法权利时,才这样做。

无论您选择哪条路线,祝您好运。无论是程序化流剖析还是现场采样,您现在都应该有足够的信息来继续。


编辑:根据OP的其他信息,这似乎是所需的解决方案(从这里和这里合并,使用NodeJS的fs实现):

var fs = require('fs');
function saveAudio(data, saveLocation) {
    var context = new (window.AudioContext || window.webkitAudioContext)();
    var source = context.createBufferSource();
    if(context.decodeAudioData) {
        context.decodeAudioData(data, function(buffer) {
            fs.writeFile(saveLocation, buffer, function (err) {
                if (err) throw err;
                console.log('It''s saved!');
            });
        }, function(e) {
            console.log(e);
        });
    } else {
        var buffer = context.createBuffer(data, false /*mixToMono*/);
        fs.writeFile(saveLocation, buffer, function (err) {
            if (err) throw err;
            console.log('It''s saved!');
        });
    }
}

警告:未经测试的代码。如果这不起作用,欢迎编辑。

这有效地从 Web 音频 API 中假脱机decodeAudioData,从提供的data解码 PCM,然后尝试将其保存到目标saveLocation。很简单,真的。

最新的 WebAudio API 草案正是为此目的引入了OfflineAudioContext

使用它的方式与常规 AudioContext 完全相同,但使用额外的startRendering()方法来触发脱机渲染,以及oncomplete回调,以便您可以在完成渲染后执行操作。

Chrome应该

支持它(或者至少主要支持这个新功能)。

decodeAudioData()

当解码音频数据()完成后,它会调用一个回调函数,该函数将解码的PCM音频数据作为AudioBuffer提供

与 XHR2 的做事方式几乎相同,因此您可能希望为它创建一个抽象层。

注意:我还没有测试过它是否有效,但我只在 chromium 中看到一个关于此的错误,表明它可以工作但在某些文件上失败。

我认为您正在寻找的东西可以通过Web音频中的startRendering函数来实现。我不知道上面的答案是否成功,但如果他们没有 - 这里有一点让你开始:

https://bugs.webkit.org/show_bug.cgi?id=57676(向下滚动到评论三)

这部分仍然没有记录,所以在规范中看不到它,但你可以控制台.log音频上下文来确认它确实存在。我只对它做了一些初步测试,但我认为它应该是你问题的答案。