因此,我已经从一个AudioBuffer中提取了通道数据,并通过可传输对象发送给了一个网络工作者,对其进行了一些处理,现在我想把它放回去。我真的要像这样把它复制回来吗?
var myData = new Float32Array(audioBuf.length);
var chanData = audioBuf.getChannelData(0);
for ( var n = 0; n < chanData.length; n++ ) {
chanData[n] = myData[n];
}我真的希望有一些方法来改变ArrayBuffer,每个AudioBuffer通道引用。就像..。
audioBuf.channel[0].buffer = myData.buffer;...would是非常简单和有效的,但似乎并不存在。是否有任何方式像这样改变引用和避免复制数据?
编辑:通过对的进一步研究,我发现将web音频API与可传输对象一起使用的问题更加恼人。当您将数组缓冲区传输给工作人员时,AudioBuffer的底层数组缓冲区将被清除,我认为甚至不可能通过getChannelData返回的Float32Array进行复制操作。我现在看到完成我想要的事情的唯一方法是放弃原始的AudioBuffer,创建一个全新的AudioBuffer,然后将我的数据复制到其中。真的??
发布于 2014-02-24 08:34:00
我们最近在AudioBuffer上添加了两个新方法,使用copyFromChannel可能对您有用。它按照它在tin上说的做(将一个ArrayBuffer放在一个AudioBuffer的通道中),可能在过程中保存一个副本(避免复制的原因和条件被解释为这里)。
我相信它目前只在Firefox中实现,但我还没有检查。
发布于 2015-09-17 23:35:57
我一整天都在为这个而挣扎,所以我想我应该分享我的解决方案。
var PCM = [0,1,2,3,4,5,6,7,8,9,8,7,6,5,4,3,2,1];
var room = new window.AudioContext();
var sampleRate = 44100;
var channels = 1;
var audioBuffer = room.createBuffer(channels, 0, sampleRate);
var channelObject = audioBuffer.getChannelData(0);
var audioBufferDataArray = channelObject.data;
// actual code to set the data
audioBuffer.length = PCM.length; // optional
for(var i=0; i<PCM.length; i++){
audioBufferDataArray[i] = PCM[i];
}发布于 2018-04-26 03:44:06
你离我太近了!您想要的方法是AudioBuffer.copyToChannel()。
这将将您的Float32Array复制到音频缓冲区节点,如下所示:
var myData = new Float32Array(audioBuf.length);
//copy mydata to first channel
audioBuf.copyToChannel( myData , 0 , 0 );在文档的深处:
https://developer.mozilla.org/en-US/docs/Web/API/AudioBuffer/copyToChannel
希望这能帮助
https://stackoverflow.com/questions/21957824
复制相似问题