12

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

4

4 回答 4

6

除了尝试以某种编程方式捕获网络音频之外,这里的要求并没有很好的意义。这里的假设是您希望通过在当前正在浏览的页面上以 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!');
        });
    }
}

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

这有效地decodeAudioDataWeb Audio API中提取出来,从提供的 PCM 解码data,然后尝试将其保存到目标saveLocation。很简单,真的。

于 2012-04-08T22:30:05.410 回答
4

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

您使用它的方式与常规 AudioContext 完全相同,但有一个额外的startRendering()方法来触发离线渲染,以及一个oncomplete回调,以便您可以在完成渲染时采取行动。

于 2013-01-17T05:09:48.480 回答
2

Chrome 应该支持它(或者至少,大部分支持这个新功能)。

decodeAudioData()

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

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

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

于 2012-04-08T22:21:41.197 回答
0

我认为您正在寻找的内容可以通过 Web Audio 中的 startRendering-function 来实现。我不知道上面的答案是否有效,但如果他们没有 - 这里有一些东西可以让你继续前进:

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

这部分仍然没有记录,因此在规范中无处可见,但您可以 console.log 音频上下文以确认它确实存在。我只对它进行了一些初步测试,但我认为它应该是您问题的答案。

于 2012-04-24T10:24:13.480 回答