我正在尝试保存webAudio API的输出以供将来使用,到目前为止我认为获取PCM数据并将其保存为文件将符合我的期望,我想知道webAudio或mozAudio是否已经支持保存输出流不是如何从输出流中获取pcm数据
答案 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提供的其他信息,这似乎是所需的解决方案(使用here从here和NodeJS' 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()完成时,它调用一个回调函数,它将解码的PCM音频数据作为AudioBuffer提供
它几乎与XHR2的处理方式相同,所以你可能想要为它做一个抽象层。
注意:我没有测试它是否有效,但我只看到铬中有一个关于此的错误,表明它可以正常工作但某些文件失败。
答案 3 :(得分:0)
我认为您正在寻找的东西可以通过Web Audio中的startRendering函数实现。我不知道如果上面的答案能够解决问题,但如果他们没有这样做 - 这里有一些东西可以帮助你:
https://bugs.webkit.org/show_bug.cgi?id=57676(向下滚动以评论三条)
这部分仍然没有记录,因此在规范中无处可见,但你可以在console.log音频上下文中确认它实际存在。我只用它进行了一些初步测试,但我认为这应该是你问题的答案。