Javascript 从webAudio/mozAudio获取原始PCM数据

Javascript 从webAudio/mozAudio获取原始PCM数据,javascript,html,web-audio-api,Javascript,Html,Web Audio Api,我正在尝试保存webAudio API的输出以备将来使用,到目前为止,我认为获取PCM数据并将其保存为文件符合我的预期,我想知道webAudio或mozAudio是否已经支持保存输出流,如果不支持,我如何从输出流获取PCM数据(或者至少,大部分支持此新功能) decodeAudioData()完成后,它调用一个回调函数,该函数将解码的PCM音频数据作为音频缓冲区提供 它与XHR2的工作方式几乎相同,因此您可能需要为它创建一个抽象层 注意:我还没有测试它是否有效,但我在chromium中只看到了

我正在尝试保存webAudio API的输出以备将来使用,到目前为止,我认为获取PCM数据并将其保存为文件符合我的预期,我想知道webAudio或mozAudio是否已经支持保存输出流,如果不支持,我如何从输出流获取PCM数据(或者至少,大部分支持此新功能)

decodeAudioData()完成后,它调用一个回调函数,该函数将解码的PCM音频数据作为音频缓冲区提供

它与XHR2的工作方式几乎相同,因此您可能需要为它创建一个抽象层


注意:我还没有测试它是否有效,但我在chromium中只看到了一个与此相关的bug,表明它对某些文件有效,但失败。

除了尝试以编程方式捕获之外,这里对需求没有很好的理解。这里的假设是,您希望通过在不可用的页面上使用JavaScript执行代码来实现这一点目前正在浏览,但也不完全清楚

正如Incognito指出的,。但是,如果您只是简单地尝试捕获单个web流的输出,并将其解码为PCM,以便在您选择的声音工具中使用,那么这对于您的使用来说可能过于复杂

你可能会考虑的另一种策略,当媒体URL被遮挡或使用你的当前工具难以解码时,这会给你免费的解码,如果你的声卡不能有效地对流进行采样,则可能会以较低的采样率来进行解码。 正如我们所知,。显然,只有当您有合法权利使用正在采样的文件时,才可以这样做

不管你选择哪条路线,祝你好运。无论是程序化的流切割还是点采样,你现在应该有足够的信息继续进行


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

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


这可以有效地从中提取
解码音频数据
,从提供的
数据
中解码PCM,然后尝试将其保存到目标
保存位置
。非常简单。

我认为您所寻找的可以通过Web Audio中的startRendering功能实现。我不知道上面的答案是否正确技巧,但如果他们没有-这里有一个小东西让你去:

(向下滚动至注释三)

这部分仍然没有文档记录,因此在规范中找不到它,但您可以控制台。记录音频上下文以确认它确实在那里。我只对它做了一些初步测试,但我认为它应该是您问题的答案。

正是为此目的引入了


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

我知道decodeAudioData..我想要输出缓冲区!由webAudio APIdecodeAudioData()处理的缓冲区导致标签崩溃与某些文件的Chrome M75。它不准备生产。考虑::我制作一个DJ软件和一些人与它混合,现在的人想记录的混合?这将如何发生??唯一的办法是捕获在音频处理结束处理的数据。有意义吗?@ AB?hishek我明白了:你想让他们直接从工具的输出下载他们的混音,作为与工具本身集成的功能。这是有道理的。我将对此进行研究,看看我能找到什么。:)是的,这正是我想要实现的:-)由于改变了API,所以没有本机跨浏览器解决方案,所以我就这样做了。。用C++编写一个用于NoDE.js的自定义模块,使用LiError和LIMPG123,并与Audiolib.js混合:-)在NoDE.js:-服务器端运行得相当好)-我所做的是。使用libmpg123桥获取示例audiolib.js,以混合em和liblame对它们进行重新编码,并将其另存为输出或流式传输:-),完成后,我将在git上推送它。此处显示的代码不起作用!nodejs中没有音频上下文。Nodejs只是V8,它不是一个完整的浏览器,因此Nodejs中没有可用的html5api。
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!');
        });
    }
}