手动将 pcm 数据放入 AudioBuffer

Rob*_*opp 5 javascript web-audio-api

所以我已经从 an 中取出通道数据AudioBuffer并通过可传输对象将它发送给网络工作者对其进行一些处理,现在我想把它放回去。我真的必须像这样复制它吗?

var myData = new Float32Array(audioBuf.length);
var chanData = audioBuf.getChannelData(0);

for ( var n = 0; n < chanData.length; n++ ) {
    chanData[n] = myData[n];
}
Run Code Online (Sandbox Code Playgroud)

我真的希望有某种方法可以更改ArrayBuffer每个AudioBuffer频道参考。就像是...

audioBuf.channel[0].buffer = myData.buffer;
Run Code Online (Sandbox Code Playgroud)

...会非常简单有效,但似乎不存在。有没有这样的方法来更改引用并避免复制数据?

编辑:通过进一步调查,我发现将 Web 音频 API 与可传输对象一起使用的问题更加烦人。当您将数组缓冲区传输给工作程序时,底层数组缓冲区将AudioBuffer被清除,我相信即使通过Float32Array返回的复制操作也是getChannelData不可能的。我现在可以看到完成我想要的唯一方法是放弃原始的AudioBuffer,创建一个全新的AudioBuffer,然后将我的数据复制到其中。真的??

Kev*_*nis 2

一些东西:

1)有一种相当低成本的方法可以将数据从一个类型化数组复制到另一个类型化数组,并且不需要您经历令人头痛的循环。

var copy = new Float32Array(orig.length);
copy.set(orig);
Run Code Online (Sandbox Code Playgroud)

2)AudioBuffer被清除的问题只是网络工作者可传输对象规范的一部分(https://developer.mozilla.org/en-US/docs/Web/Guide/Performance/Using_web_workers#Passing_data_by_transferring_ownership_(transferable_objects))。这是他们保证线程安全的唯一方法。如果两个线程同时访问同一个对象,它们都可能会改变它,最终会导致各种疯狂。

AudioBuffer我不完全确定为什么您对创建新的并将数据复制到其中的前景如此恼火。对于单声道缓冲区,您可以用 2 行来完成此操作。3 条立体声线。通过设置启动和运行 Web Worker 所需的所有样板文件,您已经完成了更多的工作。

无论如何,如果您可以提供有关您的应用程序及其正在执行的操作的更多详细信息,我很乐意提出一些建议。