从webAudio/mozAudio获取原始PCM数据

Shr*_*low 11 javascript html5 web-audio-api

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

MrG*_*mez 6

除了尝试以某种程序化方式捕获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!');
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 由于API的变化没有原生的跨浏览器解决方案我最终做到了这一点.使用C++使用libLame和libMpg123为Node.js编写自定义模块,并将它与Audiolib.js混合:-)运行相当不错node.js中的服务器端:-)我的工作是什么.使用libmpg123网桥获取示例audiolib.js混合em和liblame重新编码它们并保存为输出或流式传输:-),经过一些完成后我将推送它在git上. (2认同)
  • 这里显示的代码不起作用!nodejs中没有audioContext.Nodejs只是V8,它不是一个完整的浏览器,因此nodejs中没有HTML5 api. (2认同)