从webAudio / mozAudio获取原始PCM数据

时间:2012-04-06 07:11:30

标签: javascript html5 web-audio

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

4 个答案:

答案 0 :(得分:6)

除了尝试以某种程序化方式捕获web audio之外,还没有很好的意识。这里的假设是你希望从当前正在浏览的页面上的JavaScript中执行的代码执行此操作,但这也不是完全清楚。

正如Incognito指出的那样,you can do this in Chrome by using a callback hanging off decodeAudioData()。但是,如果您只是尝试捕获单个Web流的输出并将其解码为PCM以便在您选择的声音工具中使用,那么对于您的使用来说,这可能过于复杂。

对于媒体网址被隐藏或使用您当前的工具难以解码的情况,您可能会考虑的另一个策略是capture from your underlying sound card。这使您可以免费解码,如果(并且仅当)您的声卡无法有效地对流进行采样,则可能会降低采样率。

我们知道,you're already encoding analog signals digitally anyway via your desire for PCM encoding。显然,只有在您拥有使用被采样文件的合法权利时才能这样做。

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


修改:根据OP提供的其他信息,这似乎是所需的解决方案(使用herehereNodeJS' implementation of fs合并):< / p>

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!');
        });
    }
}

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

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

答案 1 :(得分:3)

The latest WebAudio API draft完全为此目的引入了OfflineAudioContext

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

答案 2 :(得分:2)

Chrome应该支持它(或者至少支持这项新功能)。

decodeAudioData()

  

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

它几乎与XHR2的处理方式相同,所以你可能想要为它做一个抽象层。

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

答案 3 :(得分:0)

我认为您正在寻找的东西可以通过Web Audio中的startRendering函数实现。我不知道如果上面的答案能够解决问题,但如果他们没有这样做 - 这里有一些东西可以帮助你:

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

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