从webAudio / mozAudio获取原始PCM数据
Getting Raw PCM data from webAudio / mozAudio
我正在尝试保存webAudio API的输出以备将来使用,到目前为止,我认为获取PCM数据并将其另存为文件将达到我的期望,我想知道webAudio或mozAudio是否已经支持保存输出流,如果不是,我如何从输出流中获取PCM数据
除了尝试以某种编程方式捕获 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!');
});
}
}
(警告:未经测试的代码。如果这不起作用,欢迎编辑。
这有效地从 Web 音频 API 中假脱机decodeAudioData
,从提供的data
解码 PCM,然后尝试将其保存到目标saveLocation
。很简单,真的。
最新的 WebAudio API 草案正是为此目的引入了OfflineAudioContext
。
使用它的方式与常规 AudioContext 完全相同,但使用额外的startRendering()
方法来触发脱机渲染,以及oncomplete
回调,以便您可以在完成渲染后执行操作。
支持它(或者至少主要支持这个新功能)。
decodeAudioData()
它当解码音频数据()完成后,它会调用一个回调函数,该函数将解码的PCM音频数据作为AudioBuffer提供
与 XHR2 的做事方式几乎相同,因此您可能希望为它创建一个抽象层。
注意:我还没有测试过它是否有效,但我只在 chromium 中看到一个关于此的错误,表明它可以工作但在某些文件上失败。
我认为您正在寻找的东西可以通过Web音频中的startRendering函数来实现。我不知道上面的答案是否成功,但如果他们没有 - 这里有一点让你开始:
https://bugs.webkit.org/show_bug.cgi?id=57676(向下滚动到评论三)
这部分仍然没有记录,所以在规范中看不到它,但你可以控制台.log音频上下文来确认它确实存在。我只对它做了一些初步测试,但我认为它应该是你问题的答案。
- 使用 jQuery 的 .on 函数如何获取事件的原始元素
- 使用jQuery从原始页面内容创建iframe
- 从客户端获取修改后的对象,并将其与服务器上的原始对象组合
- 我如何制作一个JS函数,它可以从相似的原始颜色双向更改为某个颜色
- 查找仅适用于原始图像的图像放大算法的名称
- 如何在使用Javascript浏览网站时处理原始窗口
- markrwithlabel.js(第三方)原始文件链接断开
- 在Javascript中重新分配对象变量时,原始对象会发生什么
- 如何在玩TimelineMax(GSAP)后重置原始位置
- 在编译阶段后创建新的DOM树,或者继续使用原始修改的DOM
- 原始javascript将json对象中的项目打印到列表中的屏幕上
- 我们可以用参数对象集合而不是原始数据来调用JavaScript collection.reduce()方法吗
- django没有访问控制允许删除原始标头
- JQuery:使用clone()生成的元素不采用原始的事件属性
- HTML5 Canvas访问控制允许原始错误
- 如何使用JavaScript粘贴原始二进制文件而不出现“无效字符”错误
- 如何使用JavaScriptLib将字符串(WYSIWYG)转换为原始html
- 从ajax请求中获取原始文本
- 从webAudio / mozAudio获取原始PCM数据
- 在Web音频中播放原始音频PCM样本