javascript - 如何在网络音频 API 中反向播放但同时保留正向版本?

标签 javascript html google-chrome web-audio-api audiobuffer

据我所知,谷歌浏览器 (v21) 中的网络音频 API 不支持以下内容:

    source.playbackRate.value = -1; 

非常希望!我会耐心等待,但与此同时,this post有一个很好的替代解决方案。我已经采用它来尝试反转我自己从 loaded bufferlist 加载的音频样本。 ,希望我可以同时拥有每个加载缓冲区的正向和反向版本,如下所示:

    function finishedLoading(bufferList)  {
        for (var it = 0; it < this.urlList.length; ++it) {  
            storedBuffer[it] = bufferList[it]; // assign bufferList to globals
            storedBufferR[it] = bufferList[it];

            // attempt to reverse storedBufferR only ...
            Array.prototype.reverse.call( storedBufferR[it].getChannelData(0) );
            Array.prototype.reverse.call( storedBufferR[it].getChannelData(1) ); 
        }
    }

上述函数确实反转了播放,但是它反转了“storedbufferR”“storedbuffer”,这样所有缓冲区都被反转了!

所以这就是我迷路的地方...我知道 Array.protoype 会影​​响所有数组,所以我想我可以看到“storedBuffer”如何受到“storedBufferR”上的反向方法的影响。编辑:反向方法只影响有问题的数组

但是否可以重写上述函数以确保 array.protoype 只影响我想要反转的存储缓冲区?如果没有,是否有另一种方法可以同时存储正向和反向版本?

最佳答案

关于共享相同引用的两个 AudioBuffer 的评论是正确的,但解决方案不是创建一个新的 AudioContext;相反,您只需要创建一个新的 AudioBuffer 并克隆包含实际音频样本的底层 Float32Arrays。

例如,此函数将克隆一个 AudioBuffer:

function cloneAudioBuffer(audioBuffer){
    var channels = [],
        numChannels = audioBuffer.numberOfChannels;

    //clone the underlying Float32Arrays
    for (var i = 0; i < numChannels; i++){
        channels[i] = new Float32Array(audioBuffer.getChannelData(i));
    }

    //create the new AudioBuffer (assuming AudioContext variable is in scope)
    var newBuffer = context.createBuffer(
                        audioBuffer.numberOfChannels,
                        audioBuffer.length,
                        audioBuffer.sampleRate
                    );

    //copy the cloned arrays to the new AudioBuffer
    for (var i = 0; i < numChannels; i++){
        newBuffer.getChannelData(i).set(channels[i]);
    }

    return newBuffer;
}

然后,修改上面的...

function finishedLoading(bufferList)  {
    for (var it = 0; it < this.urlList.length; ++it) {  
        storedBuffer[it] = bufferList[it]; // assign bufferList to globals
        storedBufferR[it] = cloneAudioBuffer(bufferList[it]);

        // attempt to reverse storedBufferR only ...
        Array.prototype.reverse.call( storedBufferR[it].getChannelData(0) );
        Array.prototype.reverse.call( storedBufferR[it].getChannelData(1) ); 
    }
}

关于javascript - 如何在网络音频 API 中反向播放但同时保留正向版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12484052/

相关文章:

google-chrome - 如何确保 PC 可以上网然后启动 exec?

javascript - chrome 使用 execCommand 添加回车符 ('copy' )

google-chrome - 选项组中断特殊字符

javascript - 如何更改 JQuery Masonry 中的列数?

javascript - graphQL 解析器不等待 Web API 完成

javascript - 一次又一次在新的同一选项卡中打开网址

javascript - 无法从 Canvas 获取图像数据,因为 Canvas 已被跨源数据污染

html - 菜单在 Chrome 中显示,但在 Safari 中不显示

html - 你如何制作那些新奇的弹出窗口?

html - 将元素 float 到 fieldset 的右上角